Linux

兩個 LAN 介面之間的 DNS 伺服器選擇

  • March 17, 2021

我有一個執行 Ubuntu 18.04.4 的盒子。有兩個 LAN 介面 enp3s0 和 eno1:前者連接到 LAN 網路上的 3G 調製解調器,後者連接到另一個網路上的衛星調製解調器。Network Manager 負責通過其配置文件中的 Connectivity Check 設置設置介面的優先級(例如,在沒有 3G 覆蓋的情況下,eno1 介面指標通過將 20000 添加到其預設值來降級,並且在沒有衛星的情況下同樣適用於 enp3s0 - eno1 上的預設優先級更高,兩個連接都處於活動狀態)。DNS 由 systemd-resolved 和 systemd-networked 處理。兩個介面都從 3G 和衛星調製解調器上執行的 DHCP 服務獲取它們的 IP 地址和 DNS。enp3s0: IP 192.168.200.101 (DNS/GW: 192.168.200.101) - 這個地址是通過 MAC 地址分配 eno1 永久分配的:

不知何故,提供給第一個介面的 DNS 伺服器地址優先於第二個介面。例如,如果 enp3s0 沒有網際網路連接並且網際網路流量被路由到 192.168.55.1,則仍然嘗試通過 192.168.200.1 進行名稱解析並且顯然失敗。我嘗試用​​添加到 /etc/systemd/network/eno1.network 的靜態 DNS 替換為 eno1 動態分配的 DNS

[Match]
Name=eno1

[Network]
DNS=8.8.8.8
DNS=8.8.4.4

但是系統仍然更喜歡使用 192.168.200.1 進行名稱解析。我向 /etc/systemd/resolved.conf 添加了一個全域備份 DNS,但即使考慮在內,它似乎也無濟於事。

[Resolve]
#DNS=
FallbackDNS=8.8.4.4
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes

我想要實現的是不要只使用 192.168.200.1 作為 DNS 伺服器,但如果使用與第二個介面關聯的 DNS 伺服器不起作用但我找不到方法。我的理解是它與第一個 DNS 的配置方式有某種關係,它在其域分配中得到了這一點,我懷疑它使其成為網際網路名稱的主要來源,但可能是我在做夢。對此的任何建議都非常感謝,基本上我怎樣才能讓兩個 DNS 都正常工作?下面是我看到的已解決狀態輸出〜(Google DNS 分配給第二個 iface)。

Global
         DNSSEC NTA: 10.in-addr.arpa
                     16.172.in-addr.arpa
                     168.192.in-addr.arpa
                     17.172.in-addr.arpa
                     18.172.in-addr.arpa
                     19.172.in-addr.arpa
                     20.172.in-addr.arpa
                     21.172.in-addr.arpa
                     22.172.in-addr.arpa
                     23.172.in-addr.arpa
                     24.172.in-addr.arpa
                     25.172.in-addr.arpa
                     26.172.in-addr.arpa
                     27.172.in-addr.arpa
                     28.172.in-addr.arpa
                     29.172.in-addr.arpa
                     30.172.in-addr.arpa
                     31.172.in-addr.arpa
                     corp
                     d.f.ip6.arpa
                     home
                     internal
                     intranet
                     lan
                     local
                     private
                     test

Link 15 (tun0)
     Current Scopes: none
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no

Link 14 (veth2e5ae19)
     Current Scopes: none
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no

Link 12 (veth5b411fa)
     Current Scopes: none
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no

Link 10 (br-b950c350c024)
     Current Scopes: none
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no

Link 9 (docker0)
     Current Scopes: none
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no

Link 8 (can0)
     Current Scopes: none
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no

Link 7 (wlp1s0)
     Current Scopes: none
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no

Link 6 (wwp0s20u6i10)
     Current Scopes: none
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no

Link 5 (wwp0s20u6i8)
     Current Scopes: none
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no

Link 4 (enp3s0)
     Current Scopes: DNS
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no
        DNS Servers: 192.168.200.1
         DNS Domain: ~.
                     rig

Link 3 (enp2s0)
     Current Scopes: none
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no

Link 2 (eno1)
     Current Scopes: DNS
      LLMNR setting: yes
MulticastDNS setting: no
     DNSSEC setting: no
   DNSSEC supported: no
        DNS Servers: 8.8.8.8
                     8.8.4.4

