如何在iptables Debian Linux上允许传出SMTP


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

Answers:


18

您有规则允许流量通过,但没有规则允许流量返回。

我猜你是要-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数据包返回流中。
RELATED位允许与连接有关但不属于连接本身的流量通过。可能是类似ICMP数据包之类的事情,例如“ ICMP无法分段”。这些数据包不是TCP流的一部分,但是对于保持流的存活至关重要(这也是规则集无法涵盖的另一件事,没有它,您将看到奇怪的连接问题和丢失)。

该规则也适用于UDP流量,但是因为UDP是无状态的,所以并不完全相同。相反,内核必须跟踪发出的UDP数据包,并且仅假设当UDP数据包返回相同的主机/端口组合时,并且在很短的时间内,它们是相关的。


谢谢回复。我想我不想让流量返回,因为我只建立了传出SMTP连接?我在想如果我将规则添加到INPUT链中,那么我将允许SMTP返回。这是一个Web服务器,只需连接到外部SMTP主机即可发送邮件...。
916 Networks

如果您不让返回流量返回,您的系统将如何接收TCP和SMTP协议使用的所有“是的,我的数据”消息?
帕特里克(Patrick)

那讲得通。我刚刚添加了您的规则,它完全有效。感谢您的回答!我试图投票,但是说我没有足够的声誉(Unix StackExchange并不熟悉)
916 Networks

我添加了关于该规则如何工作的解释。
帕特里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.