真正有效的方式是用iptables + connlimit模块在内核网络层限制单IP并发连接数,配合sshd_config中MaxStartups防未认证堆积,并用hashlimit限制单IP新建连接速率,三者协同实现完整防护。

不能靠 sshd_config 或单纯用 iptables -m limit 实现——前者不按 IP 计数,后者是全局速率限制、不区分来源。真正有效的方式是用 iptables + connlimit 模块,在内核网络层对已建立连接(ESTABLISHED)做实时计数和拦截。
用 connlimit 限制单 IP 并发连接数
connlimit 是专为“每个源 IP 当前并发连接数”设计的模块,适用于 SSH、HTTP 等所有 TCP 服务。关键参数:
-
--connlimit-above N:当某 IP 的并发连接数超过 N 时触发动作(如拒绝) -
--connlimit-mask 32:精确匹配单个 IPv4 地址(默认值,可省略) -
--connlimit-mask 24:按 C 类网段(如 192.168.1.0/24)统一计数 - 推荐用
-j REJECT --reject-with tcp-reset,让客户端立即收到 RST 包,避免假死等待
示例(限制每个 IP 最多 3 个 SSH 并发连接):
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT --reject-with tcp-reset
必须配合 MaxStartups 防未认证堆积
connlimit 只管 ESTABLISHED 连接,但暴力扫描常卡在认证前(SYN → SYN-ACK → 不发 ACK),这类半开连接会耗尽 sshd 的子进程资源。需靠 OpenSSH 自身配置补位:
- 编辑
/etc/ssh/sshd_config,添加或修改:MaxStartups 5:30:10 - 含义:最多允许 5 个未认证连接;超 5 后每新增 30 个连接随机丢弃 1 个;达 10 个则全部拒绝
- 改完执行
systemctl restart sshd生效
再加一层:限制单 IP 新建连接速率
connlimit 对短连接攻击(快速建连→断连)无效。要控频率,得用 hashlimit(比 limit 更精准,支持按源 IP 独立计数):
- 示例(每个 IP 每分钟最多新建 5 个 SSH 连接,突发允许 3 个):
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit-above 5/min --hashlimit-burst 3 --hashlimit-mode srcip --hashlimit-name ssh_limit -j DROP -
--hashlimit-mode srcip是关键,确保按 IP 分桶计数 -
--hashlimit-name用于标识规则名,避免冲突
验证与持久化要点
规则加完不等于生效,需确认:
- 检查是否加载:
iptables -L INPUT -n -v | grep :22,看匹配包计数是否增长 - 测试方法:用
ssh -o ConnectTimeout=2 user@host快速开多个终端,第N+1个应立刻失败 - 重启后失效?保存规则:
• CentOS/RHEL:iptables-save > /etc/sysconfig/iptables
• Debian/Ubuntu:iptables-save > /etc/iptables/rules.v4 - 确认内核模块已加载:
lsmod | grep ip_conntrack,缺失则运行modprobe nf_conntrack

















