iptables防御扫描器最有效手段是精准拦截非法tcp标志组合及畸形小包。包括null扫描(all none)、xmas扫描(fin,urg,psh)、syn+fin同置、单fin,以及长度≤54字节的ssh包和≤74字节的https包,并配合state模块丢弃invalid连接和限速new连接。

直接拦截那些不走正常三次握手、专为探测设计的畸形 TCP 包,是 iptables 防御扫描器最基础也最有效的手段之一。关键不在“深度”,而在“精准识别非法标志组合”——因为合法 TCP 流量有严格规范,而扫描器常靠违反这些规范来实现隐蔽或快速探测。
识别并拦截常见非法 TCP 标志组合
TCP 协议规定了哪些标志位可以合法共存。扫描器却常故意构造违反协议的组合,比如全关、全开、或 SYN+FIN 同时置位。iptables 用 --tcp-flags 可精确匹配:
-
Null 扫描(全零):所有标志位都是 0,正常通信中不可能出现。命令:
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL NONE -j DROP -
Xmas 扫描(FIN+URG+PSH):像圣诞树一样全亮,无实际业务含义。命令:
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL FIN,URG,PSH -j DROP -
SYN+FIN 同时置位:协议明令禁止,既不是握手开始,也不是断开过程。命令:
iptables -I INPUT -p tcp --dport 80 --tcp-flags SYN,FIN SYN,FIN -j DROP -
仅含 FIN 的包:真实连接断开前必有 ACK 或 RST 配合,单 FIN 多为探测。命令:
iptables -I INPUT -p tcp --dport 80 --tcp-flags ALL FIN -j DROP
配合长度过滤,堵住极短畸形握手包
很多扫描工具为节省带宽,发超小包试探服务是否存在。一个合法的 TCP SYN 包至少含 20 字节 IP 头 + 20 字节 TCP 头 = 40 字节;若再带选项(如 MSS),通常 ≥52 字节。明显更短的包基本可判定为恶意:
- 拦截总长 ≤54 字节的 SSH 入向包(排除合法 SYN):
iptables -A INPUT -p tcp --dport 22 -m length --length 0:54 -j DROP - 拦截总长 ≤74 字节的 HTTPS 入向包(过滤无效 ClientHello):
iptables -A INPUT -p tcp --dport 443 -m length --length 0:74 -j DROP - 避免误伤,建议加 --tcp-flags ALL SYN 限定只查 SYN 包,提升准确性。
用状态模块辅助识别半开/异常连接行为
有些扫描器发完 SYN 就不再响应 ACK,留下大量半开连接。iptables 的 state 模块能识别这类“无效”连接状态:
- 丢弃被标记为 INVALID 的包(如无对应连接记录的 ACK/RST):
iptables -A INPUT -p tcp -m state --state INVALID -j DROP - 对高频新建连接限速(防慢扫):
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/s --limit-burst 5 -j ACCEPT,之后接一条 DROP 规则收尾。
注意规则顺序与静默处理
这些规则必须插在 INPUT 链最前端(用 -I INPUT),确保早于服务放行规则(如 -A INPUT -p tcp --dport 80 -j ACCEPT)执行。否则会被绕过。
用 DROP 而非 REJECT 更安全:REJECT 会回 RST,等于告诉扫描器“端口开着”;DROP 则让对方超时重试或放弃,模拟网络不可达,增加其判断成本。










