Linux

當 resolv.conf 被覆蓋時,如何設置我的 DNS?

  • March 12, 2022

我在網上看到的大多數資訊都說要編輯/etc/resolv.conf,但我在那裡所做的任何更改都會被覆蓋。

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

似乎 127.0.1.1 是dnsmasq. dnsmasq文件說要/etc/resolv.conf編輯. 我嘗試將自定義名稱伺服器放入 中,但執行後/etc/resolv.conf.d/base未顯示更改。/etc/resolv.conf``sudo resolvconf -u

僅供參考,我不想在每個連接的基礎上更改 DNS,我想設置預設 DNS 設置以在未另行指定時用於所有連接。

更新:

我自己回答了這個問題: https ://unix.stackexchange.com/a/163506/67024

我認為這是最好的解決方案,因為:

  1. 有用。
  2. 它需要最少的更改和
  3. 它仍然與 dnsmasq 的 DNS 記憶體一起工作,而不是繞過它。

我相信如果您想覆蓋 DNS 名稱伺服器,您只需在base文件中添加與此類似的行resolv.conf.d

例子

**注意:**在開始之前,請確保已安裝以下軟體包,apt install resolvconf.

$ sudo vim /etc/resolvconf/resolv.conf.d/base

然後像這樣將您的名稱伺服器列表放入:

nameserver 8.8.8.8
nameserver 8.8.4.4

最後更新resolvconf

$ sudo resolvconf -u

如果您查看手冊頁,resolvconf它描述了/etc/resolvconf/resolv.conf.d/.

  /etc/resolvconf/resolv.conf.d/base
         File  containing  basic  resolver  information.  The lines in this 
         file are included in the resolver configuration file even when no
         interfaces are configured.

  /etc/resolvconf/resolv.conf.d/head
         File to be prepended to the dynamically generated resolver 
         configuration file.  Normally this is just a comment line.

  /etc/resolvconf/resolv.conf.d/tail
         File to be appended to the dynamically generated resolver 
         configuration file.  To append nothing, make this  an  empty  
         file.   This file is a good place to put a resolver options line 
         if one is needed, e.g.,

             options inet6

即使head文件頂部有警告:

$ cat /etc/resolvconf/resolv.conf.d/head
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

存在此警告,以便在建構這些文件時,警告最終將進入resolv.conf這些文件將用於製作的結果文件中。因此,您也可以輕鬆地nameserver將上述base文件的行添加到head文件中。

參考

我也對這個問題感興趣,並嘗試了@sim 提出的解決方案。

為了測試它,我把

nameserver 8.8.8.8

/etc/resolvconf/resolv.conf.d/base

nameserver 8.8.4.4

/etc/resolvconf/resolv.conf.d/head

然後我重新啟動了網路

sudo service network-manager restart

結果是/etc/resolv.conf看起來像

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 8.8.4.4
nameserver 127.0.1.1

nm-tool指出 dnsserver 是

DNS:             208.67.222.222
DNS:             208.67.220.220

這是我的路由器提供的。另一方面,探勘地址告訴

;; Query time: 28 msec
;; SERVER: 8.8.4.4#53(8.8.4.4)

如果我是對的,我從這一切中得出結論:

  1. resolvonf 只讀取“head”部分:“base”部分由 dnsmasq 以某種方式控制
  2. dnsserver 實際上被強製到 8.8.4.4,不管 dhcp 提供的伺服器是什麼,但是你失去了 dnsmasq 提供的記憶體,因為請求總是發送到 8.8.4.4
  3. dnsmasq 仍然只使用 dhcp 提供的 dnsserver。

總而言之,它有效,但我認為這不是所要求的預期結果。我認為更接近的解決方案如下。編輯

sudo vim /etc/dhcp/dhclient.conf

然後加

supersede domain-name-servers 8.8.8.8;

結果如下:resolv.conf 只包含 127.0.0.1,這意味著呼叫了 dnsmasq 記憶體並且 nm-tool 說

DNS:             8.8.8.8

這意味著如果搜尋的名稱不在記憶體中,則在 8.8.8.8 而不是 dhcp 提供的伺服器上請求它。

另一個(也許更好)的選擇是使用“prepend”而不是“supersede”:這樣,如果名稱沒有被 8.8.8.8 解析,那麼請求就會退回到其他伺服器上。事實上,nm-tool 說

DNS:             8.8.8.8    
DNS:             208.67.222.222
DNS:             208.67.220.220

引用自:https://unix.stackexchange.com/questions/128220