iptables可基于明文clienthello识别sni并限速拦截,如匹配evil-domain.net、限制单ip并发连接数及丢弃长度

iptables 本身无法直接解析或过滤完整的 TLS 加密载荷(如 ClientHello 后的密钥交换、应用数据),但它能对 TLS 握手初期的明文部分做有限但有效的识别与拦截,尤其适用于防御 TLS 重协商滥用、SNI 欺骗、畸形握手包等攻击。关键在于利用 string 模块 + 特定偏移范围 + SNI 或协议特征字符串,结合连接状态控制,实现轻量级 TLS 层面防护。
识别并拦截恶意 ClientHello 中的 SNI 域名
TLS 1.2/1.3 的 ClientHello 报文前段(通常在前 1024 字节内)以明文携带 Server Name Indication(SNI)扩展。攻击者常利用非法域名(如已知黑产域名、测试域名、内部域名外泄)发起重协商或探测。可据此设置规则:
- 限定端口为 443(或实际 HTTPS 监听端口),避免误伤其他 TCP 流量
- 使用
--from 0 --to 1024覆盖典型 ClientHello 长度,兼顾性能与覆盖率 - 匹配常见恶意 SNI 模式,例如:
"example-bad.com"、"phpmyadmin"、"test.internal"(注意:不支持正则,需逐条写) - 添加
--icase防止大小写绕过
示例命令:
iptables -A INPUT -p tcp --dport 443 -m string --algo bm --from 0 --to 1024 --string "evil-domain.net" --icase -j DROP限制 TLS 重协商请求频率
虽然 iptables 无法识别“重协商”语义,但可结合连接状态与速率限制,压制高频握手行为:
- 用
connlimit模块限制单 IP 并发 TLS 连接数(如--connlimit-above 5),防止资源耗尽 - 用
limit模块限制每秒新建连接数(如-m limit --limit 3/s),缓解慢速重协商洪水 - 优先将规则置于 INPUT 链靠前位置,确保在 ACCEPT 规则之前生效
丢弃明显异常的 TLS 握手包
某些攻击工具会发送畸形或极短的 TLS 记录(如长度不足 5 字节、记录类型非法)。虽不能靠 string 匹配,但可用 length 和 tcp 模块辅助过滤:
- 拒绝 TCP 载荷长度小于 5 字节的 443 端口包(合法 ClientHello 至少含 5 字节记录头)
- 拒绝 TCP 标志异常组合(如 SYN+FIN,或无 SYN 却带大量数据)
- 配合
tcp-flags模块筛查非标准握手起始包
示例:
iptables -A INPUT -p tcp --dport 443 -m length --length 0:4 -j DROP注意事项与局限性
这些方法属于“外围加固”,不能替代 TLS 协议栈层防护(如 OpenSSL 配置禁用重协商、启用 TLS 1.3、限制密码套件):
- 无法解密或检查加密后的 Application Data,所有过滤仅限握手明文部分
- SNI 匹配可能被 TLS 1.3 的 ESNI/ECH(加密 SNI)绕过,此时规则失效
- 高并发场景下 string 匹配有性能开销,建议搭配
--from/--to精确范围 - 务必关闭 firewalld 等冲突服务,确保 iptables 规则实际加载











