最直接有效的方式是在 /etc/ssh/sshd_config 中用 allowusers 设置用户+ip组合白名单,格式为 username@ip_address 或 username@cidr_net(如 admin@192.168.1.100、dev@10.0.0.0/24),多条目空格分隔;配置后须执行 systemctl restart sshd 生效,并建议先运行 sshd -t 验证语法。

最直接有效的方式是在 /etc/ssh/sshd_config 中用 AllowUsers 设置用户+IP组合白名单。它原生支持、认证前拦截、无需额外服务,且在现代系统(如 RHEL 8+/Ubuntu 20.04+)中稳定可靠——而 /etc/hosts.allow 等传统方式已基本失效。
明确写法与格式要求
AllowUsers 不接受模糊匹配,必须严格遵循语法:
- 格式为
username@ip_address或username@cidr_net,中间不能有空格 - 支持 CIDR 表示法(如
192.168.1.0/24),但不支持通配符(192.168.1.*是非法的) - 多个条目用空格分隔,例如:
AllowUsers admin@192.168.1.100 dev@10.0.0.0/24 - 若只按 IP 限制、不限定用户,可写作
AllowUsers *@192.168.1.0/24,但生产环境建议始终绑定具体用户
配置后必须重启 SSH 服务
修改保存后,需执行以下命令使规则生效:
- systemctl restart sshd(主流 systemd 系统)
- service ssh restart(部分旧版 Debian/Ubuntu)
- 重启前建议先用
sshd -t检查配置语法是否正确,避免锁死连接
注意 IP 匹配的实际行为
OpenSSH 并非简单比对原始源 IP,而是可能触发反向 DNS 查询(gethostbyaddr)。这意味着:
- 即使你写了
user@192.168.1.100,OpenSSH 仍可能尝试解析该 IP 对应的主机名再做匹配 - 若 DNS 解析不稳定或返回不一致结果(如内网无反解),可能导致预期外的拒绝
- 在确定网络环境可控的前提下,推荐优先使用 CIDR 网段(如
/24)而非单 IP,提升容错性
别把 DenyUsers 当主力方案
DenyUsers 适合临时封禁个别账号或 IP,但它是黑名单逻辑,防御面窄、易遗漏:
- 未列入
DenyUsers的任意用户+任意 IP 都可尝试登录 - 无法替代
AllowUsers的白名单本质——后者默认拒绝所有未明列项,安全边界更清晰 - 两者共存时,
AllowUsers优先级更高,但混用会增加维护复杂度,不推荐常规部署











