设置 VirtualBox DNS 存在问题的代理虚拟机

设置 VirtualBox DNS 存在问题的代理虚拟机

我想使用 Ubuntu 上的 VirtualBox 将两个 Linux (debian 9) VM 连接在一起,以便第一个 VM 充当第二个 VM (VM2) 的路由器,而第二个 VM 的流量完全通过第一个 VM (VM1) 路由。VM1 (网关) 连接到 VPN 服务,因此来自 VM2 的所有流量都连接到 VPN。

我已成功让 VM2 ping 通外部 IP(例如 8.8.8.8)。但所有其他网络均失败。我认为问题出在 DNS 解析上,出于某种我不知道的原因,VM1 无法解析 DNS 解析。

以下是我目前所做的工作:

在 VirtualBox 上,VM1 连接到一个 NAT 接口和第二个接口,后者是名为“testvpn”的内部网络。VM2 仅连接到此内部网络,而不连接到 NAT。

VM1 具有以下 /etc/network/interfaces 配置:

auto lo
iface lo inet loopback

allow-hotplug enp0s3
iface enp0s3 inet dhcp

allow-hotplug enp0s8
iface enp0s8 inet static
      address 10.152.152.10
      netmask 255.255.192.0

VM2 具有以下 /etc/network/interfaces 配置:

auto lo
iface lo inet loopback

allow-hotplug enp0s3
iface enp0s3 inet static
    address 10.152.152.15
    gateway 10.152.152.10
    netmask 255.255.255.0
    dns-nameservers 10.152.152.10

VM2 的 /etc/resolv.conf 指向 VM1:

nameserver 10.152.152.10

通过这个简单的配置,VM2 可以 ping VM1,但无法访问外部互联网。为此,我必须允许 IP 转发并在 VM1 上配置 iptables:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o enp0s8 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i enp0s8 -o tun0 -j ACCEPT

请注意,我特意使用 tun0 作为 VPN 网络接口,但使用 enp0s3 代替 tun0 的结果完全相同,并且未激活 VPN 隧道。现在我可以在 VM2 上 ping 外部地址,但所有其他网络连接均失败:

  $ curl google.com
    curl: (6) Could not resolve host: google.com

在阅读了一些在线资料后,我尝试在第一个网关虚拟机上添加据称与 DNS 相关的 iptables 规则:

iptables -t nat -A PREROUTING -i enp0s8 -p udp --dport 53 -j REDIRECT
iptables -t nat -A PREROUTING -i enp0s8 -p tcp --dport 53 -j REDIRECT

不起作用。请注意,无论是否使用 VPN,VM1 上的网络都可以正常工作。

我对 iptables 还不是很熟悉,我真的不知道下一步该怎么做。我花了几个小时在网上搜索解决方案,但没找到解决方案。我不想使用 dhcp/dnsmasq 解决方案,因为我确信 iptables 就足够了。

电视

答案1

编辑:我通过如下更改 PREROUTING 规则使其工作:

iptables -t nat -A PREROUTING -i enp0s8 -p udp --dport 53 -j DNAT --to-destination 10.4.0.1
iptables -t nat -A PREROUTING -i enp0s8 -p tcp --dport 53 -j DNAT --to-destination 10.4.0.1

10.4.0.1 是 VPN(AirVPN)的默认 DNS 名称服务器,如 /etc/resolv.conf 中所示。

我不确定这是否是正确的方法,但它有效......

所以现在我的整个 iptables 规则如下所示:

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o enp0s8 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i enp0s8 -o tun0 -j ACCEPT
iptables -t nat -A PREROUTING -i enp0s8 -p udp --dport 53 -j DNAT --to-destination 10.4.0.1
iptables -t nat -A PREROUTING -i enp0s8 -p tcp --dport 53 -j DNAT --to-destination 10.4.0.1

相关内容