iptables 的 --state 选项有什么用?

iptables 的 --state 选项有什么用?

我只是没有得到--state的选项iptables

我已经阅读了有关“新建”、“已建立”和“相关”的示例。但为什么需要这样做呢?

我的意思是,当我打开一个端口(例如 22)时。通信是通过 22 进行的,仅此而已。为什么要使用这个状态参数?

也许端口 22 是一个坏例子。但是,当我创建一个已接受的新连接并具有已建立或相关的连接时,状态只是为了打开更多端口吗?

例如:以下之间有什么区别:

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 22 -m state -j ACCEPT
iptables -A INPUT  -p tcp --sport 22 -m state -j ACCEPT

两者都应该有效。

答案1

iptables -A INPUT  -p tcp --sport 22 -m state -j ACCEPT

这将允许从任何位置到计算机上的任何端口使用源端口 22 进行任何 TCP 连接,而不仅仅是返回传出 SSH 连接的数据包。如果您在计算机上的任何端口(而不仅仅是 SSH)上运行任何服务器,那么任何人都可以连接到它(只要他们碰巧猜到使用 22 作为源端口)。默默无闻的安全。

Conntrack 跟踪实际从您的系统打开的传出连接,因此告诉iptables您接受传入的ESTABLISHED 连接数据包,您知道您得到了这些并且仅得到了这些。

但请注意这样的事情:

iptables -A INPUT  -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

只允许回复传出 SSH 连接(到端口 22)。您需要为系统上任何需要连接的所有其他端口复制该内容,镜像OUTPUT链中的任何规则。

另一个例子可能是这样的,接受数据包到高端口,允许回复数据包到(任何)传出连接:

iptables -A INPUT -p tcp --dport 1024:65535 -j ACCEPT

这也将允许与在高端口(例如 8080 或 6667)上运行的任何服务器进行任何连接,甚至是那些意外保持运行的服务器。当然,您可以进一步限制该范围,但是您需要验证系统用于传出连接的范围。

再说一次,对于 TCP,您可以添加! --syn以阻止新连接,但对于 UDP,这是不可能的,因为返回或回复数据包与低级别的初始数据包没有什么不同。在那里,conntrack 几乎是区分最近从系统打开的连接和恰好来自外部的其他数据包的唯一选项。

答案2

当你说“两者都应该工作”时,意思是两者都做什么希望他们这样做,但是我们不知道你想要什么。

第一对规则将允许外向的到远程端口 22 的连接。这可能是也可能不是您想要的。大多数人更关心限制传入连接。

第二对规则还允许到远程端口 22 的传出连接。但是使用防火墙,可以轻松测试应该允许的内容是否实际允许。测试应该阻止的内容是否真的被阻止是比较困难的。

在这种情况下,第二对规则将允许到任何端口的传入连接,只要远程端口为 22。我确信这不是您想要的。过去,我看到过许多尝试连接源端口 22 的情况,正是因为无状态防火墙上的此类规则。我最近没看,这样的尝试可能还很常见,攻击者很容易选择源端口。

答案3

iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

将要不是允许任何新连接。

从手册页:“NEW 表示数据包已启动新连接,或以其他方式与未在两个方向上看到数据包的连接相关联”。 IOW,仅此规则,当默认策略为 DROP/REJECT 时,将不允许您连接到主机。

相关内容