allowusers是最轻量且优先级最高的ssh用户级白名单机制,认证前过滤请求,仅放行明确列出的“用户名@ip”组合,不匹配者无密码提示;需语法校验后重启sshd生效,支持*和?通配符,不支持正则。

直接在 SSH 服务层设白名单,是最清晰、最可控的方式。核心就是用 AllowUsers 指令精确指定“谁 + 从哪”能登录,其他一概拒绝。
用 AllowUsers 精确控制用户与来源 IP
编辑 /etc/ssh/sshd_config,在文件末尾添加 AllowUsers 行:
- 格式必须是
用户名@IP地址或用户名@CIDR网段,中间不能有空格,多个条目用空格分隔 - 支持 IPv4 和 IPv6,例如:
admin@192.168.1.100、deploy@2001:db8::1/64 - 如果只限制 IP 不限定用户,可写成
AllowUsers *@192.168.5.0/24;但生产环境建议始终绑定具体用户名 - 示例配置:
AllowUsers root@203.0.113.12 admin@192.168.10.5 deploy@2001:db8::/64
保存后执行 sudo systemctl restart sshd 生效。注意:重启会断开当前连接,务必提前确保有控制台(如云平台 VNC)或留一个未关闭的本地终端备用。
防火墙级白名单:iptables 或 firewalld
这类方法在内核层面拦截,不依赖 SSH 服务本身,适合多服务统一管控或新版 OpenSSH 已禁用 tcp_wrappers 的系统。
- iptables:规则顺序至关重要。先插入允许规则到 INPUT 链顶部,再设默认策略为 DROP
例如:sudo iptables -I INPUT 1 -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
然后:sudo iptables -P INPUT DROP,最后保存规则 - firewalld:避免用
--add-source(它只把 IP 加入 zone,不自动限制端口)。应使用 rich rule:sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept'
执行firewall-cmd --reload生效
hosts.allow / hosts.deny(仅限启用 libwrap 的系统)
该方式依赖 tcp_wrappers 库,Ubuntu 22.04+、RHEL 9+ 等新版系统默认已禁用,需先确认是否生效:
- 运行
sshd -T | grep use_pam,若输出use_pam yes,再检查/etc/pam.d/sshd是否加载pam_access.so - 若可用,编辑
/etc/hosts.allow添加:sshd: 192.168.1.100 : allow - 再在
/etc/hosts.deny中写:sshd: ALL - 无需重启 sshd,规则立即生效;但优先级低于防火墙,且不支持端口或协议细化
验证与防锁死要点
无论选哪种方式,上线前都必须验证,防止误操作导致自己无法登录:
- 始终保留一个本地控制台或带 VNC 的云平台访问通道
- 测试时先加一条自己的 IP 规则,确认能连上,再逐步收紧
- iptables/firewalld 规则要检查顺序:
iptables -nL INPUT --line-numbers;firewalld 查看:firewall-cmd --list-all - 修改
sshd_config后,可用sudo sshd -t检查语法是否正确,再重启











