ssh白名单需分三层防护:firewalld rich-rule(主流)、tcp wrappers(辅助)、sshd_config allowusers(最细粒度),关键在ip全覆盖、规则顺序严谨及reload前验证。

SSH 白名单不是“加一条规则”就完事,关键在于防护层级的选择和规则顺序的严谨性。真正起作用的白名单必须明确限定来源 IP,并覆盖所有可能的连接路径(包括本机回环、内网管理口),否则极易把自己锁在外面。
用 firewalld 配 rich-rule 做精准控制
这是目前最主流、最可靠的方式,尤其适用于 CentOS/RHEL 7+ 和 Fedora 等默认启用 firewalld 的系统。
- 先清掉默认开放 SSH 的规则: firewall-cmd --permanent --remove-service=ssh
- 显式放行可信地址(每条独立添加): firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" service name="ssh" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.5" service name="ssh" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.42" service name="ssh" accept'
- 补上拒绝兜底(必须在所有 accept 之后): firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="ssh" reject'
- 验证并重载: firewall-cmd --permanent --list-all 确认规则顺序正确 → firewall-cmd --reload
用 /etc/hosts.allow + /etc/hosts.deny 做服务层过滤
TCP Wrappers 是轻量级方案,适合老旧系统或作为辅助手段,但不适用于容器化或 systemd-socket 激活场景。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 只编辑两个文件,无需重启防火墙: echo "sshd: 127.0.0.1 : allow" >> /etc/hosts.allow echo "sshd: 192.168.10.0/24 : allow" >> /etc/hosts.allow echo "sshd: ALL : deny" >> /etc/hosts.deny
- 注意:sshd 必须编译时启用了 libwrap 支持(现代 OpenSSH 默认开启);检查方法:ldd $(which sshd) | grep libwrap
- 该机制优先级高于 iptables/firewalld,但低于应用层配置(如 sshd_config 中的 AllowUsers)
在 sshd_config 中用 AllowUsers 绑定用户+IP
这是最细粒度的控制方式,能同时限制“谁”和“从哪来”,适合多用户、多出口的管理环境。
- 编辑 /etc/ssh/sshd_config,添加类似行: AllowUsers admin@127.0.0.1 ops@192.168.10.5 deploy@203.0.113.42
- 支持通配符(如 admin@192.168.1.*),但不支持 CIDR 表示法(192.168.1.0/24 无效)
- 保存后必须执行 systemctl restart sshd 生效;建议先开一个备用会话测试,避免误锁
- 与 DenyUsers 共存时,AllowUsers 优先级更高;若两者冲突,以 AllowUsers 为准
几个容易踩的坑
白名单失效往往不是配置没写,而是细节出错:
- 空格陷阱:rich-rule 中 source address="1.1.2.4 "(末尾多空格)会导致规则静默失效,firewall-cmd --list-all 查不到
- 回环遗漏:只加了公网 IP,忘了 127.0.0.1,结果 ssh localhost 失败,运维连本机都登不上
- reload 前没验证:firewall-cmd --reload 是原子操作,一旦规则语法错误或顺序错乱,SSH 连接会立即中断且无法恢复
- 混淆 deny 和 drop:不加 reject 规则,其他 IP 实际是被默认 drop(无响应),客户端表现为超时,排查困难;加 reject 后返回 Connection refused,信号明确










