tcp wrappers 是服务级访问控制机制,通过 /etc/hosts.allow 和 /etc/hosts.deny 实现源ip控制,需验证服务是否支持 libwrap、正确配置规则并注意优先级与备份。

TCP Wrappers 是一种轻量级、服务级的访问控制机制,适用于支持 libwrap.so 的服务(如 sshd、vsftpd、rpcbind 等),通过 /etc/hosts.allow 和 /etc/hosts.deny 两个文件实现源 IP 控制。它不替代防火墙,但可作为服务层补充防护。
确认服务是否支持 TCP Wrappers
不是所有服务默认启用 TCP Wrappers,需先验证:
- 查服务二进制路径:
which sshd(以 sshd 为例) - 检查是否链接 libwrap:
ldd /usr/sbin/sshd | grep libwrap,有输出即支持 - 确认 vsftpd 等服务已启用该功能(如
vsftpd.conf中设置tcp_wrappers=YES)
配置 hosts.allow 和 hosts.deny 规则
规则按顺序匹配,hosts.allow 优先;一旦匹配即生效,不再读后续文件。语法统一为:服务名:客户端列表[:选项]
-
拒绝单个 IP 访问 SSH:在
/etc/hosts.deny中写入sshd: 192.168.1.100 -
拒绝整个网段:写
sshd: 192.168.1.0/24或sshd: 192.168.1.(后者匹配所有以该前缀开头的 IP) -
仅允许特定 IP,其余全拒:
/etc/hosts.allow写sshd: 203.0.113.5/etc/hosts.deny写sshd: ALL -
排除例外(EXCEPT):例如允许 192.168.10.0/24,但排除 192.168.10.100:
sshd: 192.168.10.0/24 EXCEPT 192.168.10.100
注意事项与常见问题
配置不当可能导致服务不可用,务必注意:
- 修改前备份:
sudo cp /etc/hosts.{allow,deny} /root/hosts.backup - 确保
hosts.allow中没有覆盖性规则(如ALL: ALL),否则hosts.deny会被跳过 - 若同时配置了
hosts.allow和hosts.deny,只允许列表中的 IP 才能访问,其余由 deny 控制 - 某些新发行版(如较新 Ubuntu 或 CentOS Stream)默认未启用或弱依赖 TCP Wrappers,建议搭配 iptables/nftables 使用
验证与生效
TCP Wrappers 规则无需重启服务,加载后立即生效(连接建立时由 tcpd 拦截判断):
- 测试连接:从被禁 IP 尝试 SSH,应直接拒绝(无密码提示)
- 查看日志辅助诊断:
sudo tail -f /var/log/auth.log | grep refused(Ubuntu/Debian)或/var/log/secure(RHEL/CentOS) - 临时调试可加
spawn记录,例如:sshd: ALL : spawn echo "$(date): %c tried to connect" >> /var/log/tcprules.log











