
1. Linux處理流程1NetworkManager負(fù)責(zé)監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)比如你連上了 Wi-Fi。2它通過(guò) DHCP 從路由器拿到 IP 和 DNS 后不會(huì)直接去亂改/etc/resolv.conf。3相反它把這些 DNS 地址交給了systemd-resolved。4systemd-resolved把自己設(shè)為本地代理即127.0.0.53然后把從 NetworkManager 那里收到的真實(shí) DNS 地址比如路由器的或者公共 DNS記在自己的后臺(tái)里。5/etc/resolv.conf此時(shí)只是一個(gè)軟鏈接穩(wěn)穩(wěn)地指向systemd-resolved的存根文件內(nèi)容永遠(yuǎn)是nameserver 127.0.0.53。命令cat/etc/resolv.conf1.1 整體查詢流程當(dāng)你嘗試訪問(wèn)一個(gè)網(wǎng)站比如google.com時(shí)路徑是這樣的你的應(yīng)用/瀏覽器發(fā)起 DNS 請(qǐng)求。請(qǐng)求發(fā)送給本地的127.0.0.53(/etc/resolv.conf指定的。systemd-resolved收到后通過(guò)你的網(wǎng)卡ens16np0轉(zhuǎn)發(fā)給真正的 DNS 服務(wù)器10.72.66.37。10.72.66.37返回結(jié)果再經(jīng)由本地代理傳回給你的應(yīng)用程序2. 查看systemd-resolvedsystemctl status systemd-resolved2.1 resolvectl命令命令resolvectl查看上游的DNS從DHCP服務(wù)器獲取到的上游的DNS服務(wù)器地址10.72.66.37。這樣再去訪問(wèn)github.com時(shí)返回一個(gè)私有的局域網(wǎng)地址172.18.0.35。這個(gè)地址是錯(cuò)誤的。2.2 重啟服務(wù)# 重啟服務(wù)sudo systemctl restart systemd-resolved# 清除 DNS 緩存sudo resolvectl flush-caches3. 查詢DNS命令nslookup name server lookup是一個(gè)用于查詢 DNS域名系統(tǒng)記錄的網(wǎng)絡(luò)管理命令行工具。它可以用來(lái)診斷域名解析是否正常。3.1 默認(rèn)dnsnslookup github.com命令nslookup github.com作用系統(tǒng)會(huì)默認(rèn)使用當(dāng)前連接的網(wǎng)絡(luò)比如路由器或公司的 DNS去查詢結(jié)果。172.18.0.35是一個(gè)私有的局域網(wǎng)地址。3.2 指定dnsnslookup github.com 223.5.5.5命令nslookup github.com 223.5.5.5作用指定使用阿里云的公共 DNS 服務(wù)器IP地址為223.5.5.5去查詢域名github.com的 IP 地址解析記錄。20.205.243.166是一個(gè)公網(wǎng)的地址。如果換個(gè)dns就能訪問(wèn)就說(shuō)明是dns的問(wèn)題。3.3 修復(fù)DNS的方法3.3.1 修改resolved.confvim /etc/systemd/resolved.conf修改為[Resolve]DNS223.5.5.5 119.29.29.29FallbackDNS8.8.8.8 1.1.1.13.3.2 重啟服務(wù)并清理緩存# 重啟服務(wù)sudo systemctl restart systemd-resolved# 清除本地 DNS 緩存sudo resolvectl flush-caches