Есть сервер, на котором нужно настроить 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?