背景 链接到标题
自建 NetBird 控制平面后,节点间可以通过 *.netbird.selfhosted 域名互相访问。但实际部署中发现 DNS 表现因节点环境而异,部分节点需要额外配置才能正常工作。
NetBird DNS 的三层结构 链接到标题
NetBird 的 DNS 由三层组成:
应用 → 系统解析器 → NetBird magic DNS (100.121.255.254)
├── peer 域名 (peer-a.netbird.selfhosted → 100.121.*)
├── Nameserver Group (*.lan → 100.121.*.*:53 dnsmasq)
└── 普通域名 → 上游 DNS
其中 100.121.255.254 是 NetBird 的 magic DNS 地址(类似 Tailscale 的 100.100.100.100),负责按域名规则路由查询。
场景一:macOS 链接到标题
在 macOS 上 NetBird 通过系统框架(scutil)自动注册 DNS。
# 查看当前 DNS 配置
scutil --dns
输出中可以看到 NetBird 注册了:
domain : netbird.selfhosted
nameserver : 100.121.255.254
domain : lan
nameserver : 100.121.255.254
配合搜索域,短名也能自动补全:
# FQDN
dscacheutil -q host -a name peer-a.netbird.selfhosted
→ 100.121.*.*
# 短名(自动补全 peer-a.netbird.selfhosted)
dscacheutil -q host -a name peer-a
→ 100.121.*.*
# .lan 域(经 peer-a dnsmasq 解析)
dscacheutil -q host -a name peer-a.lan
→ 192.168.*.*
macOS 上不需要改 /etc/hosts,也无需任何额外配置。
场景二:Linux + systemd-resolved(推荐) 链接到标题
Ubuntu/Debian 默认启用 systemd-resolved,NetBird 能自动注册 DNS。
# 验证 systemd-resolved
systemctl is-active systemd-resolved
正常时应输出 active。resolvectl status 应显示 wt0 接口已注册 DNS:
Link 4 (wt0)
Current DNS Server: 100.121.*.*
DNS Domain: ~lan netbird.selfhosted ~*.in-addr.arpa
如果 systemd-resolved 未运行,启动它并将 /etc/resolv.conf 改为指向 systemd-resolved:
sudo systemctl enable --now systemd-resolved
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
然后重启 NetBird。
场景三:Linux + 本机 DNS 查询超时(WireGuard 回环问题) 链接到标题
在一台树莓派(ARM64)上发现:从本机查询 NetBird DNS 代理总是超时,但从其他节点远程查询却正常。
# 其他节点 OK
dig peer-a.netbird.selfhosted @100.121.*.* → 100.121.*.* ✅
# 本机超时
dig peer-a.netbird.selfhosted @100.121.*.* → 超时 ❌
tcpdump 显示 DNS 查询包已到达 loopback 接口,但 NetBird 进程未回应。原因是 WireGuard 内核接口对自身 IP 的回环流量处理存在限制。
修复:用 --dns-resolver-address 让 NetBird DNS 监听在 127.0.0.1,绕过 WireGuard 接口。
sudo netbird down
sudo netbird up \
--management-url https://your-management-url \
--setup-key YOUR_KEY \
--dns-resolver-address 127.0.0.1
验证:
dig peer-a.netbird.selfhosted @127.0.0.1
→ 100.121.*.* ✅
该配置已持久化到 default.json。
场景四:Linux + 同时运行 dnsmasq 链接到标题
如果节点同时运行 dnsmasq(占用 53 端口),NetBird DNS 会被禁用(disable_dns: true)。
对于 dnsmasq 节点本身,在 /etc/hosts 中添加 NetBird 节点的 IP:
100.121.*.* peer-a peer-a.netbird.selfhosted
100.121.*.* peer-b peer-b.netbird.selfhosted
对于局域网中走该 dnsmasq 的其他设备,修改 dnsmasq 的 hosts 配置文件,将跨网络节点的 IP 改为 NetBird IP:
# 原配置(家庭/云节点使用办公室 LAN IP,不通)
192.168.*.* peer-b peer-b.lan
# 改为 NetBird IP(所有环境都能通)
100.121.*.* peer-b peer-b.lan
这样办公室设备通过 dnsmasq 查询 peer-b 时,自动返回 NetBird IP,无需逐个配置。
总结 链接到标题
| 环境 | 配置方式 | 短名支持 |
|---|---|---|
| macOS | 无需配置 | ✅ search netbird.selfhosted |
| Linux + systemd-resolved | 启用 resolved 即可 | ✅ |
| Linux + DNS 超时 | --dns-resolver-address 127.0.0.1 |
✅ |
| Linux + dnsmasq | /etc/hosts + dnsmasq hosts |
✅ |