如何使用Network Manager设置VPN的分割DNS

我想在一个14.04桌面机器上创建一个分割式DNS配置,同时具有本地eth网络和VPN连接。也就是说,我应该将通过VPN访问的地址范围的DNS查询发送到为该特定VPN连接配置的(私有的)DNS服务器。其他通过本地网络提供的地址应该使用不同的(公共的)DNS服务器。

https://www.stgraber.org/2012/02/24/dns-in-ubuntu-12-04/建议现在很容易做到这一点,因为我们有了一个本地的dnsmasq解析器。引用:

其中的一个重大优势是,如果您连接到VPN,与过去通过VPN路由所有DNS流量不同,您现在只会发送与该VPN公布的子网和域名相关的DNS查询。这对于高延迟的VPN连接尤其有趣,过去的情况下会减慢所有的操作速度。

但是我无法弄清楚如何使其工作!当VPN处于非活动状态时,网络管理器会告诉dnsmasq使用本地公共DNS服务器作为上游服务器(这很好)。如果我现在激活VPN连接,网络管理器会告诉dnsmasq将上游DNS服务器更改为为VPN连接配置的私有服务器。现在,我的所有本地流量都通过VPN进行DNS查询(这很糟糕!)
如果我有一个“真正的”dnsmasq设置,我可以在dnsmasq.conf中告诉它将特定的查询路由到特定的DNS服务器。但是,在Ubuntu桌面提供的简化版dnsmasq /网络管理器设置中,这是如何工作的呢?
我猜想其中一种选择就是安装完整的dnsmasq,但这意味着我需要在两个不同的地方维护配置详细信息,而这正是网络管理器大多数情况下要克服的问题。有什么建议吗?

这次讨论可能会有所启发:https://mail.gnome.org/archives/networkmanager-list/2014-October/msg00025.html - jdthood
你说“这是不好的”,但机器使用VPN名称服务器进行所有查询并不违法(即不违反RFC)。VPN名称服务器应该同时具有关于VPN和互联网的信息。不利之处首先在于这样做可能会很慢。其次,如果本地网络是一个不同的私有网络,那么这样做会将本地名称泄露给VPN。诚然,DNS从未被设计用来维护命名空间的隐私;DNS的设计假设只有一个全球公共命名空间。 - jdthood
3个回答

要让NetworkManager运行的D-Bus控制的dnsmasq使用不同的DNS服务器,有以下选项(显然在示例中调整域名和IP地址):
  • 将一个文件添加到/etc/NetworkManager/dnsmasq.d,设置所需子网的DNS服务器:myvpn-server.conf可以包含server=/myvpn.domain.com/10.8.4.9。即使未连接到VPN,dnsmasq也会始终遵守此设置,此时对于这些域的查询应该超时。缺点是需要静态指定IP地址,优点是简单明了。
  • 使用D-Bus直接与dnsmasq通信,告诉它使用类似sudo dbus-send --system --print-reply --dest=org.freedesktop.NetworkManager.dnsmasq /uk/org/thekelleys/dnsmasq uk.org.thekelleys.SetDomainServers "array:string:192.168.0.1,/myvpn.domain.com/10.8.4.9"的命令更新服务器。当VPN连接时,可以编写脚本来执行此操作。您需要通过D-Bus或使用nm-cli查找现有的DNS服务器(例如我的示例中的192.168.0.1)。
  • 使用D-Bus与Network Manager本身通信,并告诉它更新服务器。这里有一个示例,使用Python实现这一点需要一些工作,以包括当前的服务器。
我正在使用第一个选项,并且只尝试了其他两个的初步版本。

这很可能是服务器端的配置问题。VPN服务器应该只推送它可以解析的域名。
例如,如果您使用OpenVPN服务器,用户配置可能如下所示:
ifconfig-push 172.16.0.51 255.255.255.0
push "route 172.16.1.0 255.255.255.0 172.16.0.1"
push "route 192.168.2.0 255.255.255.0 172.16.0.6"
push "dhcp-option DNS 172.16.0.1"
push "dhcp-option DOMAIN some.of.your.domains"
push "dhcp-option DOMAIN another.domain"

通过这种方式,您的客户端将知道服务端只能解析在此指定的域名。

如果您使用Networkmanager,dnsmasq配置可以非常简洁。

domain-needed
interface=lo
bind-interfaces

另一个常见的陷阱是:您必须在networkmanager中配置您的VPN连接IP设置为“仅用于其网络上的资源”(例如这里:https://brmlab.cz/_media/project/warzone/nv-routes.png)。
否则,路由将始终使用您的VPN连接而不是“真实”的接口。通常情况下,networkmanager会正确设置度量值(VPN的度量值高于底层网络)。

你可能正在寻找IPv4和IPv6选项卡中的DNS搜索域和附加DNS服务器字段,这些字段位于nm-connection-editor应用程序中。
只需在那里输入你公司的域名和DNS服务器IP地址即可。