成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DNS故障診斷及問題分析示例

系統 Linux
有一些場景會導致訪問 DNS 服務不穩定,例如 DNS 服務器的設置有問題、網絡有丟包、主機 DNS 配置錯誤等等。我們接下來查看幾種 case。

[[436622]]

1、DNS 基礎知識

互聯網基于 TCP/IP 協議。為了方便管理網絡內的主機,整個互聯網分為若干個域 (domain),每 個域又可以再分為若干個子域,例如,.com,.org,.edu 都是頂級域,而 google.com 是.com 下面的子域。

網絡中的任意一臺主機(host)都會屬于某個域,并且有自己的名字,稱為主機名( hostname)。例如 example.com 就是.com 域中一臺主機名為 example.com(或 example,hostname 和 domain name 的區別,見這里 )的主機。

域名/主機名是為了方便人記憶,而機器之間通信最終用的還是 IP 地址,因此需要一個將主 機名(域名)轉換成 IP 地址的服務。域名服務系統(DNS, domain name system)做的就是 這個事情,對應的服務器稱為域名服務器(Domain Name Server)。

例如,當通過瀏覽器訪問 example.com,瀏覽器會首先訪問 DNS 服務器,查找 example.com 對應的 IP 地址,然后和這個 IP 建立 TCP 連接,接下來才發起 HTTP 請求。

一個域名可以對應一個 IP 地址,也可以對應多個。對于后者,DNS 服務算法會從中選擇一個 地址返回。大部分網絡服務為了實現高可用,都是對應多個地址,我們后面會看到, baidu.com 就對應多個 IP。

有一些場景會導致訪問 DNS 服務不穩定,例如 DNS 服務器的設置有問題、網絡有丟包、主機 DNS 配置錯誤等等。我們接下來查看幾種 case。

2、準備測試環境

為方便大家跟著上手練習,本文將搭建一個容器環境。

Pull Docker 鏡像: 

  1. $ sudo docker pull alpine:3.8 

運行容器,注意這里一定要帶--privileged 參數 [2],否則后面的部分 tc 命令無法執行: 

  1. $ sudo docker run -d --privileged --name ctn-1 alpine:3.8 sleep 3600d  
  2. $ sudo docker ps  
  3. CONTAINER ID    IMAGE        COMMAND         CREATED        STATUS          PORTS  NAMES  
  4. 233bc36bde4b    alpine:3.8   "sleep 3600d"   1 minutes ago  Up 14 minutes           ctn-1 

進入容器: 

  1. $ sudo docker exec -it ctn-1 sh 

查看容器網絡信息: 

  1. / # ifconfig  
  2. eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:09  
  3.           inet addr:172.17.0.9  Bcast:0.0.0.0  Mask:255.255.0.0 

3、DNS 配置

3.1 查看 DNS 配置

Linux 上的 DNS 配置在/etc/resolv.conf 里面。我們先來查看容器的配置: 

  1. / # cat /etc/resolv.conf  
  2. # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)  
  3. #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN  
  4. nameserver 192.168.1.11  
  5. nameserver 192.168.1.12 

這其實是繼承了宿主機的 DNS 配置,在宿主機上執行 cat /etc/resolv.conf 會看到一樣的 結果。

3.2 修改 DNS 配置

可以通過修改/etc/resolv.conf 里面的 nameserver 來配置自己想用的 DNS 服務器。例如內網環境可能都會使用自己的 DNS 服務器,因為它除了 提供內網域名解析之外,公網域名解析也會比較快(相比于網絡供應商的公網 DNS 服務器) 。

4、DNS 問題排查

本節模擬幾種導致 DNS 查詢變慢的場景,如果在實際環境中遇到類似現象,可以考慮往這些 方向排查。

4.1 機器未配置 DNS 導致域名查找失敗

  •  現象:網絡是通的(例如 ping IP 通),但是 DNS 查詢總是失敗
  •  可能的原因:機器沒有配置 DNS 服務器
  •  解決辦法:修改/etc/resolv.conf,給機器配置合適的 DNS 服務器 有時新啟動的機器(不管是物理機、虛擬機還是容器)沒有設置 DNS,導致訪問域名不通。我們來復現一下。

在正常的容器里用 nslookup 工具查看域名對應的 IP 地址: 

  1. / # nslookup example.com  
  2. Name:      example.com  
  3. Address 1: 93.184.216.34  
  4. Address 2: 2606:2800:220:1:248:1893:25c8:1946 

可以看到,我們獲取到了該域名一個 IPv4 地址和一個 IPv6 地址。

將/etc/resolv.conf 里的 DNS 服務器列表用#注釋掉,模擬沒有配置 DNS 服務器的場景。

再次測試: 

  1. / # nslookup example.com  
  2. nslookup: can't resolve 'example.com': Try again 

所以遇到這種問題,可以先去排查/etc/resolv.conf 里面是否配置了 DNS 服務器。

4.2 DNS 服務太慢

  •  現象:DNS 查詢太慢
  •  可能的原因:配置的 DNS 服務器不合理
  •  解決辦法:修改/etc/resolv.conf,配置合適的 DNS 服務器

