在 iptables 中禁用连接跟踪是否安全?

信息安全 linux 防火墙 iptables
2021-08-31 16:48:15

在阅读iptables 中表的NOTRACK目标时raw,我遇到了一篇文章,建议对于某些流量,您可以(甚至应该)禁用连接跟踪。这两个例子是:(1)所有类型的路由数据包,(2)如果你有一个网络服务器,或者其他消耗资源的服务,你也应该禁用此类服务​​的连接跟踪。我没有网络服务器,但我有一些 p2p 客户端。以下是连接跟踪的标准规则:

iptables -t filter -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -t filter -A INPUT -p udp -m conntrack --ctstate NEW -j udp
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j tcp

udptcp链中,我使用以下命令为 torrent 客户端打开端口:

iptables -t filter -A udp -p udp --dport 33333 -m conntrack --ctstate NEW -j ACCEPT
iptables -t filter -A tcp -p tcp --dport 33333 -m conntrack --ctstate NEW -j ACCEPT

当我检查 conntrack 条目时:

# cat /proc/net/nf_conntrack | wc -l
3569

现在可以选择NOTRACKraw表格中为这种流量设置,例如:

iptables -t raw -A notrack_in -p udp --dport 33333 -j NOTRACK
iptables -t raw -A notrack_in -p udp --dport 33333 -j ACCEPT
iptables -t raw -A notrack_in -p tcp --dport 33333 -j NOTRACK
iptables -t raw -A notrack_in -p tcp --dport 33333 -j ACCEPT

它还需要过滤表中的两条规则:

iptables -t filter -A INPUT -p udp --dport 33333 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 33333 -j ACCEPT

操作后,入口数/proc/net/nf_conntrack下降到150-200,33333端口没有线路。

我的问题是:禁用连接跟踪是否安全?这样做是否需要向 iptables 添加规则?这种解决方案的优缺点是什么?

1个回答

简短的回答

通常您只需要对出站连接进行连接跟踪。如果任何本地设备连接到 Internet,防火墙会记录该特定 IP 和端口尝试连接到其他 IP 和端口。

因此,当来自 Internet 的答复到达时,防火墙知道让它通过,因为它之前已经看到了一个传出数据包。如果没有适当的连接跟踪,您将必须设置明确的规则来说明数据包可能从哪里传输到哪里(例如,允许来自 google.com 端口 80 的所有数据包)。很容易看出,这会使防火墙规则变得相当复杂。

长答案

如果用于入站连接,这两种解决方案之间只有细微的差别。一个区别是检查数据包的 CPU 负载发生在哪个系统上。如果您有一台专用的计算机/路由器/防火墙(从这里称为防火墙)执行此操作,并且启用了连接跟踪,则此设备将至少检查数据包的合理性。这将使应用程序服务器(获取数据包的服务器)免于这样做。

合理性是指在 UDP 的情况下,数据包来自预期的主机和预期的端口,在 TCP 的情况下,附加在序列号上

通常验证只能发生在应用层内部,因为有效性只能基于应用程序本身的协议来保证。

这些假设会产生三个后果:

  • 在状态跟踪的情况下,CPU 和网络负载移向网络的“边缘”。这意味着(通常)您网络上的第一台设备将对数据包进行一些基本检查,然后再将其转发到本地网络,从而保持内部网络清洁和防火墙上的负载。
  • 应用服务器只需要关心数据包是否有效,即数据包内的数据是否符合预期的协议。
  • 这可能会打开超过 UDP 连接的可能性,具体取决于协议。如果应用程序没有(或没有可靠的)方法来验证数据包的发送者,它将接受来自任何 IP 地址的正确有效负载。例如,在数据传输中,如果 UDP 数据包通过验证,就有可能向接收方发送垃圾。

尽管如此,通常的做法(除非在高安全性环境中)是仅对传出连接使用(一般)连接跟踪,因为不必明确允许每个 Internet 服务器响应来自本地网络的请求。对于传入连接,您通常只允许(定义的)端口可访问(-A INPUT -p tcp --dport 80 -j ACCEPT)。这将适用于新连接,但也适用于现有连接,避免开销,以跟踪连接。同样,您只会将数据包转发到特定目标端口到本地网络内的应用程序服务器。

特定于应用程序的连接跟踪

有一种情况我还没有提到,那就是特定于应用程序的连接跟踪。对于一些协议(ftp、irc、tftp、amanda、sip 和可能的其他协议,请参阅http://www.iptables.info/en/connection-state.html#COMPLEXPROTOCOLS例如)可能有特殊的 iptables 模块允许对连接进行高级跟踪。例如,在 FTP 中,您将在端口 21 上打开一个从客户端到服务器的连接,称为控制连接,它应该通过正常方式在防火墙中打开。在这个通道内,客户端和服务器定义了第二个连接,原始文件数据将被发送到该连接。通常,此连接是从服务器到客户端建立的(在 ACTIVE 模式下)。这个本地和远程端口看似随机,因此无法在静态防火墙配置文件中定义。如果客户端网络上有带有 iptables 的防火墙,它将拒绝此连接,因为没有以前的关联。通过特定于应用程序的连接跟踪,模块将“查看”