iptables可通过recent模块检测慢速端口扫描,结合connlimit限制半开连接、state模块过滤非法状态包,并辅以内核参数调优降低响应暴露面。

iptables 本身不直接识别“端口扫描”行为,但可通过连接状态、速率限制和状态匹配等机制,有效拦截慢速端口扫描(如 nmap -sS -T2 或自定义延迟探测)。关键在于识别异常连接尝试模式,而非单次 SYN 包——慢扫的特点是:单位时间内目标端口分散、源 IP 连接数低、SYN 不完成三次握手。
基于 recent 模块标记高频新连接
利用 iptables -m recent 记录短时间内发起多个新连接(SYN)的源 IP,适合检测跨端口试探:
- 对每个新 SYN 包(未建立连接),添加到 recent 列表:
iptables -A INPUT -p tcp -m tcp --syn -m recent --name portscan --rcheck --seconds 60 --hitcount 5 -j DROP
表示:60 秒内命中 5 次新 SYN 即拉黑 - 若未达阈值,则记录该 IP:
iptables -A INPUT -p tcp -m tcp --syn -m recent --name portscan --set -j ACCEPT - 建议搭配日志规则便于审计:
iptables -A INPUT -p tcp -m tcp --syn -m recent --name portscan --rcheck --seconds 60 --hitcount 5 -j LOG --log-prefix "SLOW-SCAN-DROP: "
限制单 IP 并发半开连接数(SYN 队列)
慢扫虽节奏慢,但常维持大量半开连接。用 connlimit 控制同一源 IP 的未完成 TCP 连接上限:
- 拒绝单 IP 超过 3 个并发 SYN 包(适用于非 Web 服务端口):
iptables -A INPUT -p tcp -m connlimit --connlimit-above 3 --connlimit-mask 32 -j REJECT --reject-with tcp-reset - 对常见服务可放宽(如 SSH):
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 5 -j ACCEPT
注意:此规则需放在通用限流规则之前,避免误拒合法 SSH 多会话
结合 state 模块过滤非法状态包
慢扫常伴随伪造或异常 TCP 标志组合(如 SYN+FIN、纯 ACK 无连接)。启用状态跟踪后,可丢弃明显不合逻辑的包:
- 只允许已建立连接或新 SYN:
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK,FIN,RST -m state --state NEW -j ACCEPT - 显式拒绝非法标志组合(如 NULL 扫描、Xmas 扫描):
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
补充建议:降低内核响应暴露面
iptables 是第一道防线,还需配合系统级调优减少扫描反馈:
- 关闭 ICMP 响应(防主机发现):
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all - 缩短 SYN_RECV 超时,加速清理半开连接:
echo 30 > /proc/sys/net/ipv4/tcp_synack_retries
echo 3 > /proc/sys/net/ipv4/tcp_syn_retries - 禁用不必要的端口监听,从源头减少探测面(比拦截更高效)

















