![OpenVPN:并非所有 DNS 条目都会从服务器推送到客户端。(dnsmasq)](https://linux22.com/image/578894/OpenVPN%EF%BC%9A%E5%B9%B6%E9%9D%9E%E6%89%80%E6%9C%89%20DNS%20%E6%9D%A1%E7%9B%AE%E9%83%BD%E4%BC%9A%E4%BB%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8E%A8%E9%80%81%E5%88%B0%E5%AE%A2%E6%88%B7%E7%AB%AF%E3%80%82%EF%BC%88dnsmasq%EF%BC%89.png)
我一直在尝试寻找解决这个问题的方法,但到目前为止还没有找到答案,所以我希望你们能帮助我。
我有一台运行 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 被阻止,因此导致超时。
到目前为止我已经尝试了很多方法,但仍然不起作用:
- 设置 DNS 服务器权威(如上面的 dnsmasq.conf 所示:dhcp-authoritative)。
- 在 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。