怎么设置 SSH 允许特定 IP 地址访问限制白名单

文章导读
为了提升服务器安全性,限制 SSH 访问来源是常见需求。最稳妥的方式是在 SSH 服务端配置文件中直接使用 AllowUsers 指令,配合用户名和 IP 地址进行绑定,这样能在服务层面直接拒绝未授权的连接请求。
📋 目录
  1. 查询当前客户端出口 IP
  2. 命令速用版
  3. 分步处理
  4. 紧急恢复方案
  5. 怎么验证是否生效
  6. 常见坑
  7. 参考来源
A A

为了提升服务器安全性,限制 SSH 访问来源是常见需求。最稳妥的方式是在 SSH 服务端配置文件中直接使用 AllowUsers 指令,配合用户名和 IP 地址进行绑定,这样能在服务层面直接拒绝未授权的连接请求。

先说结论:优先修改 sshd_config 配置 AllowUsers 规则,比防火墙更精准且不影响其他服务。

  • 先判断:确认当前登录会话正常,保留一个备用窗口防止锁死。
  • 优先做:在/etc/ssh/sshd_config 末尾添加 AllowUsers 用户@IP 规则。
  • 再验证:通过日志和非白名单 IP 测试连接,确认拦截生效。

查询当前客户端出口 IP

在修改配置前,务必确认当前登录使用的公网 IP 地址,避免将自己排除在白名单之外。

# 方法 1:通过外部服务查询(推荐)
curl ifconfig.me

# 方法 2:查看 SSH 连接环境变量
echo $SSH_CONNECTION | awk '{print $1}'

命令速用版

# 编辑配置文件
sudo vi /etc/ssh/sshd_config

# 添加规则 (示例:允许 admin 从 192.168.1.100 登录)
# 注意:如果已有 AllowUsers 行,请在该行末尾追加,不要覆盖
AllowUsers admin@192.168.1.100

# 重载服务 (不要 restart,避免断开当前连接)
sudo systemctl reload sshd

分步处理

1. 备份配置文件:修改前务必备份,防止语法错误导致服务无法启动。

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

2. 编辑配置:打开配置文件,查找是否存在 AllowUsers 行。

怎么设置 SSH 允许特定 IP 地址访问限制白名单
  • 若存在:在该行末尾空格分隔追加新的 用户@IP 规则。
  • 若不存在:在文件末尾添加新行。
  • 格式必须是 用户名@IP 地址,多个条目用空格分隔。
AllowUsers ops@192.168.1.10 deploy@192.168.1.11

3. 检查语法:部分系统支持 sshd -t 检查配置语法。

sudo sshd -t

4. 重载服务:使用 reload 而非 restart,确保当前会话不中断。操作前请确保至少有一个备用 SSH 会话保持登录状态。

sudo systemctl reload sshd

紧急恢复方案

若配置错误导致无法 SSH 连接,请勿惊慌,按以下步骤恢复:

怎么设置 SSH 允许特定 IP 地址访问限制白名单
  • 云服务器:登录云厂商控制台,使用 VNC 或远程连接功能登录服务器,还原备份配置文件。
  • 物理服务器:通过本地显示器和键盘直接操作,或联系机房运维重启进入单用户模式。
  • 恢复命令:将备份文件复制回去并重载服务。
sudo cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config
sudo systemctl reload sshd

怎么验证是否生效

1. 查看日志:尝试从非白名单 IP 连接,查看服务端日志。

# CentOS/RHEL
sudo tail -n 20 /var/log/secure
# Ubuntu/Debian
sudo tail -n 20 /var/log/auth.log

成功拦截通常会显示 User not allowed because not listed in AllowUsers。

2. 实际连接:从白名单 IP 测试登录应成功,从其他 IP 测试应直接被拒绝或无密码提示。

常见坑

  • 把自己锁在外面:配置生效前务必保留一个已登录的备用会话,确认新规则无误后再关闭。
  • 配置覆盖:修改时若直接新增一行 AllowUsers 而注释掉原有行,会导致原有授权用户无法登录,务必合并配置。
  • 忽略本地回环:如果配置了防火墙白名单,需显式放行 127.0.0.1,否则本机 SSH 可能失败。
  • hosts.allow 失效:现代 Linux 发行版(如 CentOS Stream 9、Ubuntu 20.04+)默认可能不编译 libwrap 支持,/etc/hosts.allow 可能不生效,建议完全信任 sshd_config 原生机制。
  • 通配符限制:AllowUsers 支持 * 和?通配符,但不支持 CIDR 斜杠写法(如 192.168.1.0/24),网段限制需用 192.168.1.* 形式。

参考来源

更多详细参数说明可查阅官方手册:

  • man sshd_config