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

916*_*rks 15 linux iptables smtp email

如果我选择允许 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
Run Code Online (Sandbox Code Playgroud)

phe*_*mer 20

你有一个规则让流量出去,但你没有规则让返回的流量进来。

我猜你的意思是将这 2 条规则-A INPUT改为:

iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 587 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

然而,使用源端口作为允许返回流量的方法是保护系统的一种糟糕方式。某人所要做的就是使用这些源端口之一,并且您的防火墙规则集将变得无用。

一个更好的主意是删除所有-A INPUT ... --sport规则并仅使用这条规则:

iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

此规则的工作方式是,当您的系统进行出站连接时,内核会将连接记录在跟踪表中。然后,当来自远程系统的数据包返回时,它会查看这些数据包是否与跟踪表中的任何连接相关联。
ESTABLISHED位是允许与会话直接相关的流量的位。这将是返回流上的 TCP 数据包。
RELATEDbit 允许与连接相关但不属于连接本身的流量通过。这可以是 ICMP 数据包之类的内容,例如“ICMP 无法分段”。这些数据包不是 TCP 流的一部分,但对于保持流的活动至关重要(这也是您的规则集未涵盖的另一件事,否则您将看到奇怪的连接问题和丢失)。

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