Лучше ли установить -j REJECT или -j DROP в iptables?

33

Вот пример правил iptables в archlinux wiki:

# Generated by iptables-save v1.4.18 on Sun Mar 17 14:21:12 2013
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
COMMIT
# Completed on Sun Mar 17 14:21:12 2013

Несколько дней назад мой друг спросил меня, почему REJECTв последних трех правилах. Он сказал мне, что должно быть DROPвместо этого, и он упомянул кое-что о лучшей безопасности в случае DROP.

Итак, у меня есть два вопроса:

  1. Что делают три правила?

  2. Имеет ли какое-то значение, когда я положил туда DROPна место REJECT --reject-with? Если да, в чем разница?

Михаил Морфиков
источник
3
Аналогичный вопрос по информационной безопасности : отклонить IP-пакеты с ошибкой ICMP или просто отбросить их?
Жиль "ТАК - перестань быть злым"

Ответы:

33

Что делают три правила?

Эти 3 правила кажутся довольно очевидными:

  1. Отклонить входящие пакеты UDP с сообщением ICMP «Порт недоступен»
  2. Отклонить входящие TCP-пакеты с помощью «сброса tcp»
  3. Отклонить входящие пакеты (любого другого протокола) с сообщением ICMP «Протокол недоступен»

Если вам нужна более подробная информация (о пакетах UDP / TCP, ICMP), вам нужно изучить сетевые документы и, возможно, man iptablesтоже.

Есть ли какая-то разница, когда я ставлю туда DROP вместо REJECT --reject-with? Если да, может кто-нибудь объяснить мне разницу, я буду очень признателен.

Это имеет значение. И вопреки распространенному мнению, DROPне дает лучшую безопасность, чем REJECT. Это доставляет неудобства законным пользователям и фактически не защищает от злонамеренных. Этот пост подробно объясняет причины:

http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject

Обычная причина использования DROP, а не REJECT, состоит в том, чтобы не выдавать информацию о том, какие порты открыты, однако отбрасывание пакетов дает столько же информации, сколько и отклонение.

С помощью REJECT вы выполняете сканирование и классифицируете результаты на «соединение установлено» и «соединение отклонено».

С помощью DROP вы классифицируете результаты на «соединение установлено» и «время ожидания истекло».

Самый простой сканер будет использовать вызов "connect" операционной системы и будет ждать, пока одна попытка подключения не будет завершена, прежде чем начинать следующую. Этот тип сканера будет значительно замедлен, отбрасывая пакеты. Однако, если атака устанавливает время ожидания 5 секунд для каждой попытки подключения, можно сканировать каждый зарезервированный порт (1..1023) на машине всего за 1,5 часа. Сканирование всегда автоматизировано, и злоумышленнику все равно, что результат не мгновенный.

Более сложный сканер будет отправлять пакеты сам, а не полагаться на реализацию TCP операционной системы. Такие сканеры быстры, эффективны и безразличны к выбору REJECT или DROP.

ВЫВОД

DROP не создает эффективного барьера для враждебных сил, но может значительно замедлить работу приложений, выполняемых законными пользователями. DROP обычно не следует использовать.

Прекратить постоянный вред Монике
источник
@janos - не могли бы вы написать немного больше о том, что на самом деле происходит, когда пакет достигает каждого из трех правил?
Михаил Морфиков
3
@Kiwy - прочитай ссылку и попробуй сам. DROP не дает лучшей безопасности, чем REJECT. Это доставляет неудобства законным пользователям и фактически не защищает от злонамеренных. Это связано с тем, что законные пользователи страдают от медленного соединения в ожидании истечения времени ожидания соединения, а взломщики просто настраивают свои инструменты, чтобы не ожидать истечения времени ожидания. тот факт, что соединение медленное (из-за ожидания ожидания), показывает, что ваш сервер находится там и защищен брандмауэром.
Пантера
2
Я не согласен с таким выводом. Отклонение генерирует ICMP-ответ, который может быть проанализирован. На основании этого анализа хорошие механизмы атаки могут определить используемую ОС. Так что в системе, где все порты известны, сброс может быть лучше. Это относится к серверам в производственной среде.
Нильс
1
Брандмауэр, который только перенаправляет определенные порты, еще лучше. DROP a REJECT - это не то же самое, что абсолютно никакой сервис, работающий на первом месте. Многие сканеры портов помечают ваш хост как потенциальную цель для будущих сканирований в надежде поймать ваш брандмауэр, если они обнаружат там REJECTS или DROPS, так как оба могут быть обнаружены извне. chiark.greenend.org.uk/~peterb/network/drop-vs-reject
Dagelf
1
Обратите внимание, что в цитируемом тексте есть еще один абзац, обновление, в котором говорится, что DROP лучше, если у вас DDoS-атака, которая встречается относительно редко, но когда это случается, вероятно, хорошо иметь ее ... что вы думаете?
Алексис Уилке