綁定

原始碼

bind 會覆寫伺服器應該綁定的主機。

描述

通常,監聽器會綁定到萬用字元主機。但是,您可能希望監聽器綁定到另一個 IP。

如果提供了多個位址,則會在提供的每個 IP 上開啟一個監聽器。

每個位址都必須是主機介面的 IP 或名稱。依介面名稱綁定,會在啟動或重新載入時綁定到該介面上的 IP(重新載入會在 SIGHUP 或組態檔變更時發生)。

如果給定的引數是介面名稱,且該介面有多個 IP 位址,則 CoreDNS 將會監聽該介面的所有 IP 位址(包括 IPv4 和 IPv6),除了該介面上的 IPv6 連結本機位址。

語法

在其基本形式中,簡單的綁定使用此語法

bind ADDRESS|IFACE  ...

您也可以使用擴展語法排除某些具有其 IP 位址或介面名稱的位址

bind ADDRESS|IFACE ... {
    except ADDRESS|IFACE ...
}
  • ADDRESS|IFACE 是要綁定的 IP 位址或介面名稱。當提供多個位址時,將在每個位址上開啟一個監聽器。請閱讀描述以取得更多詳細資訊。
  • except,排除要綁定的介面或 IP 位址。如果同一個伺服器區塊中使用多個 bind 指示,except 選項僅排除目前 bind 指示的位址。

範例

若要使您的套接字僅可由該機器存取,請綁定到 IP 127.0.0.1(本機主機)

. {
    bind 127.0.0.1
}

若要允許僅在本機主機上處理 IPv4 和 IPv6 堆疊上的 DNS 請求,請使用以下語法

. {
    bind 127.0.0.1 ::1
}

如果組態中有數個 bind 外掛程式,則所有位址會整合在一起:以下範例與前述範例等效

. {
    bind 127.0.0.1
    bind ::1
}

以下伺服器區塊,會使用其介面名稱(「127.0.0.1」和「::1」)綁定在本機主機上

. {
    bind lo
}

您可以使用其 IP 或介面名稱排除某些位址(以下將僅監聽 ::1 或已指派給 lo 介面的任何位址)

. {
    bind lo {
        except 127.0.0.1
    }
}

錯誤

避免監聽器競爭

TL;DR,當將 bind 外掛程式新增至伺服器區塊時,也必須將其新增至所有其他監聽相同連接埠的伺服器區塊。

當設定多個伺服器區塊以監聽通用連接埠時,這些伺服器區塊必須全部使用 bind 外掛程式,或全部使用預設綁定(沒有 bind 外掛程式)。請注意,此處的「連接埠」是指伺服器區塊設定為服務的 TCP/UDP 連接埠(預設為 53)- 而不是網路介面。對於監聽相同連接埠的兩個伺服器區塊,如果一個使用 bind 外掛程式,而另一個不使用,則會建立兩個單獨的監聽器,它們將爭奪服務傳送到相同位址的封包。這樣做會導致無法預測的行為(請求可能會由任一伺服器隨機服務)。發生這種情況是因為沒有 bind 外掛程式,伺服器將綁定到所有介面,如果另一個伺服器使用 bind 監聽相同連接埠上的位址,則會與其衝突。例如,以下程式碼會建立兩個都監聽 127.0.0.1:53 的伺服器,這會導致 a.bad.example.com 中查詢的行為無法預測

a.bad.example.com {
    bind 127.0.0.1
    forward . 1.2.3.4
}

bad.example.com {
    forward . 5.6.7.8
}

此外,在 MacOS 上有一個(開放式)錯誤,這無法正常運作。請參閱 https://github.com/miekg/dns/issues/724 以了解詳細資訊,但沒有解決方案。