为什么链末尾的 'iptables -A OUTPUT -j REJECT' OUTPUT 会覆盖前面的规则?

为什么链末尾的 'iptables -A OUTPUT -j REJECT' OUTPUT 会覆盖前面的规则?

这些是我的 IPTABLES 规则:

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

iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p udp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 4 --name DEFAULT --rsource -j DROP
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

iptables -A OUTPUT  -j REJECT
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT

我使用远程 ssh 配置来设置它们,但在我设置之后:

iptables -A OUTPUT  -j REJECT

我的连接丢失了。我已阅读了 Iptables 的所有文档,并且我能找出原因,INPUT 的全局拒绝功能运行良好,因为我可以访问网页,但 ssh 超时了。有什么想法吗?

谢谢

答案1

TCP 流上使用的端口不对称:当服务器(守护程序)端侦听端口 22 时,客户端将使用随机高编号(1024+)端口。如果您对目标端口进行过滤,则这些端口将被阻止。您需要在拒绝行之前使用类似“iptables -A OUTPUT -m state --state ESTABLISHED,RELATED”的命令,以使对外部请求的回复正常工作。

答案2

我认为您的输出规则过于严格导致了问题 - 您的 ssh 连接可以进入,但无法返回。返回连接不会转到客户端计算机上的端口 22,而是转到高编号端口。

为了排除故障,请完全禁用输出规则,然后查看结果。通常,使用防火墙时,您更担心传入的连接,而不是传出的连接。

因此,请尝试iptables -A OUTPUT -j ACCEPT仅输出规则并观察会发生什么。

答案3

线路

iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT

应该读

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

因为数据包来自您服务器的端口 22,并到达客户端机器上的随机临时端口,正如 Phil 已经指出的那样。-m state --state ESTABLISHED如果您感到特别谨慎,您可能需要考虑添加。

相关内容