抓包就明白CoreDNS域名解析

开发 前端
DNS 其实就是一个分布式的树状命名系统,它就像一个去中心化的分布式数据库,存储着从域名到 IP 地址的映射。k8s中利用CoreDNS进行域名解析。

[[407628]]

本文转载自微信公众号「运维开发故事」,作者allen_jol 。转载本文请联系运维开发故事公众号。

DNS 其实就是一个分布式的树状命名系统,它就像一个去中心化的分布式数据库,存储着从域名到 IP 地址的映射。k8s中利用CoreDNS进行域名解析。

在进行CoreDNS抓包之前先来了解几个概念

完全限定名称

完全限定域名(FQDN)就是互联网上计算机或者主机的完整域名。由主机名、域名、顶级域组成。FQDN= HostName + DomainName

如:域名 www.ayunw.cn ,实际上它应该是 www.ayunw.cn. ,而通常最后的点可以不写。最后的点被称为根域 www就是主机名,ayunw.cn就是域名,而.cn又被称为顶级域(一级域名),ayunw被称为二级域名,最后的点被称为 根域。

如:www.allen.ayunw.cn. ,其中最后的点被称为 根域(TLD),cn被称为顶级域(一级域名),ayunw被称为二级域名,allen被称为三级域名,www被称为主机名。

k8s中,非完全限定名称比如:demo-hello.paas.svc.cluster.local

无类域间路由(CIDR)

如:192.168.1.0/24。想要更好的对CIDR了解的可以自行谷歌查询详情,这里不展开说。

这里,我自己有一个域名叫 www.ayunw.cn ,然后这里我尝试用一个 paas 名称空间下的一个pod对 www.ayunw.cn 做 nslookup 域名解析。并且对某一个coredns的pod进行抓包分析。

为了测试,我这里用一个已经发布好测试的容器。进入容器,查看 /etc/resolv.conf 文件内容

  1. root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# cat /etc/resolv.conf 
  2. nameserver 10.10.0.2 
  3. search paas.svc.cluster.local svc.cluster.local cluster.local 
  4. options ndots:5 

在该容器中安装 nslookup 工具,然后对 www.ayunw.cn 域名进行解析

  1. [root@kube-master-srv1 ~]# kubectl get po -n paas 
  2. NAME                                                     READY   STATUS    RESTARTS   AGE 
  3. demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw               1/1     Running   0          11d 
  4.  
  5. [root@kube-master-srv1 ~]# kubectl exec -it demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw -n paas -- bash 
  6. root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# cat /etc/issue 
  7. Debian GNU/Linux 10 \n \l 
  8. root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# apt -y install dnsutils 

