几周以来,我一直在苦苦思索如何在 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 -
enp0s5
和enp0s6
。 - 两个虚拟机网卡都桥接到主机上的默认有线适配器,并且都从 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 的评论,我还尝试简化设置以仅在虚拟机上使用一个网卡,但这没有什么区别。