iptables -j REJECT 的核心是让扫描器快速失败以减少重试和深度探测,通过精准的--reject-with类型(如icmp-host-unreachable)误导nmap等工具跳过后续探测,并需置于INPUT链中ESTABLISHED规则之后、服务规则之前,结合recent模块识别慢速扫描源,相比DROP可显著降低conntrack压力与重传开销。

用 iptables -j REJECT 拒绝非法扫描,核心不是“更快响应”,而是让扫描器快速失败、减少重试与深度探测,从而间接降低系统在扫描洪流下的响应延迟。它不加速本机处理,但能显著缩短扫描周期、减轻连接跟踪(conntrack)表压力和协议栈开销。
选对 --reject-with 类型,让扫描器“信以为真”
对扫描流量返回特定 ICMP 报文,可误导常见工具(如 nmap)跳过后续探测:
-
TCP SYN 扫描:用
--reject-with icmp-host-unreachable(ICMP Type 3 Code 1),nmap 多数情况下标记为closed或直接跳过,避免触发 FIN/NULL/XMAS 等高开销扫描 -
UDP 扫描:同样用
icmp-host-unreachable,不暴露本机是否监听 UDP 端口;禁用icmp-port-unreachable,否则等于自曝服务指纹 -
ICMP echo-request(ping 扫描):用
--reject-with icmp-net-unreachable(Type 3 Code 0),模拟网络层不可达,比静默 DROP 更易让扫描器放弃主机发现阶段
规则位置必须精准,避免误伤或失效
REJECT 规则生效的前提是匹配到扫描包,又不干扰正常通信:
- 放在
INPUT链中,且必须在-m state --state ESTABLISHED,RELATED -j ACCEPT规则之后、所有具体服务ACCEPT规则之前 - 绝不作用于
ESTABLISHED或RELATED状态的包——否则会中断已有连接,反而抬高延迟 - 不在
PREROUTING或OUTPUT链使用--reject-with,这些链不支持该参数,会报错
结合 recent 模块识别慢速扫描,减少规则膨胀
单纯按协议拒绝容易误判,用访问频次建模更可靠:
- 先用
-m recent --name scan --set记录每个新 TCP SYN 的源 IP - 再用
--rcheck --seconds 60 --hitcount 5判定 60 秒内发起 5 次以上新连接的 IP 为扫描源 - 命中后统一
-j REJECT --reject-with icmp-host-unreachable,既控制响应特征,又避免为每个端口写单独规则
替代 DROP 的真实收益:减轻 conntrack 和重传压力
相比 DROP,REJECT 的延迟优化体现在系统层面:
- 客户端收到 RST 或 ICMP 不可达后立即关闭连接,不会反复重传 SYN 或超时等待,减少本机 conntrack 表项堆积
- 避免因大量半开连接(SYN_RECV)耗尽资源,防止触发内核 syncookies 或丢弃合法新连接
- 日志中可见明确拒绝计数(
iptables -L -v),便于快速定位异常流量来源,缩短故障排查时间

















