Iptables 阻止了我的服务器上的出站和入站 smtp,尽管我指定它不阻止。我的策略是删除除指定内容之外的所有内容。将策略更改为接受所有内容“解决”了该问题,但我不想在此服务器上无限制地进行流量。规则设置如下(smtp 部分是最后一项):
# Flush all rules
iptables -F
iptables -X
# Allow unlimited traffic on loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Allow incoming and outgoing SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# Allow incoming HTTP/HTTPS
# HTTP
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
# HTTPS
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
# Allow outgoing SMTP
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
# Finally, change policy to DROP ALL
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
它是一个网络服务器。Django 的send_mail
功能是用来发送邮件的。设置如下:
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
我假设 587 用于电子邮件,所以我为端口 587 添加了与端口 25 相同的规则。我还尝试切换--dport
/--sport
以用于 smtp,但没有任何效果。设置规则如下这和这问题(针对端口 25 和 587)也无济于事。我甚至尝试对端口 1025 进行同样的操作,只是因为文档中提到了这一点,但什么也没发生……
答案1
您的防火墙规则不允许 DNS 流量(UDP 端口 53)。因此,您的 Django 应用无法执行 DNS 查找来定位smtp.gmail.com
:
gaierror at /contact/mailto [Errno -2] Name or service not known
为了解决此问题,请编写允许传出 DNS 查询和传入 DNS 响应的防火墙规则。
答案2
难道 --sport 和 --dsport 应该反过来吗?
# Allow outgoing SMTP
iptables -A OUTPUT -o eth0 -p tcp --dport 587 -m state --state NEW,ESTABLISHED -j A
iptables -A INPUT -i eth0 -p tcp --sport 587 -m state --state ESTABLISHED -j ACCEPT