最直接可靠的方式是用/etc/ssh/sshd_config中的allowusers指令配合username@ip_address格式做精准白名单控制,支持cidr网段、通配符,需置于文件末尾、sshd -t校验后systemctl reload sshd生效,并关闭usedns避免解析失败导致拦截。

最直接可靠的方式是用 /etc/ssh/sshd_config 中的 AllowUsers 指令,配合 用户名@IP 格式做精准白名单控制。它在认证前拦截、原生支持、无需额外服务,且现代系统(RHEL 8+/Ubuntu 20.04+)中稳定生效。
正确写法:用户 + IP 组合必须明确
格式严格为 username@ip_address 或 username@cidr_net,中间不能有空格,多个条目用空格分隔:
- 只允许 admin 从堡垒机
10.10.5.100登录:AllowUsers admin@10.10.5.100 - 允许多个账号分别从不同 IP 登录:
AllowUsers deploy@192.168.10.50 backup@172.16.20.30 - 允许某用户从整个网段登录(推荐用于内网稳定环境):
AllowUsers ops@192.168.1.0/24 - 若仅按 IP 限制、不限定具体用户(不建议生产环境使用):
AllowUsers *@192.168.1.0/24
配置与生效关键步骤
写错位置或跳过验证极易导致锁死,务必按顺序操作:
- 编辑配置文件:
sudo vi /etc/ssh/sshd_config,把AllowUsers行加在文件末尾(避免被其他规则覆盖) - 语法检查:
sudo sshd -t,输出Configuration file /etc/ssh/sshd_config ok才继续 - 重载服务(不是重启):
sudo systemctl reload sshd—— 这样不会断开当前会话 - 预留一个未受限的备用连接(如本地终端、另一台已授权机器),以防配置失误
注意 IP 匹配的真实行为
OpenSSH 默认可能触发反向 DNS 查询,影响匹配结果:
- 即使你写了
user@192.168.1.100,sshd 仍可能尝试解析该 IP 对应的主机名再比对 - 若内网无反向 DNS 或解析不稳定,可能导致合法连接被意外拒绝
- 解决方法:在
sshd_config中添加UseDNS no并重载,可彻底关闭此行为,提升稳定性和速度
别混用已失效的旧机制
/etc/hosts.allow 和 /etc/hosts.deny 在主流发行版(CentOS Stream 9、RHEL 8+、Ubuntu 20.04+)中默认不生效——因为 OpenSSH 编译时通常未启用 libwrap 支持。强行配置不仅无效,还可能掩盖真实问题。应完全依赖 sshd_config 的原生机制。











