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

Sendmail не работает с iptables, хотя smtp и dns разрешены

У меня sendmail установлен на Ubuntu 10.04 исключительно для использования php mail() функция. Это отлично работает, если не запущен iptables (я использовал sendmail myemailaddress@domain.com чтобы проверить это).

Я думаю, что я разрешил SMTP и DNS (сценарий, который я использую для проверки правил iptables, ниже, в моей версии - фактические IP-адреса серверов имен моих хостов), но безрезультатно!

iptables --flush

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Postgres
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT

# Webmin
iptables -A INPUT -p tcp --dport 10000 -j ACCEPT

# Ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

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

# DNS
iptables -A INPUT -p udp --sport 53 -s <nameserver1> -j ACCEPT
iptables -A INPUT -p udp --sport 53 -s <nameserver2> -j ACCEPT
iptables -A INPUT -p tcp --sport 53 -s <nameserver1> -j ACCEPT
iptables -A INPUT -p tcp --sport 53 -s <nameserver2> -j ACCEPT

iptables -A OUTPUT -p udp --dport 53 -d <nameserver1> -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -d <nameserver2> -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -d <nameserver1> -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -d <nameserver2> -j ACCEPT


iptables -A INPUT -j DROP

# Add loopback
iptables -I INPUT 1 -i lo -j ACCEPT

В настоящее время у вас есть:

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

Который позволяет:

  • пакеты на ваш sendmail,
  • пакетов с вашего порта 25 выходит, но только для уже установленных соединений (то есть только для подключений извне).

Для исходящей электронной почты вам понадобится sendmail, чтобы иметь возможность подключаться к внешнему миру.

Так что вам тоже понадобится что-то вроде этого:

iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

Пожалуйста, убедитесь, что вы не становитесь открытым реле.

Я предполагаю, что вы будете подключаться к ретранслятору (smarthost) для отправки почты и вам не нужна входящая почта. Если нет, придется еще поработать. Автоматизированные системы, как правило, не имеют хорошо настроенных почтовых служб, что может привести к тому, что их почта будет отброшена или отправлена ​​в корзину для спама.

Вы можете использовать conntrack для обработки установленных соединений. Это упрощает остальные ваши правила, поскольку вам нужно беспокоиться только о новых соединениях в остальных правилах.

iptable -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptable -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Ваши правила перед вашими записями ping выглядят хорошо.

Ваши правила должны охватывать исходящий трафик

iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

Ваши правила ICMP кажутся неполными

iptables -A INPUT -p icmp --icmp-type 3/4 -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT 
iptables -A OUTPUT -p icmp --icmp-type 3/4 -j ACCEPT 
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT 
iptables -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT