Linux多网卡环境下实现私有域名DNS查询的定向路由配置


阅读 3 次

问题场景描述

在开发测试环境中,我们经常遇到这样的网络架构需求:

  • 默认互联网访问走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查看实时日志