为什么TCP数据包可以被修改来阻止无效数据包,而UDP数据包却不能

为什么TCP数据包可以被修改来阻止无效数据包,而UDP数据包却不能

在随机的一天,我在谷歌上搜索iptables规则以强化我的桌面,并发现了这篇文章[1]。在某些时候,指南提到使用 tcp 模块和这些规则来阻止无效的 TCP 数据包;

iptables -A INPUT -p tcp -m tcp --tcp-flags ALL FIN,PSH,URG -j DROP

iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP

我在上述命令上按了回车键,规则已成功应用。然后我尝试将tcp每个命令的部分替换为udp例如,如果我执行第三个命令,

iptables -A INPUT -p udp -m conntrack --ctstate NEW -m udp ! --udp-flags FIN,SYN,RST,ACK SYN -j DROP

这返回了一个错误,指出这些规则对于 udp 数据包无效。我使用的是 Debian 操作系统,内核版本 4.9.x

我在网上读到的文章

  1. https://www.booleanworld.com/depth-guide-iptables-linux-firewall/

答案1

TCP 是有状态协议,UDP 是无状态的,因此不能使用ctstate它。

您要么允许特定端口的 UDP 流量,要么不允许。

--udp-flags FIN,SYN,RST,ACK SYN只是纯粹的废话。

简而言之,在急于设置 iptables 之前先熟悉一下 TCP/IP 和 UDP。

相关内容