每個公司一般都有自維護的 DNS 服務器,不僅用來解析內網 DNS,而且可以加速解析公網域名 。

dig 是另外一個功能更強大的 DNS 查詢工具,安裝: 

  1. / # apk update && apk add bind-tools 

首先查看使用內網 DNS,查詢域名的延遲: 

  1. / # dig example.com  
  2. ...  
  3. example.com.            15814   IN      A       93.184.216.34  
  4. ;; Query time: 0 msec  
  5. ;; SERVER: 192.168.1.11#53(192.168.1.11) 

可以看到非???,在 1ms 以內。

然后我們測試如果使用 Google 的公網 DNS 服務器 8.8.8.8 [1],延遲會是多少。

修改/etc/resolv.conf,將其他 nameserver 注釋掉,添加一行 nameserver 8.8.8.8。

再次測試: 

  1. / # dig example.com  
  2. ...  
  3. example.com.            15814   IN      A       93.184.216.34  
  4. ;; Query time: 150 msec  
  5. ;; SERVER: 8.8.8.8#53(8.8.8.8) 

延遲變成了 150ms,比原來大了 150 多倍。

因此,對于 DNS 查詢特別慢的場景,首先要查看配置的 DNS 服務器是否合理。

4.3 hardcode /etc/hosts 導致跳過 DNS 查詢

  •  現象:某域名訪問太慢、某域名總是指向相同 IP(多 IP 情況下)、特定機器不可訪問 某域名等等
  •  可能的原因:/etc/hosts 有 hardcode 域名及 IP
  •  解決辦法:修改/etc/hosts

前面提到,大部分公網域名都對應多個 IP 地址,因此每次 DNS 查詢拿到的 IP 地址都可能不一 樣,我們用 ping 來測試一下: 

  1. / # ping baidu.com  
  2. PING baidu.com (220.181.57.216): 56 data bytes  
  3. 64 bytes from 220.181.57.216: seq=0 ttl=45 time=26.895 ms  
  4. 64 bytes from 220.181.57.216: seq=1 ttl=45 time=26.701 ms  
  5. ^C  
  1. / # ping baidu.com  
  2. PING baidu.com (123.125.115.110): 56 data bytes  
  3. 64 bytes from 123.125.115.110: seq=0 ttl=43 time=27.587 ms  
  4. 64 bytes from 123.125.115.110: seq=1 ttl=43 time=27.757 ms  
  5. ^C 

可以看到,兩次 ping 測試(內部首先查詢 baidu.com 對應的 IP 地址)拿到的 IP 地址是不一樣 的。用 nslookup 可以看到它們都是 baidu.com 對應的 IP 地址: 

  1. / # nslookup baidu.com  
  2. Name: baidu.com  
  3. Address: 220.181.57.216  
  4. Name: baidu.com  
  5. Address: 123.125.115.110 

/etc/hosts 里面可以直接 harcode 一個域名對應的 IP 地址,這會導致機器跳過 DNS 查詢,直接拿這個 IP 作 為該域名的 IP。我們來驗證一下。

修改/etc/hosts,添加一行 123.125.115.110 baidu.com,再次 ping 測試 

  1. / # ping baidu.com  
  2. PING baidu.com (123.125.115.110): 56 data bytes  
  3. 64 bytes from 123.125.115.110: seq=0 ttl=43 time=27.861 ms  
  4. ^C  
  5. --- baidu.com ping statistics ---  
  6. 1 packets transmitted, 1 packets received, 0% packet loss  
  7. round-trip min/avg/max = 27.861/27.861/27.861 ms  
  8. / # ping baidu.com  
  9. PING baidu.com (123.125.115.110): 56 data bytes  
  10. 64 bytes from 123.125.115.110: seq=0 ttl=43 time=27.614 ms  
  11. ^C 

這是不管執行多少次,baidu.com 對應的 IP 地址都不會變了。而實際上,這個 IP 地址并不一定是最優的 IP 地址,甚至有可能這 個 IP 不可用,導致訪問 baidu.com 失敗。因此,實際中要極力避免在/etc/hosts 中 hardcode。

4.4 DNS 查詢不穩定

  •  現象:DNS 查詢不穩定,時快時慢
  •  可能的原因:機器上有 tc 或 iptables 規則,導致到 DNS 服務器的 packet 變慢或丟失
  •  解決辦法:修改或刪除 tc/iptables 規則

我們用 tc 來模擬網絡延遲:

  1. / # apk add iproute2 

首先查看有沒有 tc 規則: 

  1. / # tc -p qdisc ls dev eth0 

默認沒有任何規則。

然后我們加一條:每個 packet 延遲 600ms: 

  1. / # tc qdisc add dev eth0 root netem delay 600ms  
  2. / # tc -p qdisc ls dev eth0  
  3. / # qdisc netem 8001: root refcnt 2 limit 1000 delay 600.0ms 

