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

Iptables: «-p udp --state ESTABLISHED»

давайте посмотрим на эти два правила 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 не имеет состояния.

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

На странице руководства мне сказано следующее:

штат

This module, when combined with connection tracking, allows access to the
connection tracking state for this packet.

  --state ...

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

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

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

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

Крис

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

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

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

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

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

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 цепь.

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

Разработчики iptables посчитали, что состояние «ESTABLISHED» - это ситуация, когда пакеты были замечены в обоих направлениях независимо от протокола между двумя клиентами.

расширение штата является частью 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 в течение небольшого промежутка времени, определенного в вашей системе.