使用 iptables 防火墙规则时,为什么要在所有允许的端口上断言 NEW 状态?

dro*_*nus 26 iptables

我经常看到 iptables 被配置为允许所有包到相关连接,以及特定服务端口到新连接。

说NEW的理由是什么?如果连接不是新的,我猜它是相关的,所以特定的端口规则不会执行。那么为什么要使用 NEW 而不仅仅是协议和端口号明确定义服务端口呢?

HBr*_*ijn 25

netfilter 防火墙 (iptables) 中的规则是按顺序检查的,数据包的命运(接受、丢弃、拒绝等)是在第一次匹配的基础上确定的。

通过使防火墙有状态和第一条规则,典型-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT的绝大多数合法流量在仅通过该单个规则后就会被接受。该流量不需要遍历任何其他规则。

取决于规则库的大小,这可能意味着防火墙性能的显着差异。

防火墙现在需要验证的唯一流量是明确的新连接。

即比较公共网络服务器的防火墙与少数网站管理员从他们的工作站访问:

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp -m multiport --dports 80,443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -m iprange --src-range 10.9.8.7-10.9.8.10 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
Run Code Online (Sandbox Code Playgroud)

大约 99% 的合法数据包都属于已建立的连接,仅符合第一条规则。在不符合该规则的数据包中,大多数应该是到您网站的新连接,多端口模块可以在单个规则中授予对 HTTP 或 HTTPS 的访问权限。网站管理员使用 ssh 和 sftp 从许多具有固定地址的工作站登录,其他一切都被拒绝。

规则按 TCP 端口逻辑排序的防火墙:

-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.7 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.8 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.9 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 22  --source 10.9.8.10 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp  -m tcp --dport 443 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

在授予访问权限之前,这里每个发送到 HTTP 网络服务器的数据包都需要根据 5 条规则进行检查。并且在服务器上运行更多服务,当您使用fail2ban 或类似产品时,这些服务很容易变成50 条或更多。

  • 你能反思一下存在“相关/建立”行但后续规则没有断言“新”的情况吗? (5认同)

kri*_*sFR 14

NEW 意味着数据包已经开始了一个新的连接。

它由称为ip_conntrack_*使您的防火墙有状态的内核模块处理。状态防火墙可以观察流量流。

如果您只指定协议和端口号,则您的防火墙不是有状态的而是无状态的。意味着它只是限制或阻止数据包。这些类型的防火墙不知道数据流。

一个很好的例子是 FTP:活动 FTP 使用端口 21 作为控制通道,然后使用端口 20 作为数据通道。在有状态防火墙的情况下,您不需要明确打开端口 20,因为它与之前在端口 21 上建立的连接有关。

这是iptables手册页的摘录:

NEW——意味着数据包已经开始了一个新的连接,或者与一个在两个方向都没有看到数据包的连接相关联。

ESTABLISHED——意味着数据包与一个在两个方向都看到数据包的连接相关联。

RELATED -- 意味着数据包正在启动一个新连接,但与现有连接相关联,例如 FTP 数据传输或 ICMP 错误。


Dan*_*ick 8

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

上述规则集将让数据包以INVALID通过状态发送到 TCP 端口 22ACCEPT

无效:如果之前的状态都不适用,则数据包处于无效状态。这可能是由各种类型的隐形网络探测引起的,也可能意味着您的 CONNTRACK 条目用完了(您还应该在日志中看到这些条目)。或者它可能只是完全良性的。

https://unix.stackexchange.com/questions/57423/how-to-understand-why-the-packet-was-thinked-invalid-by-the-iptables


断言状态NEW确保 INVALID 数据包不会被错误地接受。

并澄清含义:

  • :这是一个新的连接
  • ESTABLISHED:这是当前连接中涉及的数据包
  • 相关:这是一个新连接,但已由现有连接预测
  • 无效:以上均不适用。