服务器如何限制 ssh 登录 ip
照着做完,你能把服务器的 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。 - 每次改完,都要从非白名单网络实测一次,别只看配置文件。
原文链接:https://www.gj0.com/thread-458.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。