服务器如何限制 ssh 登录 ip

liulian
liulian 正式会员超兽战士
发布于 2026-10-07 18:05 ·0 浏览 ·0 回复

照着做完,你能把服务器的 SSH 登录来源锁死在你信任的几个 IP 上,其它地址连 22 端口都摸不到。

下面按「先留后路、再层层加锁、最后验证」的顺序来,每一步都可以单独生效,也可以叠加使用。

第一步:确认自己的 IP 并备份配置

这一步要拿到你当前的真实出口 IP,并给 SSH 配置留一份可回滚的副本,做完之后后面改错了能马上还原。

在服务器上执行:

curl -s ifconfig.me; echo
ss -tnp | grep ':22'

第一条输出你的公网 IP(比如 203.0.113.10),第二条列出当前正在连 22 端口的会话,方便你核对。然后备份:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)

注意:动手前务必另开一个终端窗口保持 SSH 登录不要断。很多限制规则一旦生效,你当前的连接会被立刻切断,没有第二个会话就只能去机房或云控制台开 VNC 救了。

第二步:用防火墙限制 22 端口(第一道闸)

这一步在网络层直接决定谁能连上 22 端口,做完后非白名单 IP 连 TCP 握手都完不成。

CentOS 7 / RHEL 8+ 用 firewalld(假设放行 203.0.113.10):

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port port="22" protocol="tcp" accept'
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
firewall-cmd --list-all

Ubuntu / Debian 用 ufw:

ufw allow from 203.0.113.10 to any port 22 proto tcp
ufw delete allow 22/tcp
ufw status numbered

老系统直接用 iptables:

iptables -A INPUT -p tcp --dport 22 -s 203.0.113.10 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables-save > /etc/iptables/rules.v4

注意:remove-service=ssh 或 delete allow 22/tcp 必须在加上白名单规则之后再执行,顺序反了会把所有 22 端口流量先放行再删规则,等于白做。另外如果你的 SSH 改过端口,把命令里的 22 换成实际端口。

第三步:在 sshd_config 里做用户级白名单

防火墙管的是「能不能连上」,这一步管的是「哪个用户从哪个 IP 能认证」,做完后即使端口开着,非白名单来源也过不了认证。

编辑 /etc/ssh/sshd_config,在文件末尾追加:

AllowUsers alice@203.0.113.10 bob@192.168.1.*

或者按网段放开:

Match Address 203.0.113.0/24,192.168.1.0/24
    PermitRootLogin yes
Match all

改完先做语法检查再重载,不要直接 restart:

sshd -t
systemctl reload sshd

注意:AllowUsers 一旦写了,没列进去的用户全部无法登录,包括 root。写完先用 sshd -t 确认没报错,再 reload(不是 restart,reload 不会踢掉现有连接)。

第四步:用 hosts.allow / hosts.deny 兜底(可选)

这一步依赖 libwrap,只在部分发行版默认编译的 sshd 上有效,做完后是最外层的一道软限制。

先确认是否支持:

ldd $(which sshd) | grep libwrap

有输出才继续。编辑 /etc/hosts.deny 写 sshd: ALL,编辑 /etc/hosts.allow 写:

sshd: 203.0.113.10 192.168.1.

注意:新版 OpenSSH(多数 8.x 及以后)在编译时已不带 libwrap,这条命令没输出就说明此法无效,别在上面浪费时间,直接用前面三步。

第五步:验证限制是否真的生效

这一步从「非白名单 IP」实测一次,确认得到的是拒绝而不是登录成功。

在其它网络的机器上执行:

ssh -o ConnectTimeout=5 root@你的服务器IP

预期结果是 Connection refused(防火墙拦截)或 Permission denied (publickey)(sshd 白名单拦截)。同时在服务器上核对:

sshd -T | grep -iE 'allowusers|denyusers'
iptables -L INPUT -n --line-numbers | head

输出里能看到你的规则就说明配置已加载。

小结

  • 顺序是关键:先保持第二个登录会话,再改配置,最后才 reload。
  • 防火墙(firewalld / ufw / iptables)解决「能否连上」,AllowUsers 和 Match Address 解决「能否认证」,两层叠加最稳。
  • hosts.allow 依赖 libwrap,先 ldd 确认再动手。
  • 改 sshd_config 后先 sshd -t 检查语法,用 systemctl reload sshd 而不是 restart。
  • 每次改完,都要从非白名单网络实测一次,别只看配置文件。
版权声明:本文来自 GJ站长论坛《服务器如何限制 ssh 登录 ip》
原文链接:https://www.gj0.com/thread-458.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~