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

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

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

声明 NEW 的原因是什么?如果连接不是 NEW,我猜它是 RELATED,因此特定端口规则不会执行。那么为什么要用 NEW 明确定义服务端口,而不仅仅是协议和端口号?

答案1

netfilter 防火墙(iptables)中的规则会按顺序进行检查,并且根据首次匹配来确定数据包的命运(ACCEPT、DROP、REJECT 等)。

通过使防火墙具有状态并将第一条规则作为典型规则,-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

大约 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

这里每一个发往 HTTP Web 服务器的数据包需要根据 5 条规则进行检查,然后才能授予访问权限。随着服务器上运行的服务越来越多,规则很容易变成 50 条甚至更多,例如,当您使用 fail2ban 或类似产品时。

答案2

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

它由内核模块处理,ip_conntrack_*使你的防火墙有状态的. 状态防火墙可以监视流量流。

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

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

iptables以下是手册页的摘录:

NEW——表示数据包已开始新的连接,或者与尚未在两个方向上见过数据包的连接相关联。

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

RELATED——表示数据包正在启动一个新连接,但与现有连接相关,例如 FTP 数据传输或 ICMP 错误。

答案3

-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

上述规则集将允许状态为INVALIDthrough的数据包到达 TCP 端口 22ACCEPT

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

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


断言 STATENEW可确保 INVALID 数据包不会被错误接受。

并澄清含义:

  • 新的:这是一个新的连接
  • 已确立的:这是当前连接中涉及的数据包
  • 有关的:这是一个新连接,但已由现有连接判定
  • 无效的:以上都不适用。

相关内容