tcp wrappers规则直接生效无需重启,但仅对链接libwrap.so的服务有效;匹配顺序为hosts.allow→hosts.deny→默认放行;规则格式严格,须用英文冒号、无空格、服务名准确,cidr需转为通配符或掩码。

直接生效,无需重启服务,但必须确保目标服务实际链接了 libwrap.so;否则写进 /etc/hosts.allow 和 /etc/hosts.deny 完全无效。
确认服务是否受 TCP Wrappers 控制
不是所有 TCP 服务都支持 TCP Wrappers。关键看它是否在编译时链接了 libwrap.so。
- 运行
ldd $(which sshd) | grep libwrap,如果输出类似libwrap.so.0 => /lib64/libwrap.so.0,说明支持 - 对
vsftpd、telnet、rpcbind等也需单独验证,httpd(Apache)和nginx默认不支持 -
systemd托管的服务(如新版sshd)仍可支持,只要二进制本身含libwrap调用
/etc/hosts.allow 和 /etc/hosts.deny 的匹配优先级
策略按固定顺序执行:先 /etc/hosts.allow → 匹配即放行;未匹配则查 /etc/hosts.deny → 匹配即拒绝;两者都不匹配,默认放行。
- 同一 IP 同时出现在两个文件中,以
hosts.allow为准(例如sshd:192.168.43.134在 allow 中,sshd:192.168.43.134也在 deny 中,仍可登录) -
ALL:ALL在hosts.deny中是“拒绝所有”,但不会覆盖hosts.allow中更具体的允许规则 - 通配符
*匹配任意长度字符,?只匹配单个字符(如192.168.43.4?匹配192.168.43.40–192.168.43.49)
典型策略写法与常见错误
格式必须是 服务名:客户端地址,中间用英文冒号,**不能有空格**,服务名用实际二进制名(如 sshd,不是 ssh 或 openssh)。
- 只允许 192.168.10.0/24 网段访问
sshd:sshd:192.168.10.*写入/etc/hosts.allow,sshd:ALL写入/etc/hosts.deny - 允许特定域名(如
.example.com):vsftpd:.example.com— 注意开头的点,表示“该域下所有子主机” - 错误写法:
sshd : 192.168.10.0/24(带空格)、SSH:192.168.10.0(服务名大小写/拼写错误)、sshd:192.168.10.0/24(CIDR 格式不被 TCP Wrappers 原生支持,应改用192.168.10.或192.168.10.0/255.255.255.0)
日志与调试:为什么规则没生效?
TCP Wrappers 拒绝连接时默认会记录到 /var/log/messages 或 /var/log/secure(取决于 syslog 配置),关键词是 tcpd 或服务名。
- 检查拒绝日志:
grep "sshd.*refused" /var/log/secure或journalctl -u sshd | grep tcpd - 若完全无日志,大概率是服务未调用
libwrap,或配置文件语法错误(如中文冒号、不可见 Unicode 字符) - 临时测试可用
tcpdmatch sshd 192.168.10.5模拟判断逻辑(需安装tcp_wrappers包)
真正容易被忽略的是:TCP Wrappers 不处理 UDP 服务,也不干预已建立连接后的数据内容;它只做连接初始阶段的 IP/域名白名单校验。一旦服务程序自身绕过 libwrap(比如用 systemd-socket 激活方式启动),规则就彻底失效 —— 这时候得回头确认 ldd 输出,而不是反复修改配置文件。











