Iptables: «-p udp - СОСТОЯНИЕ УСТАНОВЛЕНО»

18

давайте посмотрим на эти два правила iptables, которые часто используются для разрешения исходящих DNS:

iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 
   -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -p udp --sport 53 --dport 1024:65535
   -m state --state ESTABLISHED -j ACCEPT

Мой вопрос: как именно я должен понимать состояние ESTABLISHED в UDP? UDP не имеет состояния.

Вот моя интуиция - я хотел бы знать, если или где это неправильно:

Страница руководства говорит мне это:

государство

Этот модуль, в сочетании с отслеживанием соединения, обеспечивает доступ к
состояние отслеживания соединения для этого пакета.

  --государство ...

Итак, iptables в основном запоминает номер порта, который использовался для исходящего пакета (что еще он может запомнить для UDP-пакета?) , А затем разрешает первый входящий пакет, который отправляется обратно в течение короткого периода времени? Злоумышленник должен угадать номер порта (это будет слишком сложно?)

О том, как избежать конфликтов:

Ядро отслеживает, какие порты заблокированы (другими службами или предыдущими исходящими UDP-пакетами), чтобы эти порты не использовались для новых исходящих DNS-пакетов в течение определенного периода времени? (Что произойдет, если я случайно попытаюсь запустить службу на этом порту в течение определенного периода времени - будет ли эта попытка отклонена / заблокирована?)

Пожалуйста, найдите все ошибки в приведенном выше тексте :-) Спасибо,

Крис

Крис Лерчер
источник

Ответы:

12

Итак, iptables в основном запоминает номер порта, который использовался для исходящего пакета (что еще он мог запомнить для пакета UDP?),

Я уверен, что для UDP сохранены исходные и целевые порты и адреса.

Если вы хотите проверить таблицы состояний, установите conntrack и / или netstat-nat.

(Что произойдет, если я случайно попытаюсь запустить службу на этом порту в течение определенного периода времени - будет ли эта попытка отклонена / заблокирована?)

Поскольку вы используете OUTPUT и INPUT, вы говорите о местных услугах. Порт уже используется. Я не верю, что ваша система позволит вам запустить другую службу, поскольку что-то уже прослушивает этот порт. Я думаю, вы могли бы остановить первую службу и запустить другую, если бы вы действительно этого хотели, в этом случае ответ, вероятно, дойдет до вашей службы. То, что служба делает с пакетом, зависит от содержимого пакета и от того, что это за услуга.

Zoredache
источник
Поэтому, если я начну использовать экземпляр Tomcat на порту 8080, у меня будет шанс 1: (65535-1023), что запуск завершится неудачно, если случайно DNS-запрос будет запущен на том же порту? Или он просто подождет, пока не истечет срок? Как долго это таймфрейм по умолчанию?
Крис Лерчер
6
В Linux я считаю, что диапазон временных портов обычно составляет 32768-61000 (см. / Proc / sys / net / ipv4 / ip_local_port_range), это не будет включать ваш примерный порт 8080. Это очень необычно для настройки служб для прослушивания портов в пределах эфемерного диапазона. Время записи состояния UDP в таблице обычно составляет 30 секунд (см. / Proc / sys / net / netfilter / nf_conntrack_udp_timeout)
Zoredache
2
+1 Спасибо, особенно за пути / proc!
Крис Лерчер
1
Если кто-то захочет продлить udp_timeout, используйтеecho "net.netfilter.nf_conntrack_udp_timeout = 180" >> /etc/sysctl.conf
Kiran
8

NB: Этот ответ был отредактирован.

Несмотря на то, что написано ESTABLISHEDв справочных страницах, похоже, что они означают «состояние». Для UDP это просто означает (как вы предлагаете) на некоторое время запомнить каждый исходящий пакет UDP (кортеж "src ip, src port dst ip, dst port") и распознать его ответы.

FWIW, мои нормальные правила для трафика DNS будут примерно такими:

# permit any outbound DNS request (NB: TCP required too)
iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53  -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 --dport 53  -j ACCEPT

# accept any packet that's a response to anything we sent
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

т.е. контролировать трафик в OUTPUTцепочке, а затем позволить iptablesмодулям состояния обрабатывать все остальное в INPUTцепочке.

Смотрите также этот связанный вопрос .

Альнитак
источник
1
Я знаю, что я должен разрешить TCP тоже. Но что RELATED будет означать для UDP? Manpage: «RELATED означает, что пакет запускает новое соединение, но связано с существующим соединением, ...» Соединения для UDP? Может быть, это действительно имеет больше смысла, чем ESTABLISHED, но это то, что я хотел бы узнать.
Крис Лерчер
Когда я использую ваши правила, но ограничиваю UDP INPUT значением RELATED, мои DNS-запросы не работают. Кажется, я должен разрешить установить. Есть ли причина также разрешать RELATED (для UDP)?
Крис Лерчер
хорошо, кажется, что ESTABLISHED означает больше, чем говорит man-страница. В любом случае, если вы используете выходные фильтры, такие как мой, и не принимаете трафик inbonud, то это правило INPUT - единственное, которое вам когда-либо понадобится.
Альнитак
1
Учитывая то, что мы нашли, СВЯЗАННЫЕ пакеты udp не существуют AFAIK. Однако (например), если вы когда-либо выполняете исходящий FTP из этого ящика, вам нужно СВЯЗАННОЕ правило состояния для канала данных. Единственное правило «ESTABLISHED, RELATED» является AFAIK наиболее оптимальным правилом для входного трафика.
Альнитак
1
на самом деле, RELATEDUDP-пакеты могут существовать для RTP.
Альнитак
1

Разработчики iptables считают, что состоянием «УСТАНОВЛЕНО» была ситуация, когда пакеты просматривались в обоих направлениях независимо от протокола между двумя клиентами.

расширение штата является частью conntrack. Ядро понимает состояние из таблицы

/proc/net/nf_conntrack

Пример iptable-состояний для UDP в таблице nf_conntrack с точки зрения отправителя. Представим, что вы отправляете DNS-запрос по UDP.

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
 [UNREPLIED] src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

Пакет отправлен. Это не отвечает и, о, таблица содержит данные о том, что ожидается в ответ (пакет для ответа DNS).

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
  src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

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

Николя Геренет
источник