问题
业务反馈在容器中无法访问公司域名。
排查
在 主机 中,dig 解析失败,但 nslookup 解析正常。
dig a.b.com @8.134.218.80 nslookup a.b.com @8.134.218.80
怀疑是 dig 与 nslookup 有某些参数不同,导致在服务器上被拦截。于是,在云上部署了一个 coredns 服务,通过 15353 端口暴露服务;再从服务器上通过 dig 和 nslookup 进行解析,分析中间链路是否有问题。结果发现通过 15353 端口,在服务器上,两种方式都可以正常解析!
非 53 端口没有影响。
通过 tcpdump 在云上抓包后分析发现,dig 比之 nslookup 的包,多了 edns OPT。
确认问题:在服务器上 53 端口 + edns 的 DNS 包会拦截了。
接下来,进一步到容器中排查,发现 nslookup 也会解析失败。于是在主机上访问 coredns,此时的网络链路是:主机 -> coredns -> 公网 dns 服务器。即:经过 coredns 的流量带上了 edns 参数。
原来是 coredns 中间商在搞事情。
在查看 coredns 配置、源码(版本: 1.8),发现:cache 插件中,设置 payload 2048。
因为 coredns 开启了 cahce 从而导致集群向公网发出的 dns 流量都带上了 edns。
措施
由于我们无法配置更改服务器网络,可以采取:
- 在 v1.8.3 版本,关闭 cache。
- 升级 coredns 版本,在其它版本,比如 v1.11.1 ,
cacheplugin 已经迁移 edns 的代码,调整到其它插件(rewrite)。