将公共 DNS 重定向至本地解析器

当 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 不包含子域名。请明确列举所有需要的目的地名称。
确认
先在 daemon 未启动时进行独立检查。以下命令需要具有 sudo 权限的本地用户,但不会应用网络变更。
LAB_DIR="$(mktemp -d)"
sudo routerd validate --config examples/example-local-dns-redirect.yaml
sudo routerd apply --config examples/example-local-dns-redirect.yaml --once --dry-run --skip-service-manager \
--state-file "$LAB_DIR/state.db" \
--ledger-file "$LAB_DIR/ledger.db" \
--status-file "$LAB_DIR/status.json"
rm -rf "$LAB_DIR"
服务已运行后,才在路由器上运行 sudo routerctl describe IPAddressSet/public-dns
和 sudo nft list table ip routerd_nat。
从 LAN 客户端可通过以下方式确认:
dig @8.8.8.8 router.home.example
dig @1.1.1.1 router.home.example