iptables不支持应用层解析,其string模块仅能在未加密http载荷中做字节级模糊匹配,无法处理https、编码变体或协议结构,易误拦且易绕过,应以web服务器、代码校验和waf为主防。

iptables 本身不支持真正意义上的“Web层”或“应用层”解析,比如识别 HTTP 请求体中的 ../ 或 URL 编码后的目录穿越字符串(如 %2e%2e%2f)。它的 string 模块只能在原始网络数据包的载荷(payload)中做**字节级模糊匹配**,工作在传输层/网络层,无法理解 HTTP 协议结构、编码、分块或 TLS 加密内容。
String模块能做什么
它通过 -m string 扩展,在 TCP/UDP 数据包的有效载荷中查找指定字符串(支持 ASCII 或十六进制模式),常用于简单特征检测。例如:
- 匹配明文 HTTP 请求中未加密的
GET /..或POST /%2e%2e - 对非 HTTPS 的 HTTP 流量(端口 80)做粗粒度过滤
- 需配合
--algo bm(Boyer-Moore)或--algo kmp(Knuth-Morris-Pratt)算法指定匹配方式
典型目录穿越特征规则示例
以下命令针对未加密的 HTTP 流量(--dport 80),在 INPUT 链中拦截常见目录穿越载荷:
iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "../" -j DROP iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "%2e%2e%2f" -j DROP iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "%2e%2e/" -j DROP iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string ".%2e/" -j DROP
注意:--algo bm 效率较高,适合短字符串;若要匹配更复杂编码组合,可叠加多条规则,但无法覆盖所有变体(如双重编码、Unicode 混淆等)。
关键限制与风险
- HTTPS 流量完全无效:TLS 加密后载荷不可见,string 匹配失效
-
误拦率高:正常路径如
/assets/../js/main.js或含../字样的注释、日志、参数值会被误杀 -
绕过容易:攻击者改用
....//、%c0%ae%c0%ae%2f、大小写混用、URL 编码嵌套等方式即可绕过 - 性能开销明显:每包扫描载荷影响吞吐,高并发下可能成为瓶颈
更合理的防护路径
真正防御目录穿越,应聚焦应用层和中间件:
- Web 服务器(Nginx/Apache)配置
alias或location时禁用符号链接,启用disable_symlinks或AllowOverride None - 应用代码中严格校验用户输入路径:使用白名单、规范化路径(
realpath())、禁止向上跳转 - 部署 WAF(如 ModSecurity)——它专为 HTTP 协议设计,支持解码、正则、上下文感知和规则集(如 OWASP CRS)
- 若必须用 iptables 做初步过滤,仅作为纵深防御最外层,绝不能替代应用层加固










