OpenVPN、resolvconf 和 DNS 域解析

OpenVPN、resolvconf 和 DNS 域解析

在 site1 时,我需要通过 OpenVPN 连接到 site2。连接后,OpenVPN site2 会推送 DNS 名称服务器和域搜索选项。这会导致 site1 的所有名称解析失败。

例子:

  1. 在 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
    
  2. 打开到 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
    
  3. 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-resolvno-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 名称服务器和域搜索选项。

  1. 连接到 VPN 时,使用resolvconf -l查看所有 resolv.conf 文件。找出 VPN 接口的 resolvconf 名称(即“resolv.conf from X”中的 X)。就我而言,它是tun0,我将在其余配置中使用它。
  2. 安装 dnsmasq
  3. 编辑/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
    
  4. 编辑/etc/dnsmasq.conf以添加这些选项:

    conf-file=/etc/dnsmasq-conf.conf
    resolv-file=/etc/dnsmasq-resolv.conf
    
  5. 运行resolvconf -u以生成 dnsmasq 配置文件。

  6. 启动dnsmasq服务并将其配置为开机启动。在 Arch 上,这是通过运行以下命令来完成的:

    systemctl start dnsmasq.service
    systemctl enable dnsmasq.service
    

name_servers选项告诉 resolvconf 仅列出那些名称服务器/etc/resolv.conf(即它指向您的本地 dnsmasq 实例)。这些dnsmasq_选项告诉 resolvconf 将本来应该写入/etc/resolv.confdnsmasq 配置文件的名称服务器写入。

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 的所有条目,当然反之亦然。问候

相关内容