TCP Wrapper主机名控制生效需服务链接libwrap.so或由tcpd接管,且须启用DNS解析(如sshd -T | grep use_dns返回yes),同时正向与反向DNS记录严格一致,否则KNOWN/UNKNOWN宏不触发。
只有服务本身链接了,或者由接管启动,基于主机名的控制才真正生效;否则写再多规则也完全被忽略。
确认目标服务是否真的支持 TCP Wrapper 主机名匹配
主机名解析依赖服务进程主动调用
的反向 DNS 查找逻辑,不是系统自动“翻译”IP 为名字。很多服务(如新版
)虽链接
,但默认禁用主机名检查以提升性能或规避 DNS 延迟。
先验证是否链接库:
—— 有输出才继续
再查是否启用主机名匹配:
,若返回
才可能触发
/
宏匹配
静态编译服务(如某些定制
)需用
确认硬编码支持
注意:
管理的服务(如
)由
统一处理,主机名解析由
完成,不依赖子服务自身配置
中写主机名的几条硬约束
规则看似简单,但格式错一个字符就失效。TCP Wrapper 对空格、标点、大小写极其敏感,且不报错。
Docker Desktop(linux)
当前 Docker 最新稳定版本之一,主要针对稳定性和兼容性进行了修复优化,适合生产环境与日常开发使用。该版本继续强化 AI 开发支持、容器日志管理以及 Docker Engine 的安全能力,对 Windows/macOS/Linux 平台兼容性进行了进一步优化。
下载
必须用英文冒号
分隔服务名和客户端列表,前后不能有空格:
✅,
❌
FQDN 必须完整,
不匹配
;通配符只支持前导点:
匹配所有子域
IPv6 地址必须加方括号:
,写成
直接跳过匹配
文件末尾必须有换行符 ——
后没回车,最后一行会被内核静默丢弃
为什么
和
宏常不按预期工作
这两个宏不是“查 DNS 就行”,而是要求正向(A/AAAA 记录)与反向(PTR 记录)解析严格一致,且无超时。线上环境多数失败源于 DNS 配置不闭环。
:必须同时满足
返回
,且
返回
:PTR 记录不存在,或解析超时(
默认超时 30 秒,期间连接挂起)
:正向与反向记录存在但不对应(例如
,但
)
调试建议:临时在
加
,看日志里
字段是否为空或错误
实际部署中最容易被忽略的 DNS 依赖点
TCP Wrapper 不走
,它直接调用
和
,因此:
必须确保系统级 DNS 可用(
或
正常运行),
不能是空或仅含
却无本地 DNS 服务
禁止使用
自动配置的
作为唯一 nameserver ——
无法与该 socket 通信
若用私有 DNS,请在
中静态定义关键主机名(如
),绕过 DNS 查询
主机名规则生效后,
或
连接时观察 debug 输出中是否有
字样,这是匹配触发的关键信号
libwrap.sotcpdhosts.allowlibwrapsshdlibwrap.soldd $(which sshd) | grep libwrapsshd -T | grep use_dnsuse_dns yesKNOWNUNKNOWNvsftpdstrings $(which vsftpd) | grep -i 'hosts\.allow'xinetdin.telnetdtcpdtcpdhosts.allow:sshd:www.example.comsshd : www.example.comexample.comwww.example.com.example.comsshd: [2001:db8::1]sshd: 2001:db8::1echo "sshd:.trusted.org" >> /etc/hosts.allowKNOWNUNKNOWNKNOWNnslookup 192.168.1.100host.trusted.orgnslookup host.trusted.org192.168.1.100UNKNOWNtcpdPARANOIDhost.bad.org → 192.168.1.100192.168.1.100 → host.other.org/etc/hosts.denyALL: ALL : spawn /bin/echo "%a %h %d" >> /var/log/tcpwrap-debug.log%h/etc/nsswitch.confgethostbyaddr()gethostbyname()systemd-resolveddnsmasq/etc/resolv.conf127.0.0.1systemd-networkd127.0.0.53tcpd/etc/hosts192.168.1.10 admin.internaltelnetssh -vreverse mapping checking