要彻底拒绝所有外部IP对支持TCP Wrappers的服务的连接,需在/etc/hosts.deny中写入“ALL: ALL”,并确保/etc/hosts.allow中无任何允许规则(包括localhost),且服务本身支持libwrap(如sshd、vsftpd等),否则需改用其他方案。

要让Linux服务器彻底拒绝所有外部IP对支持TCP Wrappers的服务(如sshd、vsftpd等)发起的连接请求,必须在/etc/hosts.deny中写入全局拒绝规则,并确保该规则不被/etc/hosts.allow中的任何条目覆盖。
确认服务是否支持TCP Wrappers
执行ldd /usr/sbin/sshd | grep libwrap,若输出含libwrap.so则说明sshd支持hosts.allow/deny;若无输出,该方法对SSH无效,需改用sshd_config或防火墙方案。
注意:并非所有服务都支持此机制,常见支持服务包括sshd、vsftpd、rpcbind、smbd;【systemd-journald、nginx、dockerd等现代服务默认不支持】。
编辑hosts.deny文件并写入全局拒绝规则
使用root权限打开文件:sudo vim /etc/hosts.deny。
在文件末尾新增一行:ALL: ALL。
这行表示:对所有支持TCP Wrappers的服务,拒绝来自所有IP地址的连接请求。格式中第一个ALL匹配全部服务名,第二个ALL匹配全部客户端地址,中间用冒号分隔,无需加:deny后缀——hosts.deny本就是拒绝清单,后缀可省略。
检查并清空hosts.allow中的冲突规则
运行sudo cat /etc/hosts.allow查看内容。
若存在类似sshd: 192.168.1.0/24或ALL: 127.0.0.1等允许规则,必须删除或注释掉它们——因为hosts.allow优先级高于hosts.deny,哪怕只有一条宽松规则,也会导致全局拒绝失效。
特别提醒:【localhost或127.0.0.1的允许规则也必须移除,否则本地登录仍可绕过】。
验证规则是否生效
第一步:保存并退出编辑器,无需重启任何服务——TCP Wrappers规则实时生效。
第二步:从另一台机器尝试SSH连接:ssh user@your-server-ip。
第三步:观察响应:若立即返回Connection refused(不是timeout、不是password prompt),说明hosts.deny已拦截成功。
第四步:在服务器本机执行sudo ss -tlnp | grep :22确认sshd仍在监听,排除服务崩溃误判。


















