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