接着找到某一个coredns,然后去他所调度到的node节点通过nsenter进入网络名称空间进行抓包分析

  1. # 在k8s-master上查看coredns调度在哪个node 
  2. # 接着我就选择了第一个coredns 
  3. [root@kube-master-srv1 ~]# kubectl get po -n kube-system -o wide | grep coredns 
  4. coredns-69d9b6c494-4nrxt                   1/1     Running   0          96d   10.20.246.18    node2.core      <none>           <none> 
  5. coredns-69d9b6c494-6vjw4                   1/1     Running   0          96d   10.20.240.239   node3.core      <none>           <none> 
  6. coredns-69d9b6c494-pw5gx                   1/1     Running   0          96d   10.20.240.232   node3.core      <none>           <none> 
  7.  
  8.  
  9. # 登录到 node2.core 节点,找到coredns的pid 
  10. # 进入这个pid进入coredns容器的网络名称空间进行抓包过滤分析 
  11. [root@kube-node-srv2 ~]# docker ps -a | grep coredns 
  12. 4d38fd311a78        bfe3a36ebd25                                                                 "/coredns -conf /etc…"   3 months ago        Up 3 months       k8s_coredns_coredns-69d9b6c494-4nrxt_kube-system_803290a5-b4bd-4f2e-81b3-5ce82c9aa57c_0 
  13. 00722e50786b        registry.xx.xx/library/k8s.gcr.io/pause:3.2                     "/pause"                 3 months ago        Up 3 months       k8s_POD_coredns-69d9b6c494-4nrxt_kube-system_803290a5-b4bd-4f2e-81b3-5ce82c9aa57c_0 
  14. [root@kube-node-srv2 ~]# docker inspect -f {{.State.Pid}} 4d38fd311a78 
  15. 896949 
  16. [root@kube-node-srv2 ~]# nsenter -n -t 896949 
  17. [root@kube-node-srv2 ~]# ifconfig 
  18. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1380 
  19.         inet 10.20.246.18  netmask 255.255.255.255  broadcast 10.20.246.18 
  20.         ether 46:c1:e0:30:b4:9d  txqueuelen 0  (Ethernet) 
  21.         RX packets 1489941923  bytes 162419228606 (151.2 GiB) 
  22.         RX errors 0  dropped 0  overruns 0  frame 0 
  23.         TX packets 1488233127  bytes 297011464372 (276.6 GiB) 
  24.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0 
  25.  
  26. lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536 
  27.         inet 127.0.0.1  netmask 255.0.0.0 
  28.         loop  txqueuelen 1000  (Local Loopback) 
  29.         RX packets 83731165  bytes 6681735331 (6.2 GiB) 
  30.         RX errors 0  dropped 0  overruns 0  frame 0 
  31.         TX packets 83731165  bytes 6681735331 (6.2 GiB) 
  32.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0 

解析k8s集群的内部域名

这里说的集群内部域名就是 service的名字。我这里用的是kubernetes这个service来测试 连续解析6次,为了方便查看,我每执行一次解析,下面抓包的终端就敲一次回车。

  1. [root@kube-master-srv1 ~]# kubectl get svc kubernetes 
  2. NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE 
  3. kubernetes   ClusterIP   10.10.0.1    <none>        443/TCP   57d 
  4.  
  5. root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# nslookup kubernetes.default 
  6. Server:  10.10.0.2 
  7. Address: 10.10.0.2#53 
  8.  
  9. Name: kubernetes.default.svc.cluster.local 
  10. Address: 10.10.0.1 

抓包分析

以下是抓取kubernetes这个域名的DNS包的结果

  1. [root@kube-node-srv2 ~]# tcpdump -i eth0 port 53 | grep "kubernetes" 
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
  3. listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 
  4. 16:44:42.712421 IP 10.20.105.252.60020 > qing-core-kube-node-srv2.domain: 7282+ A? kubernetes.default.svc.cluster.local. (54) 
  5.  
  6. 16:44:48.883881 IP 10.20.105.252.ndm-agent-port > qing-core-kube-node-srv2.domain: 25500+ AAAA? kubernetes.default.svc.cluster.local. (54) 
  7.  
  8. 16:50:15.361021 IP 10.20.105.252.57205 > qing-core-kube-node-srv2.domain: 24061+ A? kubernetes.default.paas.svc.cluster.local. (59) 
  9.  
  10. 16:50:22.186723 IP 10.20.105.252.60715 > qing-core-kube-node-srv2.domain: 55799+ AAAA? kubernetes.default.svc.cluster.local. (54) 
  11. 16:50:27.813477 IP qing-core-kube-node-srv2.domain > 10.20.176.128.8181: 21787*- 1/0/0 PTR kubernetes.default.svc.cluster.local. (112) 
  12.  
  13.  
  14. 16:46:04.429250 IP 10.20.105.252.33895 > qing-core-kube-node-srv2.domain: 37943+ A? kubernetes.default.svc.cluster.local.svc.cluster.local. (72) 
  15. 16:46:04.441717 IP 10.20.105.252.54502 > qing-core-kube-node-srv2.domain: 45454+ AAAA? kubernetes.default.svc.cluster.local. (54) 
  16.  
  17.  
  18. 16:46:10.771445 IP 10.20.105.252.54594 > qing-core-kube-node-srv2.domain: 16257+ A? kubernetes.default.svc.cluster.local.svc.cluster.local. (72) 
  19. 16:46:10.783322 IP 10.20.105.252.59768 > qing-core-kube-node-srv2.domain: 60408+ AAAA? kubernetes.default.svc.cluster.local. (54) 

