最有效方式是用iptables connlimit模块在内核层限制单ip并发ssh连接数,命令为iptables -a input -p tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j reject --reject-with tcp-reset;需配合sshd_config中maxstartups 5:30:10防未认证堆积,并前置limit规则限新建连接速率为5/min。

直接用 iptables 的 connlimit 模块限制单 IP 并发 SSH 连接数,是最有效、最底层的防护方式。它在内核网络层拦截,不依赖 sshd 认证状态,能真正阻止一个 IP 开多个终端、脚本误连或慢速 DoS 占用资源。
核心命令:限制每 IP 最多 3 个并发 SSH 连接
这条规则匹配已建立的 TCP 连接(ESTABLISHED),精准控制活跃会话数:
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j REJECT --reject-with tcp-reset-
--connlimit-mask 32表示按单个 IPv4 地址计数(/32),确保每个真实客户端被独立限制 - 用 REJECT --reject-with tcp-reset 而非 DROP,让客户端立刻收到 RST 包,避免卡在连接等待中
必须配合 MaxStartups 防未认证堆积
connlimit 管的是“已建立”连接,但自动化扫描常卡在认证前(SYN→ACK 后不发用户密码),这类半开连接需靠 sshd 自身控制:
- 编辑
/etc/ssh/sshd_config,添加或修改:MaxStartups 5:30:10 - 含义:最多允许 5 个未认证连接;超过后每新增 30 个连接随机丢弃 1 个;达到 10 个则全部拒绝
- 改完执行
systemctl restart sshd生效
叠加限速规则,切断扫描源头
只控并发不够——全网扫描器可能用大量不同 IP 或低频长时探测。需先压制新建连接频率:
- 放行合规的新建连接(带速率控制):
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 5/min --limit-burst 5 -j ACCEPT - 兜底拒绝所有未被上面放行的新建请求:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP - 注意:这两条要放在 connlimit 规则之前,形成“先控频次、再控并发”的防护链
验证与持久化要点
加完规则不能算完事,得确认真起作用:
- 查看规则是否加载:
iptables -L INPUT -n -v | grep :22,检查匹配计数是否增长 - 本地测试:用
ssh -o ConnectTimeout=2 user@host快速开第 4 个连接,应立即失败并报 “Connection refused” - 重启后保留规则:
CentOS/RHEL:运行service iptables save或写入/etc/sysconfig/iptables
Ubuntu/Debian:用netfilter-persistent save










