iptables无法直接识别畸形TCP/UDP字段,但可通过内核参数加固(如rp_filter、禁用源路由)和iptables规则(如过滤非法TCP标志组合)拦截典型异常包,并配合日志分析与Suricata等专用工具实现深度检测。

iptables 本身不直接解析 TCP/UDP 头部字段或校验 IP 分片合法性,无法“识别”严格意义上的“畸形字段”(比如非法 TCP 标志组合、超长选项、重叠分片等)。但可通过组合内核参数加固 + iptables 规则过滤典型异常特征,实现对高概率非法包的有效拦截。
启用内核级基础防护
很多畸形包在进入 iptables 前就被内核丢弃,这是最高效的第一道防线:
- 开启反向路径检查:echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter,防止私有地址欺骗和非对称路由下的伪造包
- 禁用源路由:echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route,直接丢弃含 Loose/Strict Source Route 的 IP 包
- 关闭 ICMP 重定向接收:echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects,避免被用于路由劫持
- 启用 TCP SYN Cookies(防 SYN Flood):echo 1 > /proc/sys/net/ipv4/tcp_syncookies
用 iptables 过滤常见异常模式
虽不能深度解析字段,但可匹配已知高危特征:
- 丢弃 TCP 标志全为 0 或全为 1 的包(极大概率非法):
iptables -A INPUT -p tcp '!' --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP - 拒绝 FIN+SYN 同时置位的包(违反 RFC):
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP - 拦截带有 TCP 选项但长度异常的包(需配合 --tcp-option 模块,部分内核支持):
iptables -A INPUT -p tcp --tcp-option 0 -m length --length 56:64 -j DROP(示例:针对特定 MSS 异常) - 封禁明显无效的 IP 分片(首片偏移非 0 但 MF=0):
iptables -A INPUT -f -m physdev --physdev-is-in -j DROP(需结合 physdev 和实际接口判断)
记录并分析可疑流量
先记录再决策,避免误杀:
- 对疑似畸形包加 LOG 规则(放在 DROP 前):
iptables -I INPUT -p tcp --tcp-flags ALL ALL -j LOG --log-prefix "MALFORMED-TCP-ALL:" --log-tcp-options - 确保日志包含关键字段:--log-tcp-options 和 --log-ip-options 必须显式启用,否则看不到 TCP Option 或 IP Option 内容
- 查看日志:tail -f /var/log/kern.log | grep "MALFORMED",观察源 IP、TCP 标志、选项内容,确认是否真为攻击流量
补充建议:用专用工具做深度检测
iptables 不是协议分析器。若需精准拦截畸形字段(如 TCP 窗口缩放值溢出、IP ID 随机性缺失、ICMP 类型非法),应搭配:
- suricata 或 snort:基于规则的入侵检测系统,可写 sig 识别具体字段异常
- ebpf/bcc 工具(如 tcpretrans):在内核层抓取原始包头,做实时校验
- 应用层 WAF(如 nginx+modsecurity):对 HTTP 层畸形请求做语义级过滤


