通过以上抓包分析得出结论。当解析kubernetes域名的时候,点的个数比ndots的值小,则按照search后面的本地域参数填补了域名后缀,当按照顺序 用 paas.svc.cluster.local 填补的时候解析到了A记录。然后终止dns查询将查询到的A记录返回。

通过host命令对名为kubernetes的service的集群内部域名进行解析

  1. root@demo-hello-pro-master-5474b97bdf-fvbm5:/# host -v kubernetes.default 
  2. Trying "kubernetes.default.paas.svc.cluster.local" 
  3. Trying "kubernetes.default.svc.cluster.local" 
  4. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18054 
  5. ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 
  6.  
  7. ;; QUESTION SECTION
  8. ;kubernetes.default.svc.cluster.localIN A 
  9.  
  10. ;; ANSWER SECTION
  11. kubernetes.default.svc.cluster.local. 5 IN A 10.10.0.1 
  12.  
  13. Received 106 bytes from 10.10.0.2#53 in 3 ms 
  14. Trying "kubernetes.default.svc.cluster.local" 
  15. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58952 
  16. ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 
  17.  
  18. ;; QUESTION SECTION
  19. ;kubernetes.default.svc.cluster.localIN AAAA 
  20.  
  21. ;; AUTHORITY SECTION
  22. cluster.local.  5 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1622445553 7200 1800 86400 5 
  23.  
  24. Received 147 bytes from 10.10.0.2#53 in 2 ms 
  25. Trying "kubernetes.default.svc.cluster.local" 
  26. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37783 
  27. ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 
  28.  
  29. ;; QUESTION SECTION
  30. ;kubernetes.default.svc.cluster.localIN MX 
  31.  
  32. ;; AUTHORITY SECTION
  33. cluster.local.  5 IN SOA ns.dns.cluster.local. hostmaster.cluster.local. 1622445553 7200 1800 86400 5 
  34.  
  35. Received 147 bytes from 10.10.0.2#53 in 2 ms 

解析k8s集群外部域名

接下来针对我的 www.ayunw.cn 这个域名进行多次解析。这里我为了测试,发起了6 次解析。我每执行一次解析,下面抓包的终端就敲一次回车。解析的同时去coredns这个容器所在的节点进行抓包分析。

  1. root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# nslookup www.ayunw.cn 
  2. Server:  10.10.0.2 
  3. Address: 10.10.0.2#53 
  4.  
  5. Non-authoritative answer: 
  6. Name: www.ayunw.cn 
  7. Address: 134.175.123.64 

抓包分析

抓包开始,由于我的集群有大量的服务,每秒都有很多内部服务dns解析请求。所以这里我过滤了关键字ayunw。上面的dns每执行一次,我在这个抓包的窗口就敲一下回车,这样的话方便看清楚每一次的解析结果

