LINUX.ORG.RU
ФорумAdmin

iptables: разрешить пакеты для соединений, инициированных сервером

 , ,


0

2

Есть сервер, на котором нужно настроить iptables так, чтобы сервер мог инициировать tcp-соединения и принимать ответы на них. Наиболее распространенный способ в разных туториалах для этого сделать это использовать –state:

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Насколько я понимаю, таким образом iptables запоминает в специальной таблице инициированные соединения, и если полученный пакет соответствует какой-то из записей в таблице, то пакет принимается.

Также я наткнулся на такой вариант, в котором, насколько я вижу, не требуется запоминать никаких соединений. Просто все пакеты, в которых установлен только флаг SYN, отбрасываются, а остальные (которые должны быть, вроде, как раз ответами на инициированные сервером соединения) принимаются.

-A INPUT -p tcp -m ! --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT

Тогда, если сервер не инициировал никаких соединений на каком-то порту, а на него, к примеру, пришел пакет с флагом ACK, то iptables его пропустит, но раз на сервере нет сокетов, которые бы ожидали данного пакета, то он все равно будет отброшен, разве нет? То есть получается то, что нужно.

Собственно, вопрос, хочу понять какие проблемы могут быть со вторым подходом, и используется ли на практике такой подход? И нужен ли в данном случае тогда stateful firewall?


Я бы сказал, если нет веских причин экономить каждый байт памяти и цикл CPU, то не стоит отказываться от stateful. Это удобно, надёжно, меньше вероятность ошибок в правилах.

iptables запоминает в специальной таблице инициированные соединения

Часть ядра, отвечающая за эту таблицу, называется conntrack или ct. И оно работает не совсем так, и иногда совсем не так, всё зависит от протокола, особенно когда соединений как таковых нет.

anonymous
()

-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

Это правило, пропускает пакеты для установленных соединений, см. # conntrack -L

Разрешающие правила для исходящих соединений сервера, лучше размещать в цепочке OUTPUT

anonymous
()
Ответ на: комментарий от mky

Наверное я не совсем ясно выразился, но я не имел в виду, что сервер должен уметь инициировать только tcp-соединения. Можно добавить же отдельные правила для dns и icmp. Меня просто в данном случае интересовали именно правила для tcp.

ftr
() автор топика