/etc/hosts.allow优先于/etc/hosts.deny,需在hosts.allow中明确放行可信ip(如sshd:203.0.113.45,192.168.10.0/24),并在hosts.deny中统一拒绝其余所有连接(sshd:all),规则保存后即时生效且无需重启sshd。

直接限制特定 IP 访问生产服务器的 SSH 服务,核心目标是“只放行可信来源,其余一律拦截”。这不是单一配置能解决的事,而是需要分层设防、优先级明确的组合策略。实际生产环境中,推荐按以下顺序实施,兼顾有效性、可维护性与故障恢复能力。
用 /etc/hosts.allow + /etc/hosts.deny 实现快速生效的 IP 层过滤
这是最轻量、无需重启服务、规则即时生效的方式,适合紧急封禁或临时放行。它基于 TCP Wrappers,对 sshd 有效(前提是 OpenSSH 编译时启用了 TCP Wrappers 支持,主流发行版默认开启)。- 编辑
/etc/hosts.allow,添加允许规则(支持单 IP、CIDR 网段、多个条目用逗号分隔):sshd: 203.0.113.45, 192.168.10.0/24, 2001:db8::1
- 编辑
/etc/hosts.deny,统一拒绝其他所有连接:sshd: ALL
- 注意:
hosts.allow优先级高于hosts.deny,只要匹配到 allow 规则就放行,不再继续判断 deny。无需重启 sshd,保存即生效。
通过 /etc/ssh/sshd_config 的 AllowUsers 实现用户+IP 双重白名单
比单纯 IP 限制更严格——它同时校验用户名和来源 IP,防止不同用户共用同一 IP 绕过控制,适合精细化权限管理。- 在
/etc/ssh/sshd_config末尾添加(每行一个,支持通配符):AllowUsers admin@203.0.113.45 deploy@192.168.10.50 *@192.168.20.0/24
-
*@192.168.20.0/24表示该网段内任意用户名都可登录;admin@203.0.113.45则仅允许 admin 用户从该公网 IP 登录。 - 修改后必须重启服务:
sudo systemctl restart sshd
- 提示:若误配导致自己被锁,需通过云平台 VNC 控制台或物理终端登录修复。
用 iptables 或 nftables 做网络层硬隔离
这是最底层、最不可绕过的控制方式,直接在内核 netfilter 层拦截流量,不依赖 sshd 进程本身,防御暴力扫描和端口探测效果最好。- 示例(iptables,CentOS/RHEL 7+/Debian/Ubuntu):
# 先清空旧规则(谨慎!建议先备份或在 screen/tmux 中操作) sudo iptables -F INPUT # 放行指定 IP 的 22 端口 sudo iptables -A INPUT -p tcp --dport 22 -s 203.0.113.45 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.10.0/24 -j ACCEPT # 拒绝其他所有 SSH 请求 sudo iptables -A INPUT -p tcp --dport 22 -j DROP
- 保存规则(避免重启失效):
- Debian/Ubuntu:
sudo iptables-save | sudo tee /etc/iptables/rules.v4 - CentOS/RHEL:
sudo service iptables save
- Debian/Ubuntu:
- 若使用 nftables(较新系统),语法更简洁,且默认持久化更可靠。
配套加固建议:避免单点失效
- 禁用 root 远程登录:在 `sshd_config` 中设 `PermitRootLogin no`,强制使用普通账户 + `sudo`。 - 启用密钥认证并禁用密码:设 `PubkeyAuthentication yes` 和 `PasswordAuthentication no`,大幅降低爆破风险。 - 设置备用访问通道:如云厂商提供的 Web Console 或串口终端,确保网络层封锁后仍有应急入口。 - 记录登录尝试:确认 `/var/log/secure` 或 `/var/log/auth.log` 日志正常写入,便于事后审计。不复杂但容易忽略——真正关键的是测试与验证。每次修改后,务必用被允许和被拒绝的 IP 分别尝试连接,并检查日志(journalctl -u sshd -n 50)确认拦截是否生效。











