强制 vagrant VM 在标准路由中优先考虑 eth1 接口

强制 vagrant VM 在标准路由中优先考虑 eth1 接口

我正在部署一个需要向主机网络提供容器服务的vagrant盒子( )。libvirtpodman

不知何故,这些容器的暴露端口可以从主机网络访问(即,192.168.1.0/24但是,如果我在防火墙中将 NAT/端口转发配置到vagrant虚拟机(192.168.1.145)到此类端口,则无法从外部访问,除非我删除上的默认路由eth0

所以,像这样不能通过端口转发访问:

[root@fedora-rctestenv-vvm ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    100    0        0 eth0
default         _gateway        0.0.0.0         UG    101    0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     101    0        0 eth1
192.168.121.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0

但像这样我可以:

[root@fedora-rctestenv-vvm ~]# eval $(route -n | awk '$0~/[.0]{4}/ && $3~/[.0]{4}/ && $8~/eth0/ { printf "ip route del default via %s dev %s; ",$3,$8 }')
[root@fedora-rctestenv-vvm ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    101    0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     101    0        0 eth1
192.168.121.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0

此外,系统通常会自动添加默认路由eth0(我不知道哪个进程执行此操作)。

所以我的问题是:如何指定,最好直接在Vagrantfile仅有的想要使用主机网络的接口/子网,而不是虚拟机专用网络吗?

答案1

添加此其余配置都成功了:

     # default router
    config.vm.provision "shell",
        run: "always",
        inline: "route add default gw 192.168.1.1"

    # delete default gw on eth0
    config.vm.provision "shell",
        run: "always",
        inline: "eval $(route -n | awk '$0~/[.0]{4}/ && $3~/[.0]{4}/ && $8~/eth0/ { printf \"ip route del default via %s dev %s; \",$3,$8 }')"

这种情况的变体实际上在文档中提到了,但不久前我第一次尝试就失败了,可能是因为我使用了错误的顺序并将这些操作放在了我的ansible配置脚本中。

总结:上面的设置大概需要在provisioning开始时就做好,shell配合provisioner使用也没有问题ansible,只是按照出现的顺序执行而已。

即使删除的路由在一段时间后再次出现,新的具有较低度量的默认路由仍然会保留,这对于所需的功能来说已经足够了:

[vagrant@fedora-rctestenv-vvm ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    0      0        0 eth1
default         _gateway        0.0.0.0         UG    100    0        0 eth0
default         _gateway        0.0.0.0         UG    101    0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     101    0        0 eth1
192.168.121.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0

eth0也就是说,只要我们需要的路线存在并且具有较低的度量,就可以忽略“不需要的”路线。

看起来是不可能完全摆脱默认 NAT 网络,因为vagrant太依赖它了。

相关内容