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

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

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

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

## 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

对比

# 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

看起来第一个允许所有流量,然后指定特定网络。看起来这些是互斥的?

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

答案1

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


在第一组中,第一条规则允许来自任意位置的新流量进入目标端口 22。这没有问题。

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

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

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

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

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

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

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

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

对于主机防火墙,其默认输入策略是拒绝流量,默认输出策略是允许流量,因此大多数规则都将位于 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

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

-P OUTPUT DROP
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

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

答案2

上面的那个似乎对它试图做的事情有点困惑,如果 iptables 没有看到双向流量,它似乎只允许 ssh 数据包进入,这很奇怪。

下面的一行更加合理,但是第二行是多余的,除非你的 OUTPUT 链上有除 ACCEPT 之外的其他策略。(iptables -L 并查找“Chain OUTPUT(policy XXXXXX)”)。

您可能只想要底部集合的第一行。

答案3

如果连接 = 新连接,则第一组的第 1 行将允许入站端口 22 流量。第一组的第 2 行似乎没有必要,因为只允许设置网络范围的端口 22 流量,并且必须是新连接。但是第 2 行上的前一条规则已经允许流量通过。
这似乎是错误的或不完整的

第二行,如果端口 = 22 且是新的或已建立的连接,则允许在 the0 上进行入站流量。第二行,如果设备 = eth0 且端口 = 22 且已建立连接,则允许出站流量。

这将允许与该主机的 SSH 连接,并且还允许传出 SSH。

第二套是你更好的选择

相关内容