我正在构建一个虚拟 Ubuntu 服务器(Proxmox 上的 LXC),它将充当路由器并通过 VPN(expressVPN)隧道传输我本地网络的某些设备(例如 AppleTV)。连接和路由到不同的 VPN 目的地(不同的国家)是有效的。
但是一些服务仍然知道我不是从 VPN 服务器所在的国家打电话。(我认为这叫做DNS 泄漏???)
那是因为我的客户,假设 AppleTV 机顶盒使用 1.1.1.1 作为 DNS。它不知道 VPN 服务器发布到我的网关的 DNS 服务器。
为了防止这种情况发生,我想使用连接时收到的 VPN 的 DNS 服务。我将 AppleTV 指向我的网关作为 DNS,并编写了一些 iptables 规则来对 VPN 服务器提供的 DNS 服务器的请求进行 DNAT。(希望这是有道理的)
# Route DNS Traffic
iptables -t nat -A PREROUTING -p tcp --dst x.x.x.x --dport 53 -j DNAT --to-destination 10.54.0.1:53
iptables -t nat -A PREROUTING -p udp --dst x.x.x.x --dport 53 -j DNAT --to-destination 10.54.0.1:53
这很好用。
问题
如何在建立 OpenVPN 连接时自动生成这些规则?当连接到另一个 VPN 站(例如不同的国家)时,特定的 DNS 地址将会改变。或者有更好的解决方案吗?
我正在考虑将其放入update-systemd-resolved
,但这似乎太复杂了。我认为有一个简单的方法。
我感谢任何提示。
欢迎,您可以在您的 openvpn *.conf 文件中使用
up
anddown
命令 这些允许执行自定义脚本。script-security 2
如果你走这条路,则需要示例:真正的
iptables
命令在这些脚本中。请查看手册页是否script-security 2
适合您。我会回答我自己的问题来展示我的解决方案。
我了解到 resolved 通过存根 (127.0.0.53) 使用 dns,因此知道如何使用 VPN 的 DNS。
我“只是”必须转发/nat 来自使用此服务器作为网关(和 DNS)的 LAN 客户端的 DNS 请求。
在 openvpn 客户端配置中,我添加了以下几行:
我的脚本已经...
向下
主要丢弃其他东西的基本规则
请注意这些规则,我必须添加它们,以便节点本身可以在 vpn 连接关闭后查找名称(可能是因为我想将 vpn 配置切换到另一台服务器)。
最后一件事是动态添加 DNS nat
然后删除它
也许这会帮助其他正在构建 vpn 网关的人。