跳至主要内容

將公共 DNS 重新導向至本地解析器

LAN plaintext DNS 由 IPAddressSet 符合並 redirect 到 local DNSResolver 的構成

當 LAN 用戶端試圖直接將明文 DNS 查詢送往知名公共解析器時, 僅將 TCP/UDP port 53 重新導向至路由器本地解析器的範例。 DoH 及 DoT 的連接埠不受影響。

完整 YAML 位於 examples/example-local-dns-redirect.yaml

構成圖

圖示對應表

編號含義主要資源
[1]試圖直接查詢公共 DNS 的用戶端。external client
[2]prerouting 重新導向規則比對的 LAN 介面。LocalServiceRedirect/lan-local-services.spec.interface
[3]接收重新導向後 port 53 流量的本地解析器。DNSResolver/lan-resolver
[4]展開至 nftables set 的完整比對 FQDN。IPAddressSet/public-dns
[5]本地解析器實際使用的上游解析器。DNSForwarder, DNSUpstream

要點

# [4] 將 public DNS 的 exact name 解析到 IPAddressSet。
- apiVersion: net.routerd.net/v1alpha1
kind: IPAddressSet
metadata:
name: public-dns
spec:
names:
- dns.google
- one.one.one.one
refreshInterval: 10m

# [2] -> [3] 只將明文 DNS port 53 重新導向到 local resolver。
- apiVersion: firewall.routerd.net/v1alpha1
kind: LocalServiceRedirect
metadata:
name: lan-local-services
spec:
interface: lan
rules:
- name: public-dns
protocols: [tcp, udp]
destinationSetRef: IPAddressSet/public-dns
destinationPort: 53
redirectPort: 53

IPAddressSet.spec.names 為完全比對的 DNS 名稱。 dns.google 不包含子網域。請明確列舉所有需要的目的地名稱。

確認

routerctl validate -f examples/example-local-dns-redirect.yaml --replace
routerctl plan -f examples/example-local-dns-redirect.yaml --replace
routerctl describe IPAddressSet/public-dns
nft list table ip routerd_nat

從 LAN 用戶端可透過以下方式確認:

dig @8.8.8.8 router.home.example
dig @1.1.1.1 router.home.example