iptables length模块通过检查ip层总长度高效识别异常探测包,结合协议特征、tcp标志、ttl等条件实现精准过滤,需严格遵循规则顺序以避免误判。

iptables 的 length 模块是识别异常探测请求的轻量高效手段——它不解析载荷,只检查 IP 层总长度(IPv4 的 Total Length 字段),开销低、规则简洁,适合部署在 INPUT 链前端做初步过滤。
明确合法长度边界,区分协议最小包
不同协议有其理论最小长度,超出或低于该范围的包往往可疑:
- TCP SYN 包:无选项时为 20 字节 IP 头 + 20 字节 TCP 头 = 40 字节;含常见时间戳等选项后常达 60–72 字节
- ICMPv4 Echo Request(ping):IP 头 20 字节 + ICMP 头 8 字节 + 默认 64 字节载荷 = 92 字节;最小可至 28 字节(仅头)
- UDP DNS 查询:标准请求通常 ≤ 512 字节(不含 IP/UDP 头),总长一般在 70–550 字节 区间
- ICMPv6 Echo Request:RFC 建议 ≤ 1280 字节,超长请求(如 >2000 字节)多为探测或攻击载荷
拦截典型异常短包(扫描行为高发)
大量扫描器(如自定义脚本、nmap 变种)会发送极短包绕过检测。建议分步处理:
一款AI工具,主要用于通过后台进程运行 Codex CLI、Claude Code、OpenCode 或 Pi Coding Agent,实现程序化控制,适合需要提升相关任务效率的用户。
- 先记录可疑区间:
iptables -I INPUT -p tcp -m length --length 48:59 -j LOG --log-prefix "SHORT-TCP-SCAN: " - 排除已建连流量(避免误伤):
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(必须放在 length 规则前) - 精准拦截无 ACK 的短 TCP 包(聚焦新建连接阶段):
iptables -A INPUT -p tcp ! --tcp-flags ALL ACK -m length --length 0:59 -j DROP - 拒绝长度恰好为 32 字节的 ICMP 包(某些隐蔽探测工具固定使用):
iptables -A INPUT -p icmp -m length --length 32 -j DROP
限制超长或畸形大包(防 flood 与分片探测)
以太网 MTU 为 1500,非分片 IPv4 单包超过此值即非常规:
- 记录并分析 >1500 字节的入向包:
iptables -I INPUT -m length --length 1501: -j LOG --log-prefix "LONG-PKT: " - 丢弃非分片且 ≥1501 字节的 TCP/UDP 包(业务无特殊需求时):
iptables -A INPUT ! -f -p tcp -m length --length 1501: -j DROP - 针对 DNS 放大攻击特征:拦截源端口为 53 且长度 ≥513 的 UDP 请求:
iptables -A INPUT -p udp --sport 53 -m length --length 513: -j DROP - 限制 ICMPv6 请求长度上限:
ip6tables -I INPUT -p icmpv6 --icmpv6-type 128 -m length --length 1281: -j DROP
组合条件提升准确性,避免误判
单独用 length 易误杀(如含 TCP 选项的合法 SYN 包可达 72 字节),必须叠加协议特征:
- 只对 SYN 标志包检查短长度:
iptables -A INPUT -p tcp --tcp-flags ALL SYN -m length --length 0:59 -j DROP - 限制 UDP DNS 请求长度但放行响应:
iptables -A INPUT -p udp --dport 53 -m length --length 513: -j DROP(注意:DNS 响应由 OUTPUT 或 RELATED 流量处理,不受此限) - 配合 TTL 过滤增强可信度(如探测包常设 TTL=64/128):
iptables -A INPUT -p tcp -m length --length 48:59 -m ttl --ttl-eq 64 -j LOG --log-prefix "TTL64-SHORT-TCP: " - 规则顺序关键:state ACCEPT → length LOG/DROP → 具体服务规则(如 -p tcp --dport 22 -j ACCEPT)










