OpenSSH需通过MaxStartups限制未认证连接、防火墙限速及禁用密码登录三重防护抵御DoS与暴力破解;推荐MaxStartups 5:50:20,配合nftables每IP每分钟限5新连,并强制密钥认证。

OpenSSH 默认不限制单个 IP 或全局的并发连接数,容易被恶意扫描或 DoS 攻击耗尽系统资源。限制并发连接需结合 sshd_config 配置、系统级连接控制(如 MaxStartups)和防火墙协同防护,而非仅靠单一手段。
使用 MaxStartups 控制未认证连接队列
MaxStartups 是 OpenSSH 内置最关键参数,用于限制处于“密钥交换完成但尚未认证成功”状态的并发连接数,直接缓解暴力破解和连接洪水攻击。
- 格式为
MaxStartups <em>start:rate:full</em>,例如MaxStartups 10:30:60表示:初始允许 10 个未认证连接;超过后每新增 1 个连接,随机丢弃 30% 的待处理连接;达到 60 个时强制丢弃所有新连接 - 推荐生产环境设置为
MaxStartups 5:50:20(保守)或MaxStartups 10:30:30(平衡),避免误杀合法重试,又防止队列堆积 - 该参数只影响 TCP 连接建立后的 SSH 协议层连接,不控制 TCP 层本身,需配合 iptables/nftables 使用
配合防火墙限制单 IP 连接速率
仅靠 OpenSSH 配置无法阻止海量 TCP SYN 请求,必须在内核网络层做限速,推荐使用 nftables(现代系统)或 iptables:
- nftables 示例(限制每 IP 每 60 秒最多 5 个新 SSH 连接):
nft add rule ip filter input tcp dport 22 ct state new limit rate 5/minute burst 5 packets counter accept - 同时可添加连接数限制(每个 IP 最多保持 3 个 ESTABLISHED 连接):
nft add rule ip filter input tcp dport 22 ct state established ip saddr @ssh_whitelist counter accept
再加一条拒绝超限规则,配合 ipset 管理白名单更稳妥 - 注意:避免对运维跳板机或可信网段限速,建议先用
log目标观察流量再启用drop
禁用密码登录 + 强制密钥认证
多数 SSH DoS 和暴力破解攻击依赖密码认证流程的高开销(尤其是 bcrypt/PAM 延迟)。关闭密码登录能显著降低单连接 CPU/内存消耗:
- 在
/etc/ssh/sshd_config中设置:PasswordAuthentication noPermitEmptyPasswords noKbdInteractiveAuthentication no - 确保至少一个密钥已正确部署并测试登录成功,再重载服务:
sudo systemctl reload sshd - 若必须保留密码登录(如部分用户场景),可搭配
libpam_faillock设置失败锁定,但不如直接禁用彻底
精简 SSH 服务暴露面
减少攻击入口点比事后拦截更有效:
- 修改默认端口(如改到 2222)可过滤掉 90% 自动化扫描,虽非安全措施,但大幅降低日志噪音和无效连接压力
- 使用
ListenAddress限定监听特定 IP(如仅内网管理口),避免公网网卡暴露 SSH - 通过
AllowUsers或AllowGroups明确授权账号,禁止 root 直接登录:PermitRootLogin noAllowUsers deploy admin@192.168.1.0/24

