以下是抓 www.ayunw.cn 的域名DNS包的结果:

  1. [root@kube-node-srv2 ~]# tcpdump -i eth0 port 53 | grep "ayunw" 
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
  3. listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 
  4. 14:38:07.350640 IP 10.20.105.252.47767 > qing-core-kube-node-srv2.domain: 13102+ A? www.ayunw.cn.cluster.local. (44) 
  5.  
  6. 14:38:19.098753 IP 10.20.105.252.47071 > qing-core-kube-node-srv2.domain: 15535+ A? www.ayunw.cn.paas.svc.cluster.local. (53) 
  7. 14:38:19.111441 IP 10.20.105.252.56968 > qing-core-kube-node-srv2.domain: 62838+ A? www.ayunw.cn. (30) 
  8. 14:38:19.111720 IP qing-core-kube-node-srv2.35187 > 172.16.0.11.domain: 62838+ A? www.ayunw.cn. (30) 
  9.  
  10. 14:38:31.200982 IP 10.20.105.252.50777 > qing-core-kube-node-srv2.domain: 10715+ A? www.ayunw.cn.svc.cluster.local. (48) 
  11. 14:38:31.214096 IP 10.20.105.252.51233 > qing-core-kube-node-srv2.domain: 37585+ AAAA? www.ayunw.cn. (30) 
  12. 14:38:31.214299 IP qing-core-kube-node-srv2.35187 > 172.16.0.11.domain: 37585+ AAAA? www.ayunw.cn. (30) 
  13. 14:39:04.691754 IP 10.20.105.252.34080 > qing-core-kube-node-srv2.domain: 34206+ A? www.ayunw.cn.paas.svc.cluster.local. (53) 
  14. 14:39:04.704758 IP 10.20.105.252.36478 > qing-core-kube-node-srv2.domain: 64751+ A? www.ayunw.cn. (30) 
  15. 14:39:04.705068 IP qing-core-kube-node-srv2.48926 > 172.16.0.11.domain: 64751+ A? www.ayunw.cn. (30) 
  16.  
  17. 14:39:13.925872 IP 10.20.105.252.59868 > qing-core-kube-node-srv2.domain: 45121+ A? www.ayunw.cn.paas.svc.cluster.local. (53) 
  18. 14:39:13.937328 IP 10.20.105.252.45290 > qing-core-kube-node-srv2.domain: 27511+ A? www.ayunw.cn. (30) 
  19. 14:39:13.937576 IP qing-core-kube-node-srv2.48926 > 172.16.0.11.domain: 27511+ A? www.ayunw.cn. (30) 
  20.  
  21. 14:39:24.838444 IP 10.20.105.252.37510 > qing-core-kube-node-srv2.domain: 45926+ A? www.ayunw.cn.cluster.local. (44) 
  22.  
  23. 14:45:13.438961 IP 10.20.105.252.55462 > qing-core-kube-node-srv2.domain: 60170+ A? www.ayunw.cn.paas.svc.cluster.local. (53) 
  24. 14:45:13.450865 IP 10.20.105.252.42674 > qing-core-kube-node-srv2.domain: 25680+ A? www.ayunw.cn. (30) 
  25. 14:45:13.451110 IP qing-core-kube-node-srv2.56396 > 172.16.0.11.domain: 25680+ A? www.ayunw.cn. (30) 
  26.  
  27. ^C35952 packets captured 
  28. 35956 packets received by filter 
  29. 0 packets dropped by kernel 

从上面抓包分析的结果来看, www.ayunw.cn 的这个域名只有两个点,比pod里面 /etc/resolv.conf 文件中的 ndots 配置的值小(ndots的值为5,域名的点为2)。则会按照search的参数填补域名后缀,并且是根据search后面的顺序 paas.svc.cluster.local 、 svc.cluster.local 、 cluster.local 依次来填充的。因为根据search后面的本地域匹配后都没有域名解析的结果,因此他就直接解析了 www.ayunw.cn 这个域名查询到了该域名的A记录并且返回了结果。

