直接在网络层拦截畸形ip包是防御dos最前置高效的手段,需用iptables u32模块检查ihl、总长度、校验和、分片偏移、ttl及源地址等非法字段并丢弃。

直接在网络层拦截畸形 IP 包,是防御拒绝服务攻击(DoS)最前置、最高效的手段之一。这类攻击常依赖构造非法 IP 头部——比如超长 IHL、非法总长度、错误校验和、分片偏移异常、TTL 过小或为 0、源地址为私有网段或保留地址等——来耗尽服务器资源或触发内核漏洞。标准状态防火墙(如仅基于五元组的规则)对此类包无能为力,必须借助底层匹配能力,如 iptables 的 u32 模块或 ipset + hash:ip 配合深度检查。
识别并拦截典型畸形 IP 头部字段
IP 头部共 20 字节(无选项时),关键字段位置固定,u32 可精准读取:
-
IHL(Internet Header Length)非法:IHL 占 IP 头第 0 字节高 4 位,值应为 5–15(对应 20–60 字节)。若 IHL
iptables -A INPUT -m u32 --u32 "0 & 0xF0000000 = 0x00000000" -j DROP(匹配 IHL=0,实际中常见 IHL=0 或 1 的伪造包) -
总长度(Total Length)异常:位于第 2–3 字节(偏移 2),单位字节。合法值范围为 20(最小 IP 头)至 65535。若小于 20 或大于实际接收 MTU(如 1500),可拦截:
iptables -A INPUT -m u32 --u32 "2 & 0x0000FFFF 1500" -j DROP -
TTL 为 0 或 1:TTL 在第 8 字节(偏移 8)。TTL=0 表示包已过期,不应到达本机;TTL=1 常用于探测但易被滥用于反射放大。可统一拦截:
iptables -A INPUT -m u32 --u32 "8 & 0x000000FF -
源 IP 为非法地址:包括 0.0.0.0、255.255.255.255、127.0.0.0/8、224.0.0.0/4(组播)、240.0.0.0/4(保留)、以及私有地址段(如 10.0.0.0/8)出现在公网接口。用 u32 提取前 1 字节+后 3 字节组合判断更稳:
iptables -A INPUT -m u32 --u32 "12 & 0xFF000000 = 0x0A000000" -j DROP(拦截 10.x.x.x)
阻断分片类 DoS 攻击载荷
攻击者常发送重叠分片、超小分片(如 offset=0 但 len
- 提取标志位(bit 15–13)和分片偏移(bit 12–0):
iptables -A INPUT -p ip -m u32 --u32 "6 & 0xE000 = 0x2000 && 6 & 0x1FFF = 0"(MF=1 且 offset=0,可疑首片) - 拦截 offset 非 0 但 MF=0 的“孤零零”分片(违反协议):
iptables -A INPUT -p ip -m u32 --u32 "6 & 0xE000 = 0x0000 && 6 & 0x1FFF != 0" -j DROP - 禁止 IPv4 分片总数超过阈值(需配合 conntrack 或专用模块),但 u32 可先筛掉明显恶意分片,减轻后续处理压力。
结合限速与连接限制构建纵深防线
单靠拦截畸形包不足以应对混合型 DoS(如 SYN Flood + 畸形包协同)。需在网络层叠加速率控制:
- 对未完成三次握手的 SYN 包限速(防 SYN Flood):
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPTiptables -A INPUT -p tcp --syn -j DROP - 限制单 IP 新建连接数(如每秒不超过 10 个):
iptables -A INPUT -p tcp -m connlimit --connlimit-above 10 --connlimit-saddr -j DROP - 对已识别的畸形包源 IP,自动加入黑名单(需脚本联动):
捕获日志 → 提取 src IP →iptables -I INPUT -s $IP -j DROP→ 加入 ipset 持久化
验证与规避注意事项
u32 规则生效前务必测试,避免误杀合法流量:
- 启用日志记录调试:
iptables -A INPUT -m u32 --u32 "0 & 0xF0000000 = 0x00000000" -j LOG --log-prefix "BAD-IHL: " - 确保规则插入顺序:畸形包检查应在 ESTABLISHED 连接放行规则之前(
-I INPUT 1优于-A INPUT) - 不适用于 IP 分片后的第二片及后续片(u32 无法跨片读取),因此需在非分片路径上优先拦截首片
- 加密流量(如 TLS)、NAT 后的地址转换、或隧道封装(GRE/IPsec)会改变原始 IP 头偏移,u32 规则需部署在解封装前的节点











