TCP Wrappers 可通过 /etc/hosts.allow 和 /etc/hosts.deny 实现 SSH 细粒度访问控制,无需重启服务;需验证 sshd 是否链接 libwrap.so,正确配置允许 IP/网段/主机名及 deny 中的 sshd: ALL 兜底规则。

直接用 /etc/hosts.allow 和 /etc/hosts.deny 两文件就能对 SSH(即 sshd)做细粒度访问控制,无需改防火墙或重启服务。关键在于策略顺序和语法准确。
确认 SSH 服务支持 TCP Wrappers
大多数现代 Linux 发行版(如 CentOS/RHEL 7+、Ubuntu 20.04+)的 OpenSSH 默认已链接 libwrap.so,但需验证:
- 运行
ldd $(which sshd) | grep libwrap,若输出含libwrap.so表示支持 - 若无输出,说明未启用——需重装带 TCP Wrappers 支持的 OpenSSH,或改用
iptables/nftables或sshd_config中的AllowUsers/DenyUsers
配置 hosts.allow 允许指定来源
只允许特定 IP、网段或主机名连接 SSH,其余默认拒绝。编辑 /etc/hosts.allow:
- 写法示例:
sshd: 192.168.10.5, 2001:db8::1(允许多个 IPv4/IPv6 地址,用逗号分隔) - 允许整个子网:
sshd: 10.0.2.0/24或sshd: 172.16.0.(注意末尾点表示前缀匹配) - 允许特定主机名(需 DNS 可解析):
sshd: admin-pc.example.com - 多服务可合并:
sshd: 192.168.1.100 ; vsftpd: 192.168.1.100
配置 hosts.deny 拒绝其余所有连接
这是“黑名单兜底”机制,确保未显式允许的请求被拦截。编辑 /etc/hosts.deny:
- 标准写法:
sshd: ALL(拒绝所有未在hosts.allow中明确放行的 SSH 连接) - 也可加日志提示:
sshd: ALL : spawn /bin/echo `date` ssh denied from %a >> /var/log/tcpwrappers.log - 注意:如果
hosts.allow为空或没匹配项,hosts.deny的ALL就生效;反之,只要allow里有一条匹配,就跳过deny文件
验证与排错要点
改完配置后不需重启 sshd,TCP Wrappers 规则实时生效:
- 测试连接:
ssh user@your-server,从允许和禁止的 IP 分别尝试 - 查拒绝记录:
grep "sshd.*refused" /var/log/secure或journalctl -u sshd | grep refused - 常见陷阱:
sshd在配置中写成ssh(错误)、IP 写错掩码(如192.168.1.0/24应写为192.168.1.或用 CIDR 格式时确保系统支持)、DNS 解析失败导致主机名规则失效 - 临时禁用 Wrappers?可注释掉
hosts.allow所有行并设sshd: ALL在deny中,再观察是否仍拦截——可辅助判断是否真正生效

