通过host命令来进行解析

  1. root@demo-hello-pro-master-5474b97bdf-fvbm5:/# host -v www.ayunw.cn 
  2. Trying "www.ayunw.cn.paas.svc.cluster.local" 
  3. Trying "www.ayunw.cn.svc.cluster.local" 
  4. Trying "www.ayunw.cn.cluster.local" 
  5. Trying "www.ayunw.cn" 
  6. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8135 
  7. ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 0 
  8.  
  9. ;; QUESTION SECTION
  10. ;www.ayunw.cn.   IN A 
  11.  
  12. ;; ANSWER SECTION
  13. www.ayunw.cn.  30 IN A 134.175.123.64 
  14.  
  15. ;; AUTHORITY SECTION
  16. .   30 IN NS l.root-servers.net. 
  17. .   30 IN NS e.root-servers.net. 
  18. .   30 IN NS h.root-servers.net. 
  19. .   30 IN NS k.root-servers.net. 
  20. .   30 IN NS d.root-servers.net. 
  21. .   30 IN NS b.root-servers.net. 
  22. .   30 IN NS g.root-servers.net. 
  23. .   30 IN NS j.root-servers.net. 
  24. .   30 IN NS m.root-servers.net. 
  25. .   30 IN NS i.root-servers.net. 
  26. .   30 IN NS f.root-servers.net. 
  27. .   30 IN NS c.root-servers.net. 
  28. .   30 IN NS a.root-servers.net. 
  29.  
  30. Received 461 bytes from 10.10.0.2#53 in 94 ms 
  31. Trying "www.ayunw.cn" 
  32. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11085 
  33. ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 
  34.  
  35. ;; QUESTION SECTION
  36. ;www.ayunw.cn.   IN AAAA 
  37.  
  38. ;; AUTHORITY SECTION
  39. ayunw.cn.  5 IN SOA dns17.hichina.com. hostmaster.hichina.com. 2019070911 3600 1200 86400 360 
  40.  
  41. Received 113 bytes from 10.10.0.2#53 in 99 ms 
  42. Trying "www.ayunw.cn" 
  43. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19432 
  44. ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 
  45.  
  46. ;; QUESTION SECTION
  47. ;www.ayunw.cn.   IN MX 
  48.  
  49. ;; AUTHORITY SECTION
  50. ayunw.cn.  5 IN SOA dns17.hichina.com. hostmaster.hichina.com. 2019070911 3600 1200 86400 360 
  51.  
  52. Received 113 bytes from 10.10.0.2#53 in 51 ms 

因为我的pod中存在三个本地域:paas.svc.cluster.local 、 svc.cluster.local 、 cluster.local ,通过host命令可以看到,Trying 一共尝试了四次,一次根据我search后面的本地域进行了解析搜索,结果没有搜索到正确的解析,因此通过pod所在的宿主机本地的 /etc/resolv.conf 文件中进行了解析。

本地宿主机的/etc/resolv.conf的解析如下: 我这里公司用了内部bind服务,做了内部dns,然后上游指向了百度的dns。

  1. # cat /etc/resolv.conf 
  2. options rotate timeout:1 
  3. ; generated by /usr/sbin/dhclient-script 
  4. nameserver 172.16.0.11 
  5. nameserver 172.16.0.12 

解析 www.jd.com 域名

  1. root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# nslookup www.jd.com 
  2. Server:  10.10.0.2 
  3. Address: 10.10.0.2#53 
  4.  
  5. Non-authoritative answer: 
  6. www.jd.com canonical name = www.jd.com.gslb.qianxun.com. 
  7. www.jd.com.gslb.qianxun.com canonical name = www.jdcdn.com. 
  8. www.jdcdn.com canonical name = img20.360buyimg.com.s.galileo.jcloud-cdn.com. 
  9. img20.360buyimg.com.s.galileo.jcloud-cdn.com canonical name = img2x-sched.jcloud-cdn.com. 
  10. Name: img2x-sched.jcloud-cdn.com 
  11. Address: 113.107.249.3 

以下是抓www.jd.com的域名DNS包的结果:

  1. [root@kube-node-srv2 ~]# tcpdump -i eth0 port 53 | grep "jd" 
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
  3. listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 
  4. 16:17:52.935226 IP 10.20.105.252.56775 > qing-core-kube-node-srv2.domain: 17278+ A? www.jd.com.paas.svc.cluster.local. (51) 
  5. 16:17:52.947890 IP 10.20.105.252.52012 > qing-core-kube-node-srv2.domain: 12806+ A? www.jd.com. (28) 
  6. 16:17:52.948150 IP qing-core-kube-node-srv2.54626 > 172.16.0.11.domain: 12806+ A? www.jd.com. (28) 
  7. 16:17:53.054427 IP 172.16.0.11.domain > qing-core-kube-node-srv2.54626: 12806 5/13/0 CNAME www.jd.com.gslb.qianxun.com., CNAME www.jdcdn.com., CNAME img20.360buyimg.com.s.galileo.jcloud-cdn.com., CNAME img2x-sched.jcloud-cdn.com., A 113.107.249.3 (398) 
  8. 16:17:53.054677 IP qing-core-kube-node-srv2.domain > 10.20.105.252.52012: 12806 5/13/0 CNAME www.jd.com.gslb.qianxun.com., CNAME www.jdcdn.com., CNAME img20.360buyimg.com.s.galileo.jcloud-cdn.com., CNAME img2x-sched.jcloud-cdn.com., A 113.107.249.3 (398) 

