iptables不能识别cve编号,但可依据漏洞网络行为特征(如端口、明文路径、十六进制载荷、协议字段偏移)在网络层轻量拦截;仅适用于未加密、单包完整、未分片流量,是老旧服务的兜底防护手段。

iptables 不能识别 CVE 编号本身,但能依据已知漏洞的网络行为特征(如特定端口、明文路径、固定十六进制载荷、协议字段偏移值)设置规则,在网络层做轻量级拦截。它不是 WAF 或 IDS,只对单个未加密、未分片、特征完整落在一个数据包内的流量生效,适合用作脆弱服务(如老旧 MySQL、Spring Boot 管理端点)的兜底防护。
匹配明文 HTTP 路径特征,拦截未授权访问类漏洞
许多 CVE(如 CVE-2022-22965 Spring4Shell、CVE-2021-21287 Actuator 暴露)通过固定 URL 触发,若服务走明文 HTTP 或路径在 TLS 握手阶段暴露(极少见),可用 string 模块拦截: - 屏蔽 Actuator 敏感接口:iptables -A INPUT -p tcp --dport 8080 -m string --algo bm --string "/actuator/env" -j DROP
- 阻断 Swagger UI 元数据泄露:iptables -A INPUT -p tcp --dport 8080 -m string --algo bm --string "/v2/api-docs" -j DROP
- 注意:HTTPS 流量中这些路径被加密,该规则完全无效;SNI 只含域名,不包含路径,无法用于匹配 `/actuator`。用 --hex-string 匹配二进制级攻击载荷
适用于漏洞利用中位置靠前、格式固定的机器码或协议魔数,例如: - CVE-2023-38545(MySQL SOCKS5 堆溢出)初始握手包前 3 字节为 `05 01 00`:iptables -A INPUT -p tcp --dport 3306 -m string --algo bm --hex-string "|05 01 00|" --from 0 --to 64 -j DROP
- Webshell 中常见 shellcode 开头 `|90 90 90 90|`(NOP sled):iptables -A INPUT -p tcp --dport 80 -m string --hex-string "|90 90 90 90|" --from 40 --to 512 -j DROP
- 必须加 `--from/--to` 限定扫描范围,避免误匹配 IP/TCP 头部;执行前确认内核支持:`iptables -m string --help | grep hex-string`,缺失则运行 `modprobe xt_string`。用 -m u32 精确定位协议字段中的恶意标志
比字符串匹配更高效稳定,适合 DNS、MySQL 等结构化协议中位置固定的字段: - DNS 响应中伪造 IP(如 `192.0.1.1` 对应 `0xc0000101`)常出现在 payload 第 40 字节起(UDP 数据起始后):iptables -A INPUT -p udp --dport 53 -m u32 --u32 "40 & 0xFFFFFFFF = 0xc0000101" -j DROP
iptables -A INPUT -p tcp --dport 3306 -m u32 --u32 "36 & 0xFF = 0xFF" -j DROP
- u32 偏移从 IP 头起算,单位为 4 字节;TCP 头长度可变,建议实测或取保守值(如 32–44)。部署必须遵循的实战原则
-规则插入顺序关键:先放行可信源(白名单),再匹配特征,最后限速兜底,末尾加默认拒绝;用 `-I INPUT 1` 插入链首,避免被前置 ACCEPT 跳过
-所有 DROP 规则前建议加 LOG:`-j LOG --log-prefix "CVE-BLOCK:"`,再查 `dmesg` 验证是否真命中
-不单独依赖 string/u32:它只是辅助手段,不能替代服务自身升级、最小权限配置、WAF 或透明代理(如 Nginx + Lua)
-避开加密与分片场景:HTTPS、DoH、TLS 封装的 DNS、gzip 压缩、URL 编码、TCP 分段等均会导致规则失效
不复杂但容易忽略。











