直接用iptables -m connlimit限制单ip并发ssh连接数最有效轻量,命令为iptables -a input -p tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j reject --reject-with tcp-reset,其中--connlimit-mask 32确保按单ip精确统计,防内网误伤;它统计established和syn_recv状态连接,兼顾已登录多终端与半开扫描;需配合sshd_config中maxstartups 3:50:6防未认证堆积。

直接用 iptables -m connlimit 限制单 IP 并发 SSH 连接数,是防自动化扫描器抢占会话句柄最有效、最轻量的方式。它在内核网络层拦截,不依赖 SSH 认证状态,能立刻阻断一个 IP 开多个终端、脚本误连或慢速 DoS 类行为。
核心命令与关键参数
执行这条规则即可生效:
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j REJECT --reject-with tcp-reset- --connlimit-above 3:表示超过 3 个并发连接即触发拦截
- --connlimit-mask 32:精确到单个 IPv4 地址(/32),确保每个真实 IP 独立计数
- REJECT --reject-with tcp-reset:主动发 RST 包,客户端秒级失败,不卡超时
为什么必须加 --connlimit-mask 32?
不加 mask 默认行为因系统而异,可能按网段统计,导致内网用户互相影响。--connlimit-mask 32 强制按源 IP 精确匹配,让每个扫描器 IP 都被单独限制,真正应对全网分布式扫描器(如 masscan + ssh brute 工具链)。
若需对某类网段统一控流(如只限办公区 10.10.0.0/16),才改用 --connlimit-mask 16;普通防护一律用 32。
注意 connlimit 的实际统计范围
connlimit 统计的是 nf_conntrack 表中处于 ESTABLISHED 或 SYN_RECV 状态的条目:
- SYN_RECV 算一个连接——能拦住半开扫描(如 SYN Flood 变种)
- ESTABLISHED 算一个连接——能拦住已登录后狂开 tmux/ssh 窗口的行为
- 它不看用户是否认证成功,也不区分 root 还是普通用户,天然适配“防抢占句柄”场景
配合 MaxStartups 防未认证堆积
connlimit 拦不住大量只握手不认证的连接(如暴力扫描器卡在密码输入前)。必须同步加固 sshd:
编辑 /etc/ssh/sshd_config,添加或修改:
MaxStartups 3:50:6- 最多允许 3 个未认证连接排队
- 超出后,每新增 50 个连接随机丢弃 1 个
- 达到 6 个未认证连接就全部拒绝
改完运行 systemctl restart sshd 生效。











