最直接可靠的方式是用iptables或nftables在tcp层封禁源ip:sudo iptables -a input -p tcp --dport 22 -s 203.0.113.45 -j drop,早于ssh认证,零延迟;denyusers和hosts.deny因兼容性、优先级或依赖dns等问题不推荐。

Linux 中禁止指定 IP 访问 SSH,最直接的方式不是靠黑名单(如 DenyUsers),而是用防火墙规则——因为 DenyUsers 本质是“用户+IP”组合的黑名单,它不支持纯 IP 级别的拒绝,且优先级低、覆盖不全。
推荐方案:用 iptables 或 nftables 封禁源 IP
这是真正意义上按 IP 地址拦截 SSH 连接的可靠方法,发生在 TCP 层,早于 SSH 认证流程,零延迟响应。
-
封单个 IP(例如 203.0.113.45):
sudo iptables -A INPUT -p tcp --dport 22 -s 203.0.113.45 -j DROP -
封整个网段(如 192.168.5.0/24):
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.5.0/24 -j DROP -
保存规则(避免重启失效):
CentOS/RHEL:运行sudo service iptables save或sudo iptables-save > /etc/sysconfig/iptables
Ubuntu/Debian:安装iptables-persistent后执行sudo netfilter-persistent save
备选方案:用 sshd_config 的 DenyUsers 配合 @IP 语法(有限适用)
仅当你要封的是「某个用户从某 IP 登录」时才有效,不能单独封 IP。例如:
-
DenyUsers baduser@203.0.113.45—— 封禁用户baduser从该 IP 登录 -
DenyUsers *@203.0.113.45—— 封禁所有用户从该 IP 登录(部分 OpenSSH 版本支持,但非标准行为,不保证兼容)
注意:此方式依赖 DNS 反向解析,若网络无反解或配置不稳定,可能失效;且一旦同时启用 AllowUsers,DenyUsers 会先触发,但无法替代防火墙的底层拦截能力。
不推荐方案:hosts.deny(已基本失效)
传统 /etc/hosts.deny 写法如 sshd: 203.0.113.45 看似简单,但现代发行版(RHEL 8+/Ubuntu 20.04+)默认未编译 libwrap 支持,ldd $(which sshd) | grep wrap 通常无输出,意味着该文件完全不生效。
验证是否生效
封禁后,从目标 IP 尝试 SSH,应立即断连或卡在连接阶段(无密码提示)。检查日志确认:
- 防火墙拦截:查看内核日志
sudo dmesg | tail -10或sudo journalctl -k | grep DROP - sshd 拒绝日志:
sudo grep "not allowed" /var/log/auth.log(仅对DenyUsers类规则有效)











