如何设置SSHD以限制特定IP的最大并发连接数,防御DoS攻击?
- 内容介绍
- 相关推荐
本文共计691个文字,预计阅读时间需要3分钟。
通过`sshd_config`本身无法限制每个IP的并发连接数,它不提供按源IP计数的机制。真正有效的方法是结合使用`iptables`的`connlimit`模块,在内核网络层拦截超过限制的连接。这是防止单个IP耗尽SSH资源(如进程、内存、文件描述符)的最可靠方式。
用 iptables + connlimit 限制单IP并发SSH连接
该规则作用于已建立的 TCP 连接(ESTABLISHED 状态),防止一个IP开10个终端、脚本误配长连接或慢速DoS攻击:
- 运行命令限制每个IPv4地址最多3个并发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;若需按C类网段(如192.168.1.0/24)统一限制,改为--connlimit-mask 24 - 使用
REJECT --reject-with tcp-reset而非DROP,能让客户端立刻收到RST包,避免长时间等待超时,体验更干净
配合 MaxStartups 防未认证连接泛滥
即使 connlimit 生效,大量未完成认证的连接(如暴力扫描的SYN+ACK后卡住)仍会堆积。这时靠 sshd_config 中的 MaxStartups 控制:
- 编辑
/etc/ssh/sshd_config,设置类似:MaxStartups 5:30:10 - 含义:最多允许5个未认证连接;超过5个后,每新增30个连接随机丢弃1个;达到10个则全部拒绝
- 修改后必须重启服务:
systemctl restart sshd
补充防护:限制新建连接频率(防爆破)
单纯控并发不够,还需压制单位时间内的新建请求节奏,避免短时洪水:
- 添加 iptables 限速规则(仅对 NEW 状态生效):
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 5/min --limit-burst 5 -j ACCEPTiptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP - 这表示:每分钟最多放行5个新SSH连接;首次可突发5个;超出即丢弃
- 注意:此规则要放在 connlimit 规则之前执行,形成“先控频次、再控并发”的逻辑链
验证与持久化
规则加完不是一劳永逸:
- 检查是否生效:
iptables -L INPUT -n -v | grep :22,确认规则已加载且有匹配计数 - 测试时可用
ssh -o ConnectTimeout=2 user@host多开终端或脚本模拟,观察第4次连接是否被立即拒绝 - 重启后规则丢失?保存规则:
CentOS/RHEL:用service iptables save或写入/etc/sysconfig/iptables
Ubuntu/Debian:安装iptables-persistent并运行netfilter-persistent save
本文共计691个文字,预计阅读时间需要3分钟。
通过`sshd_config`本身无法限制每个IP的并发连接数,它不提供按源IP计数的机制。真正有效的方法是结合使用`iptables`的`connlimit`模块,在内核网络层拦截超过限制的连接。这是防止单个IP耗尽SSH资源(如进程、内存、文件描述符)的最可靠方式。
用 iptables + connlimit 限制单IP并发SSH连接
该规则作用于已建立的 TCP 连接(ESTABLISHED 状态),防止一个IP开10个终端、脚本误配长连接或慢速DoS攻击:
- 运行命令限制每个IPv4地址最多3个并发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;若需按C类网段(如192.168.1.0/24)统一限制,改为--connlimit-mask 24 - 使用
REJECT --reject-with tcp-reset而非DROP,能让客户端立刻收到RST包,避免长时间等待超时,体验更干净
配合 MaxStartups 防未认证连接泛滥
即使 connlimit 生效,大量未完成认证的连接(如暴力扫描的SYN+ACK后卡住)仍会堆积。这时靠 sshd_config 中的 MaxStartups 控制:
- 编辑
/etc/ssh/sshd_config,设置类似:MaxStartups 5:30:10 - 含义:最多允许5个未认证连接;超过5个后,每新增30个连接随机丢弃1个;达到10个则全部拒绝
- 修改后必须重启服务:
systemctl restart sshd
补充防护:限制新建连接频率(防爆破)
单纯控并发不够,还需压制单位时间内的新建请求节奏,避免短时洪水:
- 添加 iptables 限速规则(仅对 NEW 状态生效):
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 5/min --limit-burst 5 -j ACCEPTiptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP - 这表示:每分钟最多放行5个新SSH连接;首次可突发5个;超出即丢弃
- 注意:此规则要放在 connlimit 规则之前执行,形成“先控频次、再控并发”的逻辑链
验证与持久化
规则加完不是一劳永逸:
- 检查是否生效:
iptables -L INPUT -n -v | grep :22,确认规则已加载且有匹配计数 - 测试时可用
ssh -o ConnectTimeout=2 user@host多开终端或脚本模拟,观察第4次连接是否被立即拒绝 - 重启后规则丢失?保存规则:
CentOS/RHEL:用service iptables save或写入/etc/sysconfig/iptables
Ubuntu/Debian:安装iptables-persistent并运行netfilter-persistent save

