tcp wrappers真正生效的关键是服务进程必须链接并调用libwrap.so库,而非仅修改配置文件;需用ldd验证支持性,规则按顺序精确匹配,配合hosts.deny实现白名单隔离。

要让 TCP Wrappers 真正起作用,关键不是改配置文件,而是确保服务进程实际调用 libwrap.so 库,并按规则顺序精确匹配。它不修改网络包,也不依赖内核防火墙,而是在连接进入服务主逻辑前就拦截判断。
确认服务是否真正支持 TCP Wrappers
很多服务看似能配,实则完全无视 hosts.allow/deny —— 因为它们根本没链接 libwrap。
- 运行
ldd $(which sshd) | grep libwrap,有输出(如libwrap.so.0 => /lib64/libwrap.so.0)才表示支持 - 常见支持的服务:OpenSSH 的
sshd(Debian/Ubuntu 默认启用,CentOS 8+ 默认禁用)、vsftpd、in.ftpd、telnetd - 常见不支持的服务:
nginx、httpd、redis、dockerd、所有 systemd socket-activated 服务(如sshd.socket) - 若无输出,改 hosts.allow 完全无效,别浪费时间调试规则
写对规则格式,空格和换行都是硬伤
TCP Wrappers 解析器严格遵循 POSIX 文本规范,一个多余空格或缺失换行都会导致整行失效。
- 服务名必须是二进制名(如
sshd,不是ssh或openssh),且大小写敏感 - 冒号必须英文半角,前后不能有空格:
sshd:192.168.10.*✅,sshd : 192.168.10.*❌ - CIDR 不被原生支持:
sshd:192.168.10.0/24无效,应写成sshd:192.168.10.或sshd:192.168.10.0/255.255.255.0 - 文件最后一行必须以换行符结尾,否则该行被 POSIX 忽略
- 通配符
*匹配任意长度字符串,?只匹配单个字符(如192.168.10.4?匹配192.168.10.40–49)
用 hosts.deny 构建白名单边界
单独靠 hosts.allow 很难做到“只允许可信来源”,必须配合 hosts.deny 实现默认拒绝。
- 在
/etc/hosts.deny中写入ALL: ALL—— 拒绝所有服务的所有来源 - 在
/etc/hosts.allow中只写明确允许的条目,例如:sshd:192.168.10.100vsftpd:172.16.0.0/255.255.0.0ALL: LOCAL(允许本地回环及本机发起的连接) - 这样,任何未显式列入 allow 的请求,都会被 deny 文件兜底拦截
用 tcpdmatch 验证,别靠盲连测试
改完配置后,用 tcpdmatch 模拟匹配过程,它不发包、不连端口,只做纯文本和掩码解析。
- 命令示例:
tcpdmatch sshd 192.168.10.5,输出access granted via /etc/hosts.allow或access denied via /etc/hosts.deny - 若提示
no such process,说明系统未安装 tcp_wrappers 包(CentOS/RHEL 运行yum install tcp_wrappers,Debian/Ubuntu 运行apt install tcpd) - 注意:
tcpdmatch不触发 DNS 反查,也不校验PARANOID类规则,但足以验证 IP、掩码、服务名三级匹配是否成立