通过host命令检测www.jd.com和上面www.ayunw.cn一样的

  1. root@demo-hello-pro-master-5474b97bdf-fvbm5:/# host -v www.jd.com 
  2. Trying "www.jd.com.paas.svc.cluster.local" 
  3. Trying "www.jd.com.svc.cluster.local" 
  4. Trying "www.jd.com.cluster.local" 
  5. Trying "www.jd.com" 
  6. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61910 
  7. ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 13, ADDITIONAL: 0 
  8.  
  9. ;; QUESTION SECTION
  10. ;www.jd.com.   IN A 
  11.  
  12. ;; ANSWER SECTION
  13. www.jd.com.  13 IN CNAME www.jd.com.gslb.qianxun.com. 
  14. www.jd.com.gslb.qianxun.com. 13 IN CNAME www.jdcdn.com. 
  15. www.jdcdn.com.  13 IN CNAME img20.360buyimg.com.s.galileo.jcloud-cdn.com. 
  16. img20.360buyimg.com.s.galileo.jcloud-cdn.com. 13 IN CNAME img2x-sched.jcloud-cdn.com. 
  17. img2x-sched.jcloud-cdn.com. 13 IN A 113.107.249.3 
  18.  
  19. ;; AUTHORITY SECTION
  20. .   13 IN NS f.root-servers.net. 
  21. .   13 IN NS i.root-servers.net. 
  22. .   13 IN NS d.root-servers.net. 
  23. .   13 IN NS l.root-servers.net. 
  24. .   13 IN NS j.root-servers.net. 
  25. .   13 IN NS g.root-servers.net. 
  26. .   13 IN NS k.root-servers.net. 
  27. .   13 IN NS m.root-servers.net. 
  28. .   13 IN NS h.root-servers.net. 
  29. .   13 IN NS c.root-servers.net. 
  30. .   13 IN NS a.root-servers.net. 
  31. .   13 IN NS e.root-servers.net. 
  32. .   13 IN NS b.root-servers.net. 
  33.  
  34. Received 398 bytes from 10.10.0.2#53 in 5 ms 
  35. Trying "img2x-sched.jcloud-cdn.com" 
  36. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64422 
  37. ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 
  38.  
  39. ;; QUESTION SECTION
  40. ;img2x-sched.jcloud-cdn.com. IN AAAA 
  41.  
  42. ;; AUTHORITY SECTION
  43. jcloud-cdn.com.  5 IN SOA ns1.jdgslb.com. apollo.jdgslb.com. 1622435242 10800 3600 604800 3600 
  44.  
  45. Received 125 bytes from 10.10.0.2#53 in 4 ms 
  46. Trying "img2x-sched.jcloud-cdn.com" 
  47. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43091 
  48. ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 
  49.  
  50. ;; QUESTION SECTION
  51. ;img2x-sched.jcloud-cdn.com. IN MX 
  52.  
  53. ;; AUTHORITY SECTION
  54. jcloud-cdn.com.  5 IN SOA ns1.jdgslb.com. apollo.jdgslb.com. 1622435242 10800 3600 604800 3600 
  55.  
  56. Received 125 bytes from 10.10.0.2#53 in 40 ms 

查看域名的点数等于ndots的值5的域名解析

这里我有一个阿里云上的域名,做了一个dns解析并且测试了4次

  1. root@demo-hello-perf-dev-v0-5-0-f9f9cd5c9-r27cw:/# nslookup x.y.z.v.ayunw.cn 
  2. Server:  10.10.0.2 
  3. Address: 10.10.0.2#53 
  4.  
  5. Non-authoritative answer: 
  6. Name: x.y.z.v.ayunw.cn 
  7. Address: 134.175.123.64 

