在封禁SSH访问时,应当优先选用sshd_config的DenyUsers或iptables。原因在于,/etc/hosts.allow在OpenSSH 8.0+以及主流的新系统中,默认是不生效的。DenyUsers能够支持IP与用户的组合进行精准拦截,并且在认证之前就生效;iptables则是在网络层进行硬拦截,更为可靠。

Linux怎么禁止特定IP访问SSH

直接改 /etc/ssh/sshd_config 里的 DenyUsers 或用 iptables,别碰 /etc/hosts.allow —— 它在现代系统上基本不生效。

为什么 /etc/hosts.allow 多数时候没用

OpenSSH 8.0+ 版本默认就不链接 libwrap.so 了。怎么判断呢?运行 ldd /usr/sbin/sshd | grep wrap,要是返回空,那就说明TCP Wrappers根本没启用。像CentOS/RHEL 8+、Ubuntu 20.04+这些主流的发行版,都已经默认禁用这个机制了。所以啊,就算你在 sshd: 192.168.1.100 这里写了规则,它也不会触发,可别以为这样就“已经拦住了”,那只是个错觉。

用 sshd_config 的 DenyUsers 精准封禁 IP+用户组合

这是原生支持、认证前拦截、语义明确的方式,适合临时封禁或细粒度控制。

示例:

DenyUsers deploy@203.0.113.45 root@192.168.5.0/24

改完后必须运行 sudo systemctl restart sshd,否则不生效。注意:重启会断开当前连接,务必留一个控制台会话或 VNC 备用。

用 iptables 在网络层硬拦截(最底层、最可靠)

不依赖 SSH 进程,直接在内核 netfilter 层 drop 包,防暴力扫描和端口探测效果最好,适合长期封禁或高危 IP。

最小可行命令(仅封一个 IP):

sudo iptables -A INPUT -p tcp --dport 22 -s 203.0.113.45 -j DROP

这条规则立即生效,且比任何 SSH 层配置都早一步拦截。

真正难的是判断封禁层级:单个恶意 IP 用 DenyUsers 快速响应;批量扫段或已知攻击源网段,必须上 iptables;而 /etc/hosts.allow 只适合老系统或临时测试,生产环境别依赖它。

本文转载于:https://www.php.cn/faq/3029458.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。