最可靠的方式是用/etc/ssh/sshd_config中的AllowUsers限定用户+CIDR网段,因其原生支持、优先级最高;/etc/hosts.allow在OpenSSH 8.0+中默认不编译libwrap支持,配置完全不生效;防火墙仅作第二道防线,无法区分用户且不参与认证。

AllowUsers 是最可靠的方式,其他方法要么失效、要么只是兜底。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
AllowUsers 必须写对格式,否则直接失效
- 它只认 CIDR 表示法,不接受
192.168.1.*或localhost这类写法 - 多个规则用空格分隔,不能换行,例如:
AllowUsers admin@192.168.1.0/24 deploy@10.0.0.0/8 - IPv6 支持但需完整写法:
ops@2001:db8::/64 - 用户名和 IP 之间必须有
@,admin@192.168.1.0/24合法,admin 192.168.1.0/24无效 - 修改后必须执行
sudo systemctl restart sshd,当前 SSH 会话会断开
/etc/hosts.allow 在多数新系统上根本不生效
- OpenSSH 8.0+(RHEL/CentOS 8+、Ubuntu 20.04+、Debian 11+)默认不编译
libwrap支持 - 执行
ldd /usr/sbin/sshd | grep wrap,无输出 = 完全忽略/etc/hosts.allow - 即使你写了
sshd: 192.168.1.0/24 : allow,也毫无反应——不是配错,是功能被砍了 - 老系统(如 CentOS 7)虽支持,但 IPv6 不处理、和
AllowUsers冲突时行为不可预测
防火墙层(firewalld)只能做第二道防线
-
firewall-cmd --permanent --add-service=ssh是全局开放,完全绕过白名单逻辑 - 真要限制 IP,必须用
rich-rule显式指定 source:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept' - 别忘了加回环:
source address="127.0.0.1",否则ssh localhost会失败 - 拒绝规则要放在所有 accept 之后:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" reject' -
firewall-cmd --reload是原子操作,出错可能直接锁死 SSH,务必提前留好本地或串口访问通道
真正起效的限制落在 SSH 协议栈内部,也就是 AllowUsers。防火墙规则只看 IP 和端口,不参与用户认证;hosts.allow 在主流发行版上已基本形同虚设。别在失效路径上浪费调试时间。

















