如何设置SSHD以限制特定IP的最大并发连接数,防御DoS攻击?

2026-05-07 19:321阅读0评论SEO资讯
  • 内容介绍
  • 相关推荐

本文共计691个文字,预计阅读时间需要3分钟。

如何设置SSHD以限制特定IP的最大并发连接数,防御DoS攻击?

通过`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 ACCEPT
    iptables -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以限制特定IP的最大并发连接数,防御DoS攻击?

通过`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 ACCEPT
    iptables -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