正如前面的答案中提到的那样,此问题的解决方案是在主机上添加macvlan网络适配器。但是,我觉得手动重新路由到macvlan适配器的路由有点麻烦,特别是因为我想要IPv6支持并在前缀更改时手动设置路由可能会成为问题。因此,这是我的配置,使内核可以控制路由表:
(此处的特定配置特定于Debian和Upstart,但基本步骤应在任何GNU / Linux上都可以使用。)
在启动时创建macvlan适配器
首先,您需要为适配器选择一个MAC地址。您也许可以只使用一个随机适配器,但我建议您手动创建一个macvlan适配器并使用其MAC。这样,MAC必须遵守可能存在的任何约定。
建议设置固定的MAC,因为否则,DHCP服务器无法重新启动后识别您的计算机并为其分配与以前相同的IP地址。
因此,创建一个适配器并查找MAC:
root@host:~# ip link add link eth0 macvlan0 type macvlan mode bridge
root@host:~# ip addr show dev macvlan0
#: macvlan0@eth0: mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
link/ether 12:34:56:78:90:ab brd ff:ff:ff:ff:ff:ff
...
高亮显示的十六进制数字是您的MAC地址。
现在,您将创建一个初始化脚本(必须在初始化网络之前运行该脚本),以在每次启动时创建macvlan适配器。为此的命令是:
ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge
为此目的,示例Upstart初始化脚本为:
start on starting networking
script
ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge
end script
只是把它放在例如/etc/init/macvlan.conf
。
设置网络配置
在中/etc/network/interfaces
,将物理网络适配器设置为手动(但将其保留为自动),然后将其先前的配置(通常为DHCP或静态IP地址)移动到您的macvlan适配器。例如:
auto eth0
iface eth0 inet manual
auto macvlan0
iface macvlan0 inet dhcp
禁用物理适配器的IPv6
最后,您不希望物理适配器获取IP地址。对于IPv4,将适配器设置为手动会阻止其获取地址。但是,我还没有找到阻止内核从适配器获取/分配IPv6地址的配置。如果这样做,它还会为其添加路由,这可能会导致问题。因此,最好的方法似乎是为物理适配器禁用IPv6。您可以通过添加以下行来实现
net.ipv6.conf.eth0.disable_ipv6=1
到/etc/sysctl.conf
,方法是在/etc/sysctl.d/
此行中创建一个文件,或通过添加
sysctl -w net.ipv6.conf.eth0.disable_ipv6=1
到您的初始化脚本。
当您现在重新启动计算机时,从主机到来宾的通信应同时适用于IPv4和IPv6。
请注意,如果在设置时出错,即使重新启动后,主机也可能无法通过网络访问。仅当您对机器具有物理访问权限或已采取其他保护措施以解决潜在问题时,才这样做。