coredns 排查之开启 cache 时会 +edns opt

171 阅读1分钟

问题

业务反馈在容器中无法访问公司域名。

排查

主机 中,dig 解析失败,但 nslookup 解析正常。

dig a.b.com @8.134.218.80 nslookup a.b.com @8.134.218.80

image.png

怀疑是 dig 与 nslookup 有某些参数不同,导致在服务器上被拦截。于是,在云上部署了一个 coredns 服务,通过 15353 端口暴露服务;再从服务器上通过 dignslookup 进行解析,分析中间链路是否有问题。结果发现通过 15353 端口,在服务器上,两种方式都可以正常解析!

非 53 端口没有影响。

通过 tcpdump 在云上抓包后分析发现,dig 比之 nslookup 的包,多了 edns OPT。

确认问题:在服务器上 53 端口 + edns 的 DNS 包会拦截了。

接下来,进一步到容器中排查,发现 nslookup 也会解析失败。于是在主机上访问 coredns,此时的网络链路是:主机 -> coredns -> 公网 dns 服务器。即:经过 coredns 的流量带上了 edns 参数。

image.png

原来是 coredns 中间商在搞事情。

在查看 coredns 配置、源码(版本: 1.8),发现:cache 插件中,设置 payload 2048。

image.png

因为 coredns 开启了 cahce 从而导致集群向公网发出的 dns 流量都带上了 edns

措施

由于我们无法配置更改服务器网络,可以采取:

  1. 在 v1.8.3 版本,关闭 cache。
  2. 升级 coredns 版本,在其它版本,比如 v1.11.1 , cache plugin 已经迁移 edns 的代码,调整到其它插件(rewrite)。