Назад | Перейти на главную страницу

iptables, ICMP и СВЯЗАННЫЕ

Я использую следующее простое правило iptables, которое принимает Связанный пакеты:

-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Я разрешаю ICMP эхо-запросы пройти с этим другим правилом:

-A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Должен ли я явно добавить что-нибудь для получения «полезных» сообщений ICMP, например destination-unreachable, time-exceeded и parameter-problem, или RELATED статья их уже примет?

http://www.linuxtopia.org/Linux_Firewall_iptables/x1571.html

Другой чрезвычайно важной частью ICMP является тот факт, что он используется, чтобы сообщить хостам, что произошло с конкретными соединениями UDP и TCP или попытками соединения. По этой простой причине ответы ICMP очень часто распознаются как СВЯЗАННЫЕ с исходными соединениями или попытками соединения. Простым примером может быть узел ICMP недоступен или сеть ICMP недоступна. Они всегда должны возвращаться к нашему хосту, если он пытается безуспешно подключиться к какому-либо другому хосту, но рассматриваемая сеть или хост могут быть недоступны, и, следовательно, последний маршрутизатор, пытающийся связаться с рассматриваемым сайтом, ответит сообщением ICMP с сообщением нам об этом. В этом случае ответ ICMP рассматривается как СВЯЗАННЫЙ пакет.

Правило RELATED по умолчанию позаботится о связанных сообщениях ICMP. Из страница руководства iptables, в разделе, посвященном Conntrack (http://linux.die.net/man/8/iptables):

СВЯЗАНО означает, что пакет начинает новое соединение, но связан с существующим соединением, таким как передача данных FTP или Ошибка ICMP.

Conntrack сообщает о следующих состояниях:

  • НЕВЕРНЫЙ означает, что пакет связан с неизвестным соединением.
  • УСТАНОВЛЕН означает, что пакет связан с соединением, которое принимает пакеты в обоих направлениях.
  • NEW означает, что пакет начал новое соединение или иным образом связан с соединением, которое не видел пакетов в обоих направлениях
  • SNAT Виртуальное состояние, соответствующее, если исходный адрес источника отличается от получателя ответа.
  • DNAT Виртуальное состояние, соответствующее, если исходный пункт назначения отличается от источника ответа.

Вы можете просматривать и управлять таблицей conntrack, используя conntrack пакет.

$ sudo conntrack -L

В общем, очень плохая идея фильтровать или блокировать icmp, обычно единственный «действительный» бит icmp для фильтрации - это эхо-запрос, чтобы «появиться» в наивном сканировании.

Но если вы хотите явно разрешить его части, вам не хватает как минимум двух очень важных бит, необходимой фрагментации и Source Quench:

-A INPUT -p icmp --icmp-type fragmentation-needed -m state --state NEW -j ACCEPT
-A INPUT -p icmp --icmp-type source-quench -m state --state NEW -j ACCEPT

Позвольте мне еще раз сказать вам, что фильтрация icmp - плохая идея, которая маскирует проблемы и затрудняет их обнаружение.

Это была проблема с DF (не фрагментировать) и необходимостью фрагментации, которая необходима для автоматического обнаружения PTMU, и вызвала недоступность сайтов, потому что промежуточные межсетевые экраны / маршрутизаторы отбрасывали пакеты icmp, объявляющие конечную точку, чтобы снизить MTU.

Я добавлю свой собственный ответ, чтобы предоставить свою окончательную конфигурацию, вдохновленную другими ответами и следующими источниками:

  1. ан просроченный черновик IETF с полезной таблицей, которая показывает, какие типы ICMP разрешают, запрещают или ограничивают скорость;
  2. другая страница с минимумом строк для iptables и Cisco IOS;
  3. третий ресурс который использует RELATED:

    iptables -P INPUT DROP
    iptables -A INPUT -p icmp --fragment -j DROP
    iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    

ICMP - очень важный протокол соединения. «Эхо-запрос» - единственное важное полезное сообщение, которое помогает общаться. Остальные из них, включая «пункт назначения недоступен», можно безопасно заблокировать, особенно если приложение, которое вы запускаете, получает большое количество неизвестных попаданий.

Тебе лучше с чем-то вроде этого,

-A INPUT -p icmp --icmp-type echo-request -m recent --set 
-A INPUT -p icmp --icmp-type echo-request -m recent --update --seconds 1 --hitcount 30 -j DROP 

-A INPUT -p icmp --icmp-type echo-request -j ACCEPT
-A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

-A OUTPUT -p icmp --icmp-type destination-unreachable -j DROP
-A INPUT -p icmp -j DROP

Это будет не только принимать «эхо-запрос», но также блокировать эхо-запросы, превышающие 30 пакетов / с. Все, что вы хотите добавить, должно быть явно принято, потому что предложение RELATED не получит их, пока соединение будет установлено путем его ввода.