Linux如何配置主机访问控制_Linux /etc/hosts.allow拒绝策略【安全】

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.denysudo nano /etc/hosts.deny

2、写入全局拒绝规则:ALL: ALL

3、保存并退出编辑器。

4、打开/etc/hosts.allowsudo 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.equivsudo 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.denyecho "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检查配置语法与潜在冲突,输出中不应出现WarningError