Как разрешить исходящий SMTP на iptables Debian Linux

13

Если я решу разрешить весь трафик в цепочке OUTPUT ( iptables -P OUTPUT ACCEPT), почта отправляется нормально. Как только я блокирую свой сервер с этими правилами, исходящая почта перестает работать. Все остальное работает, хотя, что странно.

Кто-нибудь видит здесь что-нибудь, что помешало бы отправке моей исходящей почты? Я в тупике, смотрел на эти правила снова и снова и перепробовал много разных версий.

 iptables -F
 iptables -P INPUT DROP
 iptables -P FORWARD DROP
 iptables -P OUTPUT DROP


 iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

 iptables -A INPUT  -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

 iptables -A INPUT  -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

 iptables -A INPUT -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 443 -m state --state NEW,ESTABLISHED -j ACCEPT

 iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
 iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

 iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
 iptables -A OUTPUT -p tcp --sport 587 -j ACCEPT

 iptables -A OUTPUT  -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

 iptables -A OUTPUT  -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
 iptables -A INPUT  -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

 iptables -A INPUT -i lo -j ACCEPT
 iptables -A OUTPUT -o lo -j ACCEPT

 iptables -A OUTPUT -p udp  --dport 53 -j ACCEPT
 iptables -A INPUT -p udp  --sport 53 -j ACCEPT

 iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
 iptables -A INPUT -p tcp --dport 443 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT


 iptables -N LOGGING
 iptables -A INPUT -j LOGGING
 iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
 iptables -A LOGGING -j DROP
916 сетей
источник

Ответы:

18

У вас есть правило, чтобы пропустить трафик, но у вас нет правила, чтобы пропустить обратный трафик.

Я предполагаю, что вы имели в виду эти 2 правила -A INPUTвместо:

iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 587 -j ACCEPT

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

Намного лучшей идеей было бы удалить все -A INPUT ... --sportправила и использовать вместо этого только это единственное правило:

iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Это правило работает так, что когда ваша система устанавливает исходящее соединение, ядро ​​записывает это соединение в таблицу отслеживания. Затем, когда пакеты из удаленной системы возвращаются, она проверяет, связаны ли эти пакеты с какими-либо соединениями в таблице отслеживания.
Этот ESTABLISHEDбит разрешает трафик, непосредственно связанный с сеансом. Это будут TCP-пакеты, возвращающиеся в поток.
RELATEDbit пропускает трафик, который связан с соединением, но не является частью самого соединения. Это могут быть такие вещи, как ICMP-пакеты, такие как «ICMP не может фрагментировать». Эти пакеты не являются частью потока TCP, но они жизненно важны для поддержания потока в рабочем состоянии (что также не покрывает ваш набор правил, и без которого вы увидите странные проблемы с подключением и потерю).

Это правило также работает для трафика UDP, но поскольку UDP не имеет состояния, оно не совсем то же самое. Вместо этого ядро ​​должно следить за выходящими UDP-пакетами и просто предполагает, что когда UDP-пакеты возвращаются на одну и ту же комбинацию хост / порт, и в течение короткого периода времени они связаны.

Патрик
источник
Спасибо за ответ. Я думаю, что не хочу пропускать трафик обратно, потому что я только устанавливаю исходящее SMTP-соединение? Думал, что если я добавлю правило в цепочку INPUT, то разрешу SMTP обратно. Это веб-сервер, который просто должен подключиться к внешнему узлу SMTP для отправки почты .... спасибо!
916 Networks
Если вы не пропустите ответный трафик, как ваша система будет получать все сообщения «да, я получил ваши данные», которые используют протоколы TCP и SMTP?
Патрик
Это имеет смысл. Я только добавил ваше правило, и оно полностью сработало. Я ценю ответ! Я пытался проголосовать, но сказал, что мне не хватает репутации (новичок в Unix StackExchange)
916 Networks
Я добавил объяснение того, как работает это правило.
Патрик