iptables的length模块可匹配ip层及之上的总长度,用于识别异常认证握手探测;如sshv2合法包≥52字节、tls clienthello≥80字节、rdp≥90字节,低于阈值者多为伪造探测包。

iptables 的 length 匹配模块可用于检测 TCP/UDP 数据包的总长度(含 IP 头、传输层头和载荷),在识别异常认证握手探测(如 SSH、RDP、TLS 初始 ClientHello、SMB Negotiate 等)时非常实用。这类探测常使用极短或非标准长度的伪造握手包绕过简单端口扫描检测,而合法握手包有明确的最小长度下限。
理解典型认证握手的最小长度特征
合法握手包受协议规范约束,不可能过短:
- SSHv2:初始 `SSH-2.0-xxx\r\n` 协议标识最少约 12–16 字节(不含 IP/TCP 头),加上 IPv4 头(20 字节)+ TCP 头(20 字节最小),整个 IP 包长度 ≥ 52 字节;实际常见为 60–70 字节。
- TLS ClientHello(TLS 1.2/1.3):最简 ClientHello(无扩展、单密码套件)载荷至少 40+ 字节,加上 TCP/IP 头,IP 总长通常 ≥ 80 字节;低于 64 字节的 ClientHello 几乎必为畸形或探测包。
- RDP(MCS Connect-Initial):标准初始包长度通常 ≥ 90 字节(IP 层);
- SMB Negotiate Protocol Request:SMBv2 NegotiateRequest 最小有效长度(含 NetBIOS Session Service 封装)IP 层 ≥ 70 字节。
用 iptables -m length 匹配超短/超长异常包
直接在 INPUT 链中拦截明显非法长度的入向握手包(以 SSH 和 TLS 常见端口为例):
# 拦截 IP 总长 拦截 IP 总长 <p>iptables -A INPUT -p tcp --dport 443 -m length --length 0:74 -j DROP</p><h1>可选:拦截异常长包(如 > 1500 字节的单个握手包,可能含恶意填充或分片攻击)</h1><p>iptables -A INPUT -p tcp --dport 22 -m length --length 1501:65535 -j DROP</p>
注意:--length 匹配的是整个 IP 数据报长度(IPv4 Total Length 字段值),不是 TCP payload 长度。SYN 包本身无载荷,但 IP+TCP 头已占至少 40 字节;若包长仅 40,说明没带任何数据——合法 SSH/TLS 握手 SYN 后紧跟 SYN-ACK,但初始 SYN 不含应用层内容,所以更应关注后续的 ACK+Data 包(如含 ClientHello)。
结合状态跟踪提升准确性
单独用 length 匹配易误伤(如某些嵌入式设备发的精简握手)。建议叠加 conntrack 状态判断,只对新连接的前几个包做长度检查:
# 仅匹配新连接的第一个非 SYN 包(即 SYN-ACK 后的 ACK+Data),再检查长度 iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -m length --length 0:74 -j DROP <h1>或更稳妥:只匹配 ESTABLISHED 状态下、且是连接早期(如第2–5个包)的短包</h1><p>iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED -m length --length 0:54 -m limit --limit 3/min -j LOG --log-prefix "SHORT-SSH-DATA: " iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED -m length --length 0:54 -j DROP</p>
配合 limit 模块防日志刷屏,同时保留记录用于分析真实攻击模式。
验证与调优建议
上线前务必实测,避免阻断正常流量:
- 用
tcpdump -i any 'tcp port 22 or port 443' -w handshake.pcap抓取真实客户端握手流量,用 Wireshark 查看各包 IP 总长(Frame → Packet Length)。 - 对自建服务(如 OpenSSH、Nginx),用 curl / ssh -v 连接,确认其 ClientHello/SFTP 握手包长度是否落在你设置的阈值内。
- 从日志中观察被 DROP 的包是否真为异常(如源 IP 高频、User-Agent 异常、无后续包),逐步收紧阈值。
- length 匹配不适用于分片包(IPv4 Fragment),若网络存在分片,需先用
-f匹配分片并跳过,或启用 conntrack 自动重组(默认开启)。
不复杂但容易忽略。










