iptables不能直接修复协议漏洞,但能通过raw表拦截非法分片、过滤TCP非法标志组合、限制UDP异常载荷及ICMP滥用,在网络层构建第一道防线,需配合状态机制按序部署规则。

iptables 不能直接修复协议漏洞,但能通过识别和拦截利用这些漏洞的异常流量模式,在网络层构建第一道防线。关键不是封端口,而是抓住协议在正常通信中不会出现的“畸形特征”——比如 TCP 标志位冲突、UDP 极短载荷、ICMP 类型滥用、非法分片结构等。
抓TCP协议的非法标志组合
TCP 协议栈对标志位有明确规范,攻击工具常靠违反 RFC 发起扫描或触发内核异常。这类包无需状态跟踪,直接丢弃最高效:
- 拒绝所有标志位全清空(Null 扫描):iptables -I INPUT -p tcp --tcp-flags ALL NONE -j DROP
- 拒绝 SYN 和 FIN 同时置位(违反连接建立逻辑):iptables -I INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
- 拒绝仅含 FIN 的孤立包(无 ACK 或 SYN,多用于 FIN 扫描):iptables -I INPUT -p tcp --tcp-flags ALL FIN -j DROP
- 拒绝 Xmas 扫描(FIN+URG+PSH 全开):iptables -I INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
拦UDP反射与伪造响应类注入
UDP 本身无连接,但攻击者常构造极小、固定长度或源/目的端口异常的包,用于 DNS/SSDP/NTP 反射放大或伪造响应。防御重点是长度和端口逻辑:
- 拒绝所有载荷 ≤64 字节的 UDP 包(避开正常 DNS 查询最小长度,但覆盖多数探测包):iptables -A INPUT -p udp -m length --length 0:64 -j DROP
- 拦截纯 UDP 头(8 字节)的包(常见于伪造 DNS 响应):iptables -A INPUT -p udp -m u32 --u32 "20 & 0xFFFF = 8" -j DROP
- 封禁源端口和目的端口均为 53 的 UDP 流量(典型 DNS 反射特征):iptables -A INPUT -p udp --sport 53 --dport 53 -j DROP
堵ICMP滥用与非必要类型
ICMP 不该被完全禁用,但大量 echo-request(ping)、timestamp-request 或 mask-request 是扫描和DoS前置行为。只放行协议必需的错误反馈类型:
- 允许目标不可达(type 3)、超时(type 11)、参数问题(type 12):iptables -A INPUT -p icmp --icmp-type 3 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
- 同理放行 type 11 和 type 12
- 其余类型(如 type 8 ping、type 13 timestamp)若非运维必需,统一丢弃:iptables -A INPUT -p icmp -j DROP
防IP分片绕过与Teardrop前置攻击
非法分片不直接导致缓冲区溢出,但常作为触发内核协议栈解析缺陷的前置手段。raw 表是唯一能在连接跟踪前干预的位置:
- 禁止非首片携带任何 TCP 标志(合法分片绝无此行为):iptables -t raw -A PREROUTING -f -m tcp --tcp-flags ALL ALL -j DROP
- 更严格:禁止非首片带 SYN/FIN/RST/ACK 中任意一个:iptables -t raw -A PREROUTING -f -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
- 拦截分片偏移非法(非8字节整数倍):iptables -t raw -A PREROUTING -f -m frag --fragoff ! 0:8 -j DROP
- 对分片流限速,防耗尽重组内存:iptables -t raw -A PREROUTING -f -m hashlimit --hashlimit-above 5/sec --hashlimit-burst 10 --hashlimit-name frag_flood -j DROP
配合状态机制加固整体策略
以上规则需嵌入完整状态防火墙框架中才能发挥最大效用。顺序和协同很关键:
- 所有非法特征规则必须放在 INPUT 链靠前(用 -I 插入),早于 ESTABLISHED/RELATED 放行规则
- 显式丢弃 INVALID 状态包:iptables -A INPUT -m conntrack --ctstate INVALID -j DROP(放在特征规则之后、ESTABLISHED 之前)
- 再放行已建立和关联连接:iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
- 最后设置默认策略:iptables -P INPUT DROP

