systemd-resolved術語中,~在 DNS 域欄位中以前綴表示的域表示“將此域直接查詢到系統範圍的預設 DNS 伺服器:不要為此域使用每個連結的 DNS 伺服器”。組合~.是相同的,但對於根 DNS 域.,它是所有 DNS 域的隱含後綴。

但問題似乎是您似乎沒有任何系統範圍的預設 DNS 伺服器:您只配置了每個連結的 DNS 伺服器。根據手冊頁,FallbackDNS=在不知道其他 DNS 伺服器資訊的情況下使用。resolved.conf(5)因為兩者eno1enp3s0定義了每個連結的 DNS 伺服器,FallbackDNS所以根本不會使用。

你的文章說網路配置enp3s0

enp3s0:IP 192.168.200.101(DNS/GW:192.168.200.101)

因為將介面作為自己的網關是沒有意義的(儘管有時在網段外部沒有連接並且某些配置工具堅持必須配置網關時將其用作解決方法),我假設 DNS/GW部分有錯字,您的意思是“DNS/GW:192.168.200.1”。這將與resolved狀態所說的相符。

因此,如果 3G 調製解調器的 IP 地址為 192.168.200.1,那麼根本原因可能是即使 3G 調製解調器沒有網際網路連接,resolved仍然可以聯繫調製解調器本身。因此resolved,即使 3G 連結斷開,也可能認為 192.168.200.1 仍然是有效的 DNS 伺服器。如果 3G 調製解調器的 DNS 伺服器/代理功能寫得不好,它可能不會以 SERVFAIL 響應,或者如果它沒有連結,則只是簡單地讓請求超時:這可能會進一步誤導resolved認為 3G 調製解調器是有效的 DNS伺服器實際上根本沒有到 Internet 的活動連結。

當您只有一個傳出網際網路連接時,像這樣的 3G 調製解調器中的 DNS 代理可能會簡化網路配置,但當您有另一個連接時,它可能會使事情複雜化:那麼您需要一個

我建議您在中指定靜態 DNS,/etc/systemd/resolved.confDNS=不是FallbackDNS=. 在resolved.conf(5)手冊頁上,描述DNS=說:

DNS=

以空格分隔的 IPv4 和 IPv6 地址列表,用作系統 DNS 伺服器。DNS 請求與從 systemd-networkd.service(8) 獲取或在執行時由外部應用程序設置的合適的每連結 DNS 伺服器並行發送到列出的 DNS 伺服器之一。出於兼容性原因,如果未指定此設置,則使用 /etc/resolv.conf 中列出的 DNS 伺服器,如果該文件存在並且在其中配置了任何伺服器。此設置預設為空列表。

因此,DNS=設置resolved.conf永遠不會阻止使用每個連結的 DNS 伺服器。

為了解決您的問題,我建議您執行以下操作:

如果 192.168.200.1 是 3G 調製解調器的 IP 地址,它只是充當 3G 網路運營商的 DNS 伺服器的代理。找出這些伺服器的真實 IP 地址(可能通過檢查 3G 調製解調器本身的網際網路端網路設置,當它有連結時)。然後使用DNS=./etc/systemd/resolved.conf

在此之後,DNS 請求應該與 3G 網路的 DNS 伺服器並行(因為有DNS=一行 in resolved.conf)以及適用的每個連結 DNS 伺服器。由於您現在配置了系統範圍的 DNS 伺服器,因此現在應該只在查詢 domain 中的名稱時使用 3G 調製解調器的內置 DNS 服務*.rig,因為這就是DNS Domain:設置的enp3s0含義。

如果 3G 網路連結斷開,直接使用 3G 網路的 DNS 伺服器的嘗試現在應該毫無疑問地失敗(而不是從調製解調器本身產生可能不明確的響應),給出resolved這個 DNS 伺服器不再可用的線索,它應該考慮其他替代方案。只要連接檢查增加了其他連結的優先級,就應該開始使用其每個連結的 DNS 伺服器。

如果 3G 調製解調器的管理 Web 界面可以使用類似 的名稱訪問<something>.rig,則無論 3G 連結是打開還是關閉,只要調製解調器本身可以訪問,它仍然可以使用該名稱訪問。

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