問題描述:
系統:ubuntu 19.10
發現問題:裝好系統后wifi沒有問題,大概一個月后wifi抽風了,頂部欄wifi圖標變成了一個問號,如果這樣能用也好。但是不能打開網頁,百度都打不開。在終端里面Ping了一下百度,有時能Ping通,但丟包嚴重;再者根本就Ping不通,錯誤提示:Temporary failure in name resolution,域名解析失敗。然后百度,發現了一篇文章,雖然沒有從這個文章直接解決,但一個評論幫我解決了這個問題。從這個評論中得到三個鏈接:🔗1,🔗2,🔗3;
- 鏈接1解決了問題,說明了:ubuntu默認安裝的DNS解析工具systemd-resolved存在的問題,以及它的替代者:unbound
- 鏈接2說明wifi問號是一個bug
- 鏈接3說明wifi問號問題不僅僅在ubuntu,其它linux發行版也存在。
解決方法:
Step1:安裝unbound:
sudo apt-get install unbound
如果系統域名解析失敗或不能成功聯網,可以在/etc/resolv.conf 文件中指定一個DNS,可以用114.114.114.114;
具體步驟:
1 sudo vim /etc/resolv.conf
2 刪除文件中的內容,添加一行:nameserver 114.114.114.114
Step2:禁用默認的域名解析工具systemd-resolved並停止正在運行着的程序
1 sudo systemctl disable systemd-resolved.service
2 sudo systemctl stop systemd-resolved.service
Step3:配置NetworkManager使其使用unbound作為系統的域名解析工具
打開/etc/NetworkManager/NetworkManager.conf加入一行如下圖:
緊跟plugins=…下面一行加上dns=unbound.
Step4:啟用新安裝的域名解析工具unbound,並配置其配置文件
雖然安裝后默認啟用,但為了以防萬一,手動啟用:
1 sudo systemctl enable unbound-resolvconf
2 sudo systemctl enable unbound
3 sudo vim /etc/unbound/unbound.conf,在其配置文件追加以下manual中的示例配置文件內容,man unbound.conf 查看其manual頁
directory: "/etc/unbound"
username: unbound
# make sure unbound can access entropy from inside the chroot.
# e.g. on linux the use these commands (on BSD, devfs(8) is used):
# mount --bind -n /dev/random /etc/unbound/dev/random
# and mount --bind -n /dev/log /etc/unbound/dev/log
chroot: "/etc/unbound"
# logfile: "/etc/unbound/unbound.log" #uncomment to use logfile.
pidfile: "/etc/unbound/unbound.pid"
# verbosity: 1 # uncomment and increase to get more logging.
# listen on all interfaces, answer queries from the local subnet.
interface: 0.0.0.0
interface: ::0
access-control: 10.0.0.0/8 allow #允許網卡通過哪個網段的流量,根據需要填寫。
Step5:配置DNS,從manual頁查看配置,man unbound
從man的結果看,要使用本機的unbound程序來做域名解析,需要在/etc/resolv.conf中加入一行:nameserver 127.0.0.1;接下來sudo vim /etc/resolv.conf,加進去進行了。但是在/etc/resolv.conf中所做的編輯會在重啟機器后被覆蓋。打開resolv.conf:
得知resolv.conf由resolvconf程序產生,我們可以查看resolvconf的manual頁,man 8 resolvconf:
從resolvconf的manual頁中找到/etc/resolvconf/resolvconf.d/tail文件,加入它里面的內容會被追加到/etc/resolv.conf文件中,因此我們需要編輯的是/etc/resolvconf/resolvconf.d/tail文件,在其中加入DNS的鍵值對:nameserver 127.0.0.1;
Note: 在實際測試時發現只加入127.0.0.1會有一定幾率不起作用,因此我們需要再加入至少一個能用的DNS,我搜集了以下:
- 騰訊的公用免費DNS: 119.29.29.29(首選)、182.254.116.116(備選)
- 阿里的公用免費DNS: 233.5.5.5(首選)、233.6.6.6(備選)
- 國內移動、電信和聯通通用的公用免費DNS: 114.114.114.114
- Cloudflare的公用免費DNS: 1.1.1.1(首選)、1.0.0.1(備選)