Linux中限制主机访问需配置/etc/hosts.allow和/etc/hosts.deny实现TCP Wrappers控制,按先allow后deny顺序匹配,默认允许;支持服务需链接libwrap.so,推荐全局deny+白名单allow,可辅以shosts.equiv、iptables联动及日志验证。

如果您在Linux系统中需要限制特定主机对服务的访问,则可以通过配置/etc/hosts.allow和/etc/hosts.deny文件实现基于TCP Wrappers的访问控制。以下是具体实施步骤:
一、理解TCP Wrappers匹配顺序与默认策略
TCP Wrappers按固定顺序读取规则:先检查/etc/hosts.allow,若匹配则允许访问;未匹配则继续检查/etc/hosts.deny,若匹配则拒绝;两者均不匹配时默认允许。因此,拒绝策略必须通过合理组合两个文件实现。
1、确认目标服务支持TCP Wrappers:运行ldd /usr/sbin/sshd | grep libwrap,输出含libwrap.so即表示支持。
2、检查/etc/hosts.deny是否已存在全局拒绝规则,例如ALL: ALL。
3、确保/etc/hosts.allow中为需放行的主机或网络段显式声明许可规则。
二、配置全局拒绝后白名单放行
该方法通过在/etc/hosts.deny中设置全面拒绝,再于/etc/hosts.allow中逐条添加可信主机,实现最小权限原则下的访问控制。
1、使用文本编辑器打开/etc/hosts.deny:sudo nano /etc/hosts.deny。
2、写入全局拒绝规则:ALL: ALL。
3、保存并退出编辑器。
4、打开/etc/hosts.allow:sudo nano /etc/hosts.allow。
5、添加单个IP放行:sshd: 192.168.1.100。
6、添加子网段放行:vsftpd: 10.0.0.0/255.0.0.0。
7、添加主机名放行:httpd: webadmin.example.com。
三、使用shosts.equiv实现基于用户与主机的联合控制
该方法利用/etc/shosts.equiv文件,在启用rlogin、rsh等传统服务时,结合用户身份与源主机进行双重校验,增强拒绝策略的粒度。
1、确认相关服务已启用TCP Wrappers且未被systemd socket直接接管。
2、创建或编辑/etc/shosts.equiv:sudo touch /etc/shosts.equiv && sudo chmod 600 /etc/shosts.equiv。
3、禁止某用户从特定主机登录:在文件中写入-user@192.168.5.20(开头短横表示拒绝)。
4、禁止整个网段的所有用户:-@172.16.0.0/16。
5、重启对应服务使规则生效:sudo systemctl restart rsh.socket(如启用socket方式)。
四、结合iptables临时阻断配合hosts.deny持久化
当需立即切断恶意连接并同步更新持久化拒绝规则时,可先用iptables快速拦截,再将IP写入/etc/hosts.deny以保障重启后持续生效。
1、查看当前异常连接:sudo ss -tunp | grep :22 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr。
2、对高频可疑IP执行临时封禁:sudo iptables -A INPUT -s 203.0.113.45 -j DROP。
3、将该IP追加至/etc/hosts.deny:echo "ALL: 203.0.113.45" | sudo tee -a /etc/hosts.deny。
4、验证规则加载:sudo tcpdmatch sshd 203.0.113.45,输出access denied即生效。
五、验证拒绝策略是否正确触发
在完成配置后,必须通过实际连接测试确认拒绝逻辑符合预期,避免因语法错误或顺序问题导致策略失效。
1、从被拒绝主机执行测试连接:telnet target-server 22。
2、检查系统日志中是否记录拒绝事件:sudo grep "refused connect" /var/log/messages或/var/log/secure。
3、确认日志中包含tcpd:前缀及对应服务名,例如tcpd[1234]: connection refused for sshd from 203.0.113.45。
4、使用tcpdchk -v检查配置语法与潜在冲突,输出中不应出现Warning或Error。










