我正在部署一个需要向主机网络提供容器服务的vagrant
盒子( )。libvirt
podman
不知何故,这些容器的暴露端口可以从主机网络访问(即,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
太依赖它了。