acl

原始碼

acl 會針對來源 IP 強制執行存取控制策略,並防止未經授權存取 DNS 伺服器。

說明

啟用 acl 後,使用者可以透過設定 IP 過濾規則集,來封鎖或過濾可疑的 DNS 查詢,亦即允許授權的查詢或封鎖未經授權的查詢。

在評估規則集時,acl 會使用 CoreDNS 接收到的 DNS 查詢的 TCP/UDP 標頭的來源 IP。在請求的來源 IP 在傳輸過程中被變更的情況下,此來源 IP 會與發起請求的用戶端 IP 不同。例如:

  • 如果請求在到達 CoreDNS 之前經過中間轉發 DNS 伺服器或遞迴 DNS 伺服器
  • 如果請求在到達 CoreDNS 之前經過來源 NAT

此外掛程式可以在每個伺服器區塊中使用多次。

語法

acl [ZONES...] {
    ACTION [type QTYPE...] [net SOURCE...]
}
  • ZONES 應為其授權的區域。如果為空,則使用組態區塊中的區域。
  • ACTIONallowblockfilterdrop)定義處理符合此規則的 DNS 查詢的方式。預設動作為 allow,表示任何不符合任何規則的 DNS 查詢都將允許遞迴。blockfilter 之間的區別在於 block 會傳回 REFUSED 的狀態碼,而 filter 會傳回空的集合 NOERROR。但是,drop 不會傳回任何回應給用戶端。
  • QTYPE 是要允許或封鎖的請求所要符合的查詢類型。支援常見的資源記錄類型。* 代表所有記錄類型。省略 type QTYPE... 的預設行為是比對所有類型的 DNS 查詢(與 type * 相同)。
  • SOURCE 是要允許或封鎖的請求所要符合的來源 IP 位址。支援典型的 CIDR 表示法和單一 IP 位址。* 代表所有可能的來源 IP 位址。

範例

為了示範外掛程式 acl 的用法,我們在此提供一些典型的範例。

封鎖來自 192.168.0.0/16 的所有記錄類型為 A 的 DNS 查詢:

. {
    acl {
        block type A net 192.168.0.0/16
    }
}

過濾來自 192.168.0.0/16 的所有記錄類型為 A 的 DNS 查詢:

. {
    acl {
        filter type A net 192.168.0.0/16
    }
}

封鎖來自 192.168.0.0/16 的所有 DNS 查詢,但 192.168.1.0/24 除外

. {
    acl {
        allow net 192.168.1.0/24
        block net 192.168.0.0/16
    }
}

僅允許來自 192.168.0.0/24 和 192.168.1.0/24 的 DNS 查詢

. {
    acl {
        allow net 192.168.0.0/24 192.168.1.0/24
        block
    }
}

封鎖來自 192.168.1.0/24 對 a.example.org 的所有 DNS 查詢

example.org {
    acl a.example.org {
        block net 192.168.1.0/24
    }
}

捨棄來自 192.0.2.0/24 的所有 DNS 查詢

. {
    acl {
        drop net 192.0.2.0/24
    }
}

指標

如果啟用監控(透過 prometheus 外掛程式),則會匯出下列指標

  • coredns_acl_blocked_requests_total{server, zone, view} - 被封鎖的 DNS 請求計數器。

  • coredns_acl_filtered_requests_total{server, zone, view} - 被過濾的 DNS 請求計數器。

  • coredns_acl_allowed_requests_total{server, view} - 被允許的 DNS 請求計數器。

  • coredns_acl_dropped_requests_total{server, zone, view} - 被捨棄的 DNS 請求計數器。

metrics 外掛程式文件中說明了 serverzone 標籤。