tcp wrappers 通过 /etc/hosts.allow 和 /etc/hosts.deny 实现访问控制,优先匹配 hosts.allow,命中即放行;未命中则查 hosts.deny,命中即拒绝;均未命中则默认允许。

/etc/hosts.allow 和 /etc/hosts.deny 能实现基础白名单,但只对启用 TCP Wrappers 的服务有效,且在现代 Linux(尤其是 CentOS 8+/RHEL 8+、Ubuntu 20.04+)中已逐步弃用,不推荐作为主要访问控制手段。
确认服务是否支持 TCP Wrappers
不是所有服务都认这两个文件。关键看它是否链接了 libwrap:
ldd /usr/sbin/sshd | grep libwrap
- 输出含
libwrap.so→ 支持(常见于旧版 OpenSSH) - 无输出 → 不支持(新版 OpenSSH 默认不编译 libwrap,
sshd直接忽略这两个文件)
其他服务如 vsftpd、telnetd(若存在)可能支持,但需逐个验证。
白名单规则写法与优先级陷阱
规则顺序不重要,但匹配逻辑有固定流程:
- 系统先查
/etc/hosts.allow,找到第一条匹配就放行,不再往下看 - 没匹配上,才查
/etc/hosts.deny,匹配即拒绝 - 两个都没匹配 → 默认允许(这是最大安全盲区)
所以白名单必须显式“拒绝其余”,典型配置是:
在 /etc/hosts.allow 中写:
sshd: 192.168.1.10, 192.168.1.0/24
在 /etc/hosts.deny 中写:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
sshd: ALL
注意:
-
ALL是关键字,不是通配符字符串,不能写成all或"ALL" - IP 段可用 CIDR(如
192.168.1.0/24)或掩码形式(如192.168.1.0/255.255.255.0),但不支持192.168.1.*(该写法仅部分老版本兼容,不可靠) - 多个条目可用逗号分隔,但换行更清晰、不易出错
修改后是否需要重启服务?
不需要重启 sshd,TCP Wrappers 是运行时拦截,改完保存即生效(已建立的连接不受影响)。
但要注意:
- 修改后建议用另一终端测试新连接,避免锁死自己
- 若用
sshd且它不支持 libwrap,改了也完全无效——此时连日志都不会体现拒绝动作 - 某些发行版(如 CentOS 7)默认启用了
xinetd管理的服务才真正走这套机制,sshd是独立 daemon,行为更依赖编译选项
为什么生产环境不推荐依赖这两个文件?
- 它只作用于网络层入口,无法限制登录后行为(比如用户能执行什么命令)
- 不记录详细拒绝日志(
tcpd日志通常只进/var/log/secure,格式简陋) - 无法做速率限制、地理 IP 判断、动态封禁等
- CentOS 8+ / RHEL 8+ 默认不安装
tcp_wrappers包,/etc/hosts.allow和/etc/hosts.deny文件甚至可能不存在
真正可控的方式是用 firewalld(RHEL/CentOS)或 iptables/nftables 配置 INPUT 链规则,例如:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="ssh" reject'
这类规则层级更低、更可靠、可审计、可集成 fail2ban。
实际部署时,别只盯着 hosts.allow —— 先 ldd 验证支持性,再考虑是否值得投入维护成本。










