OpenVPN:并非所有 DNS 条目都会从服务器推送到客户端。(dnsmasq)

OpenVPN:并非所有 DNS 条目都会从服务器推送到客户端。(dnsmasq)

我一直在尝试寻找解决这个问题的方法,但到目前为止还没有找到答案,所以我希望你们能帮助我。

我有一台运行 Ubuntu 10.04 的服务器,它有一个静态 IP 地址和一个指向它的 URL,比如 server.foo.com

在此服务器上,我运行了一个具有以下配置的 OpenVPN 服务器:

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 10.8.0.1"
;push "dhcp-option DOMAIN foo.com"
keepalive 10 120
tls-auth ta.key 0
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
verb 1
plugin /usr/lib/openvpn/openvpn-auth-pam.so vpnlogin

客户端配置如下:

client
dev tun
proto udp
remote server.foo.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
auth-user-pass
ca ca.crt
cert server.crt
key server.key
ns-cert-type server
tls-auth ta.key 1
comp-lzo
verb 1
auth-nocache

从服务器配置中可以看到,我还在其上运行了一个 DNS 服务器。该服务器是 dnsmasq 服务器,在 /etc/dnsmasq.conf 中有以下配置:

interface=tun0
listen-address=127.0.0.1
dhcp-authoritative
cache-size=0
no-negcache

/etc/dnsmasq.d/ 中有一些文件将 URL 路由回此服务器,这些文件应推送到 VPN 客户端。其中最重要的文件包括:

address=/server.foo.com/10.8.0.1

请注意,此 URL 与我的公共 URL 完全相同。我还创建了其他 DNS 条目进行测试,例如 address=/server2.foo.com/10.8.0.1

现在我在这个服务器上运行了一个 HTTP 服务,我只想允许我的 LAN 内的用户以及 OpenVPN 客户端访问它。我已阻止 ufw 中的所有传入流量,但以下情况除外:

To         Action       From
1194       ALLOW        Anywhere
53         ALLOW        10.8.0.0/24
80/tcp     ALLOW        10.8.0.0/24
80/tcp     ALLOW        192.168.0.0/24

现在终于到了我的问题。当 OpenVPN 客户端连接时,dnsmasq 中的 DNS 条目应该被推送到客户端,而客户端也确实这么做了。

但是 server.foo.com 条目显然被忽略了,也许是因为支持公共 DNS。当我在 LAN 之外但连接到 VPN 的情况下在 Firefox 或 Chrome 中输入 server.foo.com 时,会出现超时。10.8.0.1 和其他条目(例如 server2.foo.com)都可以正常工作。

Windows 7 32 位中的跟踪路由显示,例如 server2.foo.com 一跳就发送到 10.8.0.1,但 server.foo.com 通过公共 DNS 服务器尝试连接到我的公共静态 IP,但该 IP 被阻止,因此导致超时。

到目前为止我已经尝试了很多方法,但仍然不起作用:

  1. 设置 DNS 服务器权威(如上面的 dnsmasq.conf 所示:dhcp-authoritative)。
  2. 在 OpenVPN 的 server.conf 中推送“dhcp-option DOMAIN foo.com”。

抱歉,这个问题可能很短,但帖子却这么长。希望有人能帮助我。

谨致问候,迈克。

答案1

我认为你的设置将会中断或者无法工作:

您的 OpenVPN 客户端配置使用 server.foo.com 的公共地址连接到 OpenVPN 服务器。显然,在建立 VPN 隧道之前会查找此地址。

在使用 dnsmasq 配置建立隧道后,您尝试使用 OpenVPN IP 推送 server.foo.com 的 DNS 条目。OpenVPN 客户端要么忽略它(因为它已经知道 server.foo.com,因为它必须查找它才能建立隧道),要么尊重它,然后放弃隧道,因为 OpenVPN 客户端配置将指向现在不存在的 IP 地址。后者很可能在您的 OpenVPN 会话期间发生,具体取决于 server.foo.com 公共 IP 的 DNS 服务器的 TTL。

TL;DR:您基本上是想告诉您的客户端有关 server.foo.com 的矛盾信息。我想不出一个好方法来做您想做的事情。另一种选择可能是设置第二个 DNS 条目 A 记录 vpnserver.foo.com,该记录指向与 server.foo.com 相同的 IP,然后更改您的 OpenVPN 配置以使用该 IP。

答案2

虽然很晚,但一个可能的解决方法可能是将所有客户端流量通过隧道转移(如果客户端场景允许的话)。您需要将以下指令添加到服务器的配置文件中。例如推送“redirect-gateway def1”有关详细信息,请参阅这里 这样客户端就不会检查公共 DNS。

相关内容