抓包分析

  1. [root@kube-node-srv2 ~]# tcpdump -i eth0 port 53 | grep "ayunw" 
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
  3. listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 
  4. 16:36:49.928116 IP 10.20.105.252.46581 > qing-core-kube-node-srv2.domain: 38769+ A? x.y.z.v.ayunw.cn. (34) 
  5. 16:36:49.928383 IP qing-core-kube-node-srv2.59801 > 172.16.0.11.domain: 38769+ A? x.y.z.v.ayunw.cn. (34) 
  6.  
  7. 16:36:56.901762 IP 10.20.105.252.43844 > qing-core-kube-node-srv2.domain: 3524+ A? x.y.z.v.ayunw.cn. (34) 
  8.  
  9. 16:37:01.763743 IP 10.20.105.252.36053 > qing-core-kube-node-srv2.domain: 62952+ AAAA? x.y.z.v.ayunw.cn. (34) 
  10. 16:37:01.764110 IP qing-core-kube-node-srv2.59801 > 172.16.0.11.domain: 62952+ AAAA? x.y.z.v.ayunw.cn. (34) 
  11.  
  12. 16:37:06.851820 IP 10.20.105.252.36305 > qing-core-kube-node-srv2.domain: 58393+ AAAA? x.y.z.v.ayunw.cn. (34) 
  13. 16:37:06.852118 IP qing-core-kube-node-srv2.59801 > 172.16.0.11.domain: 58393+ AAA 

从上述抓包结果可以看到,如果域名中的点等于ndots的值,他会直接解析域名,不会用search后面的本地域来填补的。可能因为我阿里云上这个域名的原因,不支持超过5个点的域名解析。所以超过5个点的域名我无法测试。

结论

如果点的个数小于5个,那么会根据search中配置的本地域列表一次在对应域中先进行搜索。如果没有返回,则最后再查询域名本身。如果说search中配置的本地域列表没有一个匹配的,那么就会走到服务器宿主机的/etc/resolv.conf中去解析。如果你kubelet中clusterdomain配置错了。那么search中没有任何一个匹配的到,直接转发到本地DNS,走正常的递归查询逻辑。

通过以上测试发现ndots的值和请求的域名是相关的。为了避免多次的DNS解析查询,可以将需要进行解析的域名进行相对的优化 尽可能将域名中的点都带上,并且最好是等于ndots的值。比如:kubernetes.paas.svc.cluster.local。这样他就直接解析到了这个域名返回了A记录而不是在通过search后面的本地域去解析多次。如果你解析的域名是kubernetes.paas他就会根据search后面的本地域去进行补全解析多次了 在同一个namespace下可以直接解析service的名称。比如:nslookup kubernetes,他会补全default.svc.cluster.local,但是为了解析失败个人建议最好还是将域名写完整。

 

责任编辑:武晓燕 来源: 运维开发故事
相关推荐

2023-10-31 08:10:24

域名域名解析服务器

2023-03-09 08:12:08

免登录实Python脚本

2010-05-24 15:35:58

IPv6域名解析

2020-02-26 18:00:12

dig命令Linux域名解析

2023-11-27 22:55:17

DNS域名解析

2017-12-22 10:48:41

邮件服务器PTR

2018-03-29 09:46:02

2011-05-31 16:55:43

2019-10-30 05:32:17

网址URLIP地址

2021-11-12 09:35:33

网址URLLinux

2015-12-07 14:11:01

2019-03-18 10:44:41

负载均衡DNSUDP

2010-12-22 11:01:00

绿盟科技网站域名解析监测

2020-07-22 14:30:29

JavaHTTPS加密

2013-08-15 16:35:16

DNSPod域名解析

2013-04-23 11:41:08

2013-04-18 15:26:41

域名

2013-04-19 14:41:29

域名解析

2018-08-14 10:00:09

服务器域名代理商

2010-06-24 13:18:38

ICMP协议
点赞
收藏

51CTO技术栈公众号