问题场景描述
在开发测试环境中,我们经常遇到这样的网络架构需求:
- 默认互联网访问走WiFi接口(wlo1)
- 企业内网私有域名(如*.private-site.com)必须通过有线网卡(enp39s0)访问
当前配置下,虽然路由表已经设置了10.64.0.1的静态路由,但DNS查询仍然没有按预期走指定网卡:
dig k8s0292274-node1.lab3.private-site.com
;; SERVER: 127.0.0.53#53(127.0.0.53) # 仍然走本地解析
系统DNS配置分析
通过systemd-resolve查看当前配置:
Link 2 (enp39s0)
DNS Servers: 192.168.2.1 10.64.0.1
DNS Domain: corp.private-site.com labcorp.private-site.com private-site.com
Link 3 (wlo1)
DNS Servers: 8.8.8.8 8.8.4.4
问题在于systemd-resolved没有正确应用基于域名的DNS路由策略。
解决方案实现
我们需要结合NetworkManager和systemd-resolved实现精确控制:
方法一:NetworkManager配置
修改/etc/NetworkManager/conf.d/dns.conf:
[main]
dns=systemd-resolved
systemd-resolved=false
[connection]
connection.mdns=2
connection.llmnr=2
然后为有线连接添加私有域路由:
nmcli connection modify "有线连接" ipv4.dns-search "private-site.com"
nmcli connection modify "有线连接" ipv4.dns-priority 10
nmcli connection modify "有线连接" ipv4.ignore-auto-dns yes
nmcli connection modify "有线连接" ipv4.dns "192.168.2.1 10.64.0.1"
方法二:直接配置systemd-resolved
创建/etc/systemd/resolved.conf.d/private-dns.conf:
[Resolve]
DNS=192.168.2.1 10.64.0.1
Domains=~private-site.com ~corp.private-site.com ~labcorp.private-site.com
然后重启服务:
systemctl restart systemd-resolved
验证配置效果
使用dig命令指定网卡进行测试:
dig @192.168.2.1 k8s0292274-node1.lab3.private-site.com
dig +short k8s0292274-node1.lab3.private-site.com
检查解析路径:
systemd-resolve --status private-site.com
高级路由配置(可选)
如果需要更精细的控制,可以添加策略路由:
ip rule add from 192.168.2.0/24 lookup 100
ip route add default via 192.168.2.1 dev enp39s0 table 100
这样所有来自有线网络的请求(包括DNS查询)都会走指定路由表。
常见问题排查
- 确保NetworkManager不会覆盖配置:
nmcli general permissions
- 检查resolv.conf是否指向127.0.0.53
- 使用
journalctl -u systemd-resolved -f
查看实时日志