/etc/hosts.allow和hosts.deny通过tcp wrappers实现服务访问控制,先匹配allow放行、再匹配deny拒绝、都不匹配则默认放行;需服务链接libwrap.so库才生效,openssh 6.7+等新版已移除支持。

直接用 /etc/hosts.allow 和 /etc/hosts.deny 就能限制服务的IP访问,不用重启服务,改完即生效。核心逻辑是“先匹配 allow,再匹配 deny,都不匹配则默认放行”。关键前提是:目标服务必须调用 libwrap.so 库(如旧版 OpenSSH、vsftpd、telnetd 等),否则配置无效。
确认服务是否支持 TCP Wrappers
不是所有服务都受控。判断方法很简单:
- 查服务主程序路径:
which sshd(比如输出/usr/sbin/sshd) - 检查是否链接 libwrap:
ldd /usr/sbin/sshd | grep libwrap - 有输出(如
libwrap.so.0 => /lib64/libwrap.so.0)说明支持;无输出则不支持 - 注意:OpenSSH 6.7+ 已移除对 TCP Wrappers 的支持,RHEL/CentOS 8+、Ubuntu 20.04+ 默认不生效
配置文件写法与优先级规则
两个文件语法一致:服务名 : 客户端地址 : 动作,动作可省略(allow 和 deny 是默认行为):
-
/etc/hosts.allow:匹配即放行,不再看 deny —— 优先级最高 -
/etc/hosts.deny:仅当 allow 中无匹配时才检查,匹配即拒绝 - 地址支持多种形式:
192.168.1.100、192.168.1.(网段前缀)、192.168.1.0/24、.example.com、ALL、LOCAL - 多个服务或地址用逗号分隔,例如:
sshd,vsftpd : 192.168.5.0/24,10.0.0.1
常用安全场景配置示例
以实际需求为导向,直接套用:
-
只允许某 IP 登录 SSH:
/etc/hosts.allow中写:sshd : 203.123.45.67/etc/hosts.deny中写:sshd : ALL -
禁止整个网段访问 FTP:
/etc/hosts.deny中写:vsftpd : 172.16.0. -
允许本机及指定内网,其余全拒(推荐白名单模式):
/etc/hosts.allow中写:ALL : 127.0.0.1, 192.168.10.0/24, .mycorp.local/etc/hosts.deny中写:ALL : ALL
验证与排错要点
配置后立即生效,但容易因格式或逻辑出错而失效:
- 确保文件无中文标点、多余空格或拼写错误(如
shhd写成sshd) - 地址写法要规范:用
192.168.1.表示 C 类网段,不要写192.168.1.0/255.255.255.0(旧式写法已不推荐) - 测试时用另一台机器尝试连接,同时查看日志:
tail -f /var/log/secure或/var/log/messages,成功拦截会记录refused connect from - 若配置无效,先确认服务版本是否支持;再检查是否被更高层防火墙(如 firewalld)提前拦截











