我经常看到 iptables 的 IPv4 规则示例,这些规则用于阻止被视为无效或损坏的 TCP 数据包。某些 TCP 标志组合不应使用。
以下是 4 条此类规则的示例:
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags ALL ACK
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags ALL RST
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags ALL ACK,FIN
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags ALL ACK,PSH
我用这些来查看我收到了多少个这样的无效数据包(即注意到缺少目标,没有-j DROP
)。
如果我将其插入到 INPUT 表的最开始处,我会看到大量此类错误。
当我将它们插入到ESTABLISHED,RELATED
规则之后时:
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -m tcp ! --syn -j ACCEPT
我没有看到任何错误......这意味着那些破碎的TCP 数据包正在被发送到客户端所连接的服务。
我认为阻止这种行为是毫无意义的/不必要的。特别是,INVALID
无论如何我都会首先使用状态:
-A INPUT -m state --state INVALID -j DROP
我想这足以消除非常危险的数据包。
关于这 4 条规则的共识是什么破碎的TCP 数据包?