iptables可通过-m string --hex-string和-m u32模块匹配十六进制特征码拦截木马报文:前者用于http/dns等未加密协议明文载荷中的特征(如|6576616c|对应"eval"),需限定偏移防误匹配;后者按32位偏移匹配协议头部或固定位置二进制指纹(如tcp载荷第40字节是否为0x90),适合c2识别;部署时应组合多特征、优先input链前端插入、先log后drop,并避开tls等加密流量。

iptables 不能直接识别 CVE 编号,但可依据已知漏洞的网络行为特征(如特定端口、协议字段、明文载荷字节序列)设置规则拦截恶意流量。它不是入侵检测系统,仅做单包匹配,适用于未加密、特征完整落于单包内的场景。
匹配明文 HTTP/HTTPS 请求中的路径特征
许多 Web 漏洞(如 Spring Cloud Actuator、Swagger 未授权访问)通过固定 URL 路径触发,这类请求在 TLS 握手后仍可能暴露路径(如 SNI)或走明文 HTTP:
- 屏蔽 Actuator 敏感接口:iptables -A INPUT -p tcp --dport 8080 -m string --algo bm --string "/actuator/env" -j DROP
- 拦截 Swagger 元数据泄露:iptables -A INPUT -p tcp --dport 8080 -m string --algo bm --string "/swagger.yaml" -j DROP
- 注意:若服务使用 HTTPS,且路径被加密(非 SNI),则该规则无效;SNI 只含域名,不含路径,无法匹配 /actuator
用 hex-string 匹配二进制级攻击载荷
适用于漏洞利用中固定的机器码、协议魔数等十六进制特征,例如 CVE-2023-38545(MySQL SOCKS5 堆溢出)初始握手包:
- 攻击包前 3 字节为
05 01 00(SOCKS5 协议版本+认证方法数+方法):iptables -A INPUT -p tcp --dport 3306 -m string --algo bm --hex-string "|05 01 00|" -j DROP - 确保内核支持:
iptables -m string --help | grep hex-string,缺失时运行modprobe xt_string - 避免误判:加
--from 0 --to 64限定只扫描 TCP payload 前 64 字节,减少开销
用 u32 模块精准定位协议字段
比字符串匹配更高效、更稳定,适合 DNS、MySQL 等协议中位置固定的字段(如响应码、状态字节):
- DNS 响应中伪造 IP(如 192.0.1.1)常出现在 payload 第 40 字节起:iptables -A INPUT -p udp --dport 53 -m u32 --u32 "40 & 0xFFFFFFFF = 0xc0000101" -j DROP
- MySQL 认证响应中错误状态码 0xFF 出现在固定偏移(估算 TCP 头 32 字节 + MySQL 包头 4 字节后):iptables -A INPUT -p tcp --dport 3306 -m u32 --u32 "36 & 0xFF = 0xFF" -j DROP
- 注意:TCP 头长度可变(含选项),需实测或保守取最大值(如 60)再计算偏移
限制访问源与协议行为辅助加固
单靠载荷匹配易绕过,必须叠加基础访问控制:
- 只允许可信 IP 访问数据库端口:iptables -A INPUT -p tcp --dport 3306 ! -s 192.168.10.0/24 -j DROP
- 禁用危险 ICMP 类型防探测(如 CVE-1999-0524):iptables -A INPUT -p icmp --icmp-type timestamp-request -j DROP
- 关闭非必要端口(如 OpenSSH 的 scp 子功能无法禁用时,可限制 22 端口仅允许跳板机访问)










