如何正确将 Linux 虚拟机设置为网关以通过 Wireguard VPN 连接路由所有流量?

如何正确将 Linux 虚拟机设置为网关以通过 Wireguard VPN 连接路由所有流量?

几周以来,我一直在苦苦思索如何在 Mac 上设置 Linux 虚拟机,以充当 NordVPN 客户端和网关/路由器,以转发来自 LAN 上某些设备的所有流量通过 VPN 连接。

我的设置:

  • 我的 LAN 子网是 192.168.2.0/24。
  • 我有一台运行 macOS Big Sur 11.6 的 Mac Pro,安装了 Parallels Desktop Pro 17.0.1,并使用有线以太网连接到我的 LAN。
  • 在 Parallels 中,我设置了一个 Ubuntu 21.04 虚拟机。该虚拟机配置了两个 NIC -enp0s5enp0s6
  • 两个虚拟机网卡都桥接到主机上的默认有线适配器,并且都从 LAN 的 DHCP 服务器接收 IP。
  • 在虚拟机中,NordVPN 已安装且工作正常,配置为使用 Nordlynx (Wireguard) 作为协议。

我的目的是让虚拟机用于enp0s5访问互联网并连接到 NordVPN,同时用作enp0s6传入接口来接收来自 LAN 上其他设备的流量(并通过 VPN 转发它们)。

因此,首先我连接到 VPN:

$ nordvpn connect us
Connecting to United States #6918 (us6918.nordvpn.com)
You are connected to United States #6918 (us6918.nordvpn.com)!

之后我的界面如下所示:

$ ifconfig
enp0s5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.76  netmask 255.255.255.0  broadcast 192.168.2.255
        ether 00:1c:42:b9:d5:a3  txqueuelen 1000  (Ethernet)
        RX packets 120786  bytes 157627189 (157.6 MB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 17840  bytes 1450595 (1.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.64  netmask 255.255.255.0  broadcast 192.168.2.255
        ether 00:1c:42:59:54:ba  txqueuelen 1000  (Ethernet)
        RX packets 11342  bytes 3589378 (3.5 MB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 277  bytes 77293 (77.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 948  bytes 99424 (99.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 948  bytes 99424 (99.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

nordlynx: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1420
        inet 10.5.0.2  netmask 255.255.255.255  destination 10.5.0.2
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)
        RX packets 39  bytes 14380 (14.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 61  bytes 11396 (11.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

这里我做了一个简单的速度和连接测试,VPN连接工作正常。

好的,现在我想通过该nordlynx接口转发网络上其他设备发送到 enp0s6 接口的所有流量。所以我这样做:

iptables --flush
iptables --table nat --flush
iptables --table nat --append POSTROUTING --out-interface nordlynx -j MASQUERADE
iptables --append FORWARD --in-interface enp0s6 -j ACCEPT

我还检查以确保 IP 转发已启用:

$ cat /proc/sys/net/ipv4/ip_forward
1

最后,为了测试网关功能,我在 LAN 上的另一台笔记本电脑(Macbook Pro)上配置了静态 IP,并将默认网关设置为enp0s6我的虚拟机的 IP ( 192.168.2.64)。

然后我尝试从 Macbook 上浏览网页 - 但不起作用。

我错过了什么或做错了什么?我怎样才能最好地解决这个问题?

我尝试从 Macbook Pro 进行跟踪路由来查看我走了多远,但是在将 Ubuntu VM 设置为默认网关的情况下跟踪到本地 LAN 子网之外的任何 IP 只会得到以下结果:

$ traceroute 37.156.192.50
traceroute: findsaddr: write: No such process

Linux VM 上的路由表如下所示:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         nordvpn-gw      128.0.0.0       UG    0      0        0 nordlynx
default         _gateway        0.0.0.0         UG    100    0        0 enp0s5
default         _gateway        0.0.0.0         UG    101    0        0 enp0s6
128.0.0.0       nordvpn-gw      128.0.0.0       UG    0      0        0 nordlynx
unn-138-199-52- _gateway        255.255.255.255 UGH   0      0        0 enp0s5
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 enp0s6
192.168.2.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s5
192.168.2.0     0.0.0.0         255.255.255.0   U     101    0        0 enp0s6

感谢您的任何帮助或建议。谢谢!

更新:根据@AB 的评论,我还尝试简化设置以仅在虚拟机上使用一个网卡,但这没有什么区别。

相关内容