最可靠方式是直接在/etc/ssh/sshd_config中用allowusers配置用户@ip白名单,支持*和?通配符、认证前拦截、需sshd -t校验后systemctl reload sshd生效,并应禁用密码认证、配合防火墙rich-rule实现纵深防御。

直接在 /etc/ssh/sshd_config 中用 AllowUsers 配置 IP 白名单,是最可靠、最轻量的 SSH 访问控制方式。它在认证前就完成匹配,不满足条件的连接连登录提示都不会出现,比防火墙或 TCP Wrappers 更早拦截,也更难绕过。
用 AllowUsers 实现精确的用户+IP 组合白名单
AllowUsers 支持 用户名@IP地址 格式,匹配成功才允许后续认证流程。一条规则就能同时限定“谁”和“从哪来”,无需额外服务或模块。
- 只允许 admin 从堡垒机(10.10.5.100)登录:
AllowUsers admin@10.10.5.100 - 允许多个用户来自不同来源,用空格分隔:
AllowUsers deploy@192.168.10.* backup@172.16.*.* monitor@127.0.0.1 - 支持通配符
*和?,但不支持 CIDR(如192.168.1.0/24),需展开写成192.168.1.* - 规则必须写在配置文件末尾,且所有
AllowUsers条目建议放在同一行,避免换行导致解析失败
配合密钥认证,提升准入门槛
仅靠 IP 白名单还不够——如果攻击者已渗透到白名单 IP 内部,仍可能发起攻击。因此必须禁用密码登录,强制使用 SSH 密钥对。
- 全局关闭密码认证:
PasswordAuthentication no - 确保公钥认证开启:
PubkeyAuthentication yes - 用户
~/.ssh/authorized_keys权限不能高于644,私钥文件权限必须为600 - 这样就把访问条件变为“来源可信(IP)+ 身份可信(用户)+ 持有凭证(私钥)”,形成三重校验
用 firewall 或 rich-rule 补充网络层白名单
AllowUsers 是应用层控制,而防火墙是网络层控制。两者叠加可实现纵深防御。推荐使用 firewalld 的 rich-rule,而非简单开 service。
- 先清除已有 SSH service 规则:
firewall-cmd --permanent --remove-service=ssh - 显式放行可信 IP:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.5.100" service name="ssh" accept' - 务必加本机回环:
source address="127.0.0.1",否则ssh localhost会失败 - 添加明确拒绝规则(放在所有 accept 之后):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="ssh" reject' - 执行
firewall-cmd --reload前,先运行firewall-cmd --permanent --list-all | grep "rich rules"确认顺序和内容
验证与安全加固要点
改完配置别急着重启,先做语法检查和渐进式生效,防止被锁死。
- 检查配置语法:
sudo sshd -t,返回无错误再继续 - 重载而非重启服务:
sudo systemctl reload sshd,避免连接中断 - 操作前备份原配置:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak - 测试时保留一个已登录会话,确认新规则生效后再退出
- 若同时用了
DenyUsers,注意它的优先级高于AllowUsers,通常不建议混用











