问题描述
题
当我在充当路由器的ubuntu台式计算机上启动VPN时,连接的子网失去了互联网连接,但仍可访问(LAN)。理想情况下,我想知道如何在VPN处于活动状态时通过VPN隧道路由启用连接的子网到re-gain Internet访问。
上下文
我有以下网络布局:
我的VirtualBox虚拟机的eth0上的子网172.16.0.0/20。
eth0:0上的子网192.168.0.0/24连接到具有Internet访问权限的网关192.168.0.1。
这显示在/etc /network /interfaces文件中:
auto lo
iface lo inet loopback
# This is the subnet dedicated to VB
auto eth0
iface eth0 inet static
address 172.16.0.1
netmask 255.255.0.0
gateway 192.168.0.164
dns-nameservers 8.8.8.8
# normal DHCP internet
auto eth0:0
iface eth0:0 inet static
address 192.168.0.164
netmask 255.255.255.0
dns-nameservers 8.8.8.8
gateway 192.168.0.1
eth0上的数据包通过eth0:0转发,伪装,正常的互联网连接正常。但是,当我在此路由器上启动VPN隧道时,eth0子网上的虚拟机的互联网连接将丢失(但仍为路由器保留)。
以下是隧道处于活动状态时ifconfig的输出:
eth0 Link encap:Ethernet HWaddr 00:1f:bc:01:c3:ab
inet addr:172.16.0.1 Bcast:172.16.255.255 Mask:255.255.0.0
inet6 addr: fe80::21f:bcff:fe01:c3ab/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:165426 errors:0 dropped:0 overruns:0 frame:0
TX packets:182601 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:208264321 (208.2 MB) TX bytes:16660945 (16.6 MB)
Interrupt:16
eth0:0 Link encap:Ethernet HWaddr 00:1f:bc:01:c3:ab
inet addr:192.168.0.164 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:16
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:381963 errors:0 dropped:0 overruns:0 frame:0
TX packets:381963 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:22755054 (22.7 MB) TX bytes:22755054 (22.7 MB)
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.10 P-t-P:10.8.0.9 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
我怀疑该解决方案将与路由表有关。隧道处于活动状态时显示以下内容:
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.8.0.9 128.0.0.0 UG 0 0 0 tun0
default 192.168.0.1 0.0.0.0 UG 100 0 0 eth0
10.8.0.0 10.8.0.9 255.255.255.0 UG 0 0 0 tun0
10.8.0.9 * 255.255.255.255 UH 0 0 0 tun0
37.139.23.49 192.168.0.1 255.255.255.255 UGH 0 0 0 eth0
128.0.0.0 10.8.0.9 128.0.0.0 UG 0 0 0 tun0
link-local * 255.255.0.0 U 1000 0 0 eth0
172.16.0.0 * 255.255.0.0 U 0 0 0 eth0
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
以及隧道不活动时的以下内容:
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 100 0 0 eth0
link-local * 255.255.0.0 U 1000 0 0 eth0
172.16.0.0 * 255.255.0.0 U 0 0 0 eth0
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
Vms的Virtualbox配置:
其中一个VM /etc/network/interfaces
文件:
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 172.16.0.3
netmask 255.255.0.0
network 172.16.0.0
broadcast 172.16.255.255
gateway 172.16.0.1
dns-nameservers 8.8.8.8
最佳解决思路
这在桥接网络设置中不起作用。来自VirtualBox documentation:
Bridged networking
This is for more advanced networking needs such as network simulations and running servers in a guest. When enabled, VirtualBox connects to one of your installed network cards and exchanges network packets directly, circumventing your host operating system’s network stack.
由于您的虚拟机直接使用eth0
,因此它们不知道通过它运行的隧道的tun0
接口。您将需要使用其他虚拟网络配置。
你有(以及其他)这些选项:
-
网络地址转换(NAT)是迄今为止最简单的解决方案。 VirtualBox将通过主机可用的任何互联网连接对虚拟机进行NAT。这对VM完全透明。但是,这会阻止从主机到VM的连接或VM之间的连接。
-
使用Host-only网络创建包含VM和主机的正确子网。这将不需要更改您现在在VM中的接口配置,但您需要将主机设置为网关和路由器,并使其成为NAT到外部的VM(无论是跨越
eth0
还是tun0
)。 -
结合以上内容:为每个VM提供两个接口,一个接入外部世界(跨VirtualBox的NAT),另一个接入Host-Only LAN。
-
尝试VirtualBox的实验性NAT网络配置。我没有调查过,但是its description认为它可能是合适的。
次佳解决思路
对于具有Windows主机和linux(铸币)客户机的VirtualBox,请转到网络UI选项卡并设置为”Adapter” => “附加到:NAT”和“适配器类型:半虚拟化网络”。之后启动您的VM,您应该能够使用VPN网络。
第三种解决思路
在到处寻找这个解决方案后,我终于找到了一个不需要进行大量配置更改的工作解决方案,而且非常简单。使用默认NAT网络并在终端中键入:
VBoxManage modifyvm "VM name" --natdnsproxy1 on
来源:https://www.virtualbox.org/ticket/13993
第四种思路
有同样的问题。这是我解决它的方式:
-
将Guest System的网络类型更改为”Host Only”
-
将Guest的默认网关指向Host的ip
ifconfig vboxnet0
以查找它。
最后一步是将来自vboxnet0的数据包路由到您的VPN。
如果您通过VPN路由所有流量:
iptables -t nat -A POSTROUTING -s 192.168.5.0/24 ! -d 192.168.5.0/24 -o tun0 -j SNAT --to-source 10.8.0.5
其中10.8.0.5
是您的tun0网关,192.168.5.0/24
是您的vboxnet0网络范围。
如果您只通过VPN路由某些流量:
iptables -t nat -A POSTROUTING -s 192.168.5.0/24 ! -d 192.168.5.0/24 -o tun0 -j SNAT --to-source 10.8.0.5
iptables -t nat -A POSTROUTING -s 192.168.5.0/24 ! -d 192.168.5.0/24 -o wlan0 -j SNAT --to-source 192.168.43.95
其中10.8.0.5
是您的tun0网关,192.168.43.95
是您的wlan0
的网关,192.168.5.0/24
是您的vboxnet0网络范围。
注意:此解决方案允许以与处理主机操作系统相同的方式处理客户操作系统。只有在主机操作系统中配置为通过VPN的IP才会在Guest中通过它。
第五种思路
以下是使用主机vpn的流浪盒的一些有用信息。基本上你需要设置natdnshostresolver1选项请注意,这在使用Vagrant的public_network设置时不起作用。
config.vm.provider :virtualbox do |vb|
# ---- other options....
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
end
http://renier.morales-rodriguez.net/post/90674523562/sharing-host-vpn-with-virtualbox-guest http://blog.geekslikeshinythings.com/2016/05/sharing-host-vpn-with-vagrant-rob-allen.html