Custom NAT Gateway and DNS for VMware Fusion

由于电脑使用了 Surge 并开启了 Enhanced Mode 来做全局透明代理,现在希望 VMware Fusion 的虚拟机也自动使用这个代理。其实打开 Enhanced Mode 之后无需配置虚拟机即可直接享受透明代理的。但是这样在 Surge Dashboard 中看到的所有连接都是来源于 vmnet-natd 这个进程,十分不方便监控。

为此,可以手动在虚拟机中修改网关和 DNS 服务器来使 Surge 能够分辨出流量来自哪台虚拟机。但这在我的场景下还是有点麻烦,因为需要不停的重装虚拟机等操作,每一次都需要重新配置。本文将介绍如何修改 VMware Fusion 的 vmnet-dhcpd 配置文件来使虚拟机自动获取自定义的网关和 DNS 服务器。

Modify dhcpd.conf

此处假定需要修改的是默认 NAT 虚拟网络的配置,即 vmnet8 其它自定义网络同理(桥接除外)。配置文件位于 /Library/Preferences/VMware Fusion/vmnet8/dhcpd.conf ,里面的内容主体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
###### VMNET DHCP Configuration. Start of "DO NOT MODIFY SECTION" #####
# ...

# Written at: 02/22/2020 01:40:51
allow unknown-clients;
default-lease-time 1800; # default is 30 minutes
max-lease-time 7200; # default is 2 hours

subnet 172.16.69.0 netmask 255.255.255.0 {
...
option domain-name-servers 172.16.69.2;
...
option routers 172.16.69.2;
}
...
####### VMNET DHCP Configuration. End of "DO NOT MODIFY SECTION" #######

注意其中被 DO NOT MODIFY SECTION 包起来的部分,这一部分信息是根据 /Library/Preferences/VMware Fusion/networking 自动生成的,如子网网段等配置,而我需要修改的是其中 domain-name-servers 和 routers 两个 networking 文件中无法配置的选项。因此,我们需要在这个 section 之后复制一段 subnet 的配置,将其中的两个选项改成自定义的值即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
###### VMNET DHCP Configuration. Start of "DO NOT MODIFY SECTION" #####
# ...

# Written at: 02/22/2020 01:40:51
allow unknown-clients;
default-lease-time 1800; # default is 30 minutes
max-lease-time 7200; # default is 2 hours

subnet 172.16.69.0 netmask 255.255.255.0 {
...
option domain-name-servers 172.16.69.2;
...
option routers 172.16.69.2;
}
...
####### VMNET DHCP Configuration. End of "DO NOT MODIFY SECTION" #######
subnet 172.16.69.0 netmask 255.255.255.0 {
...
option domain-name-servers 198.18.0.2;
...
option routers 172.16.69.1;
}

这样一来,在 VMware Fusion 重启之后改配置也将得到保留,且会覆盖其自动生成的 subnet 配置。注意若之后通过任何方式修改了 vmnet8 的 DHCP 子网网段,此处也需要手动修改。

Reconfigure Virtual Network

接下来需要重启 vmnet-dhcpd 使配置生效,这需要借助 VMware Fusion 自带的 vmnet-cli 工具。如果 Fusion 是通过 brew cask 安装的 ,那么它已经被软链接到 PATH 之中了;否则可以在 /Applications/VMware Fusion.app/Contents/Library/vmnet-cli 找到它。

依次执行如下命令即可:

1
2
3
4
# alias vmnet-cli='/Applications/VMware Fusion.app/Contents/Library/vmnet-cli'
sudo vmnet-cli --stop
sudo vmnet-cli --configure
sudo vmnet-cli --start

至此,在虚拟机中禁用再开启相应网卡即可自动获取新的配置了。