測試: 

  1. / # dig example.com  
  2. ...  
  3. example.com.            15814   IN      A       93.184.216.34  
  4. ;; Query time: 600 msec  
  5. ;; SERVER: 192.168.1.11#53(192.168.1.11) 

可以看到,DNS 查詢變成了 600ms。

這里我們測試的是固定延遲,這種問題很容易發現。我們還可以測試隨機延遲,或者按 比例延遲等 [2]: 

  1. / # tc qdisc change dev eth0 root netem delay 600ms 10ms 25%  
  2. / # tc qdisc change dev eth0 root netem delay 600ms 20ms distribution normal

此類規則會導致 DNS 查詢速度更有隨機性。

最后刪除 tc 規則: 

  1. / # tc qdisc del dev eth0 root 

iptables 規則也會導致類似的問題。

很多軟件在運行之后,會在宿主機上添加 tc 或 iptables 規則,例如 OpenStack,K8S 等等 。因此遇到這種隨機延遲問題,首先可以查看機器上是否有 tc 或 iptables 規則。

4.5 DNS 反向查詢不穩定

線上遇到過這樣一個問題:從一臺機器 ping 一個內網域名,每個 ping 包看起來都會卡 5 ~ 30s 不等,但是 CTL-C 關閉 ping 之后,打印出來的統計信息里,既沒有丟包,ping 的延遲也很低 (毫秒級),這就很奇怪。接下來:

  •  dig,很快,毫秒級,說明 DNS 查詢沒有問題
  •  dig 能看到域名對應的 IP,直接 ping 這個 IP,發現是沒有卡頓的
  •  仍然 ping 域名,用 tcpdump 抓包,tcpdump -i eth0 hostand icmp,發現 ping 包都是立即響應的,印證了統計信息里,ping 延遲很低的事實

根據以上信息,說明 ping 卡頓的問題出在這臺機器,而且應該就是 ping 程序本身在做什么耗 時的操作。繼續:

  •  仍然 ping 域名,同時,用 ltrace -p跟蹤 ping 進程,發現卡在一個叫 gethostbyaddr()的函數
  •  查閱文檔,發現這個函數是根據 IP 反向查詢 hostname,需要和 DNS 交互

到這里,基本確定了是 DNS 服務器反向查詢的問題,我們用另外幾個命令行工具驗證一下, 以下三個命令都是根據 IP 反查 hostname:

  1.  nslookup
  2.  host
  3.  dig -x

果然,以上三個命令都會卡住。修改/etc/resolv.conf,換一個 DNS 服務器之后,問題 消失了。接下來,就去查 DNS 服務器的問題吧。 

責任編輯:龐桂玉 來源: 運維派
相關推薦

2022-03-11 07:30:04

SQLMySQLCPU

2009-05-19 16:40:41

TTL網絡故障科來軟件

2009-11-17 18:44:44

2011-05-07 14:29:26

復合機

2010-09-26 12:19:28

DHCP故障診斷

2013-05-22 17:18:13

2010-08-03 13:41:22

路由器命令

2009-11-11 17:07:13

路由器故障

2009-02-27 14:07:00

IBM服務器服務器硬盤故障診斷

2014-01-14 11:21:15

科來軟件網絡回溯分析

2009-11-24 18:34:23

網絡故障診斷路由器

2020-05-03 12:52:39

VMware Hori虛擬桌面虛擬機

2012-10-09 16:00:35

交換機故障

2011-07-28 11:22:50

2009-11-12 14:07:16

路由器故障

2009-09-21 16:40:57

2009-09-11 03:21:00

網絡故障診斷

2009-02-25 11:01:52

交換機故障VLAN

2023-02-27 08:07:47

語言模型數據庫故障

2009-12-17 14:46:45

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人天堂av网站 | 亚洲va欧美va天堂v国产综合 | a国产视频 | 九九九久久国产免费 | 九九热在线免费视频 | 久久久一区二区 | 欧美在线不卡 | 视频一区欧美 | 亚洲www啪成人一区二区麻豆 | 综合精品久久久 | 最新国产在线 | 欧美vide| 全免费a级毛片免费看视频免费下 | 国产精品久久久久久久 | 视频一区二区中文字幕日韩 | 91精品国产色综合久久 | 综合久久综合久久 | 国产精品国产a级 | 久久高潮 | 国产精品亚洲一区 | 国产91 在线播放 | 香蕉一区| 中文字幕一区二区三区在线观看 | 亚洲天堂免费在线 | 在线播放精品视频 | 一级黄色影片在线观看 | 国产亚洲精品综合一区 | 亚洲精品中文字幕在线观看 | 福利视频日韩 | 中国三级黄色录像 | 在线观看 亚洲 | 三级黄色片在线观看 | 国产在线观看福利 | 欧美精品一区二区三区四区 | 精品乱码一区二区三四区视频 | 国产一区二区三区久久久久久久久 | 精品国产一区二区久久 | 国产欧美一区二区久久性色99 | 精品自拍视频 | 国产精品区一区二区三区 | 欧美色综合天天久久综合精品 |