在 site1 时,我需要通过 OpenVPN 连接到 site2。连接后,OpenVPN site2 会推送 DNS 名称服务器和域搜索选项。这会导致 site1 的所有名称解析失败。
例子:
在 site1 上进行物理连接,DHCP 推送 DNS 选项并由 resolvconf 管理它们。
/etc/resolv.conf# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 172.16.1.101 nameserver 172.16.1.102 search site1.internal.domain
打开到 site2 的 OpenVPN 隧道,OpenVPN 推送 site2 的 dhcp-option DNS 和 DOMAIN 并将
/etc/openvpn/update-resolv-conf
它们推送到 resolvconf。
/etc/resolv.conf# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 192.168.1.5 nameserver 172.16.1.101 nameserver 172.16.1.102 search site2.internal.domain site1.internal.domain
DNS 解析适用于 server.site2.internal.domain,但不适用于 server.site1.internal.domain
有没有办法让对 site21 的任何失败的 DNS 请求都传递到 site1 DNS 服务器?或者配置 resolvconf 只将 site2.internal.domain 的查询传递给 site2 名称服务器?
我在 site1 使用 Ubuntu 14.04 机器,site2 的 OpenVPN 服务器是 pfSense 2.2 盒子。我管理这两个网站,因此对任何一方进行更改都不是问题。这两个域均为非公开且仅供内部使用。
答案1
您可以设置一个本地缓存服务器来监视您的/etc/resolv.conf
,因为它是由resolvconf
脚本更改的,并尝试从全部那里列出了名称服务器。
在许多系统上,安装域名解析包,除了 resolvconf。
如果no-resolv
和no-poll
指令不存在/etc/dnsmasq.conf
并且lo
接口位于 的顶部/etc/resolvconf/interface-order
,则默认值应该“正常工作”。如果上游名称服务器为无法解析的地址返回一些任意 IP,strict-order
则 dnsmasq.conf 可以提供帮助。你/etc/resolv.conf
应该只显示nameserver 127.0.0.1
.
如果您更喜欢固定设置或连接到多个不相关的网络,并且希望避免将您的专用网络名称泄露给所有名称服务器,您应该配置 dnsmasq 以根据域查询特定服务器:
# /etc/dnsmasq.conf
# site1 servers
nameserver=/site1.internal.domain/172.16.1.101
nameserver=/site1.internal.domain/172.16.1.102
# site2 servers
nameserver=/site2.internal.domain/192.168.1.5
# default OpenNIC (optional, unless 'no-resolv' is set).
server=51.15.98.97
server=172.104.136.243
有关 dnsmasq 选项的更多信息,请参阅此处: http://oss.segetech.com/intra/srv/dnsmasq.conf
答案2
我还没有在 Ubuntu 上尝试过这个,但我能够使用 openresolv 和 dnsmasq 在 Arch Linux 上获得类似的设置。
所有更改都将在 VPN 客户端计算机上进行。 VPN 服务器不需要任何更改,因为它已经包含 DNS 名称服务器和域搜索选项。
- 连接到 VPN 时,使用
resolvconf -l
查看所有 resolv.conf 文件。找出 VPN 接口的 resolvconf 名称(即“resolv.conf from X”中的 X)。就我而言,它是tun0
,我将在其余配置中使用它。 - 安装 dnsmasq
编辑
/etc/resolvconf.conf
以添加这些选项:private_interfaces=tun0 name_servers="::1 127.0.0.1" dnsmasq_conf=/etc/dnsmasq-conf.conf dnsmasq_resolv=/etc/dnsmasq-resolv.conf
编辑
/etc/dnsmasq.conf
以添加这些选项:conf-file=/etc/dnsmasq-conf.conf resolv-file=/etc/dnsmasq-resolv.conf
运行
resolvconf -u
以生成 dnsmasq 配置文件。启动
dnsmasq
服务并将其配置为开机启动。在 Arch 上,这是通过运行以下命令来完成的:systemctl start dnsmasq.service systemctl enable dnsmasq.service
该name_servers
选项告诉 resolvconf 仅列出那些名称服务器/etc/resolv.conf
(即它指向您的本地 dnsmasq 实例)。这些dnsmasq_
选项告诉 resolvconf 将本来应该写入/etc/resolv.conf
dnsmasq 配置文件的名称服务器写入。
该private_interface
选项告诉 resolvconf,仅当解析该行指定的域之一中的主机名时,才应使用该接口(您的 VPN)提供的名称服务器search
。它将生成适当的 dnsmasq 配置来实现这一点。
使用此配置,对 site2.internal.domain 下主机的请求应转到 192.168.1.5,所有其他请求应转到 172.16.1.101 或 172.16.1.102。
如果您的系统不使用 IPv6,请从选项中删除 ::1 name_servers
。
答案3
resolv.conf 列出所有可用的 DNS 服务器。只要列表中的第一个启动并运行,所有查询都将发送给它。除非第一个失败,否则对其他人没有任何影响。因此,如果列表中的第一个 DNS 服务器已启动并且知道答案,他会回复“我知道!”,否则他会说“恐怕我不知道......”。就这样。您必须使 192.168.1.5(site2 的 DNS 服务器)知道 site1 的所有条目,当然反之亦然。问候