这两个iptables规则有什么区别?

csi*_*csi 6 traffic ssh iptables port

尝试允许端口 22 上的传入 ssh 流量。默认行为是丢弃所有传入流量。

我遇到了 2 篇关于如何允许流量的文章。然而,它们是不同的。

## open port ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

对比

# Allow all incoming 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 ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

似乎第一个允许所有流量,然后指定一个特定的网络。好像那些是相互排斥的?

这两个和我应该使用哪一个之间有什么区别?

Mic*_*ton 16

这两套规则都有问题,我不会按原样使用它们。


在第一组中,第一个规则允许从任何地方到目标端口 22 的新传入流量。这不是问题。

第一个问题是第二个规则允许从特定子网到目标端口 22 的新传入流量。这是完全多余的,因为第一个规则允许来自任何地方的流量。

我的猜测是您阅读了一些使用这些规则作为(互斥)示例的教程,建议您选择其中一个,但不要同时选择两者。

第二个问题是在此规则之前需要另一条规则来使防火墙完全有状态,而此处缺少该规则。如果没有这条规则,将只允许 SYN 数据包,并且连接将永远不会完成。

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

第二套规则也有类似的问题。我不知道这个规则集最初是谁写的,但它在互联网上被广泛复制。它似乎是由不熟悉一般状态防火墙或特别是 iptables 的人编写的。

在此规则集中,输入规则允许从任何地方到目标端口 22 的新的和已建立的传入流量。然后,输出规则允许从源端口 22 到任何地方的已建立流量。这本质上是第一条规则的镜像,如果您对传出流量的默认策略是丢弃或拒绝它,则需要类似的东西。

问题是这些出站规则很快变得多余,这会导致性能问题以及稍后必须阅读规则的任何人的理解问题。如果您要丢弃传出流量,则无论您允许有多少传入端口,任何端口上建立的传出流量(匹配允许的传入流量)只需要一个规则。

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

对于默认输入策略是拒绝流量而默认输出策略是允许流量的主机防火墙,您的大部分规则都将在 INPUT 表中。拥有状态规则,然后规则为您需要的任何传入流量打开端口就足够了。

例如,要允许 ssh 和 http 连接:

-P INPUT DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

如果您还默认拒绝输出流量,那么您还需要允许这些允许的入站连接的返回流量。

-P OUTPUT DROP
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

这是一个与 iptables 一样简单有效的防火墙。

  • 优秀,彻底的答案。 (2认同)