Vagrantfile 配置文件中公共网络的标识符:public_network,例如:
config.vm.network "public_network"
Vagrant 公共网络的确切含义因 provider 而异,因此是含糊不清的定义。尽管私有网络决不允许公众访问你的机器,但公共网络可以。
困惑吗?我们也是。公共网络很可能会在将来的版本中被替换为桥接网络,因为这通常是公共网络应该做的事情,而不支持桥接的 provider 通常没有任何其他映射到公共网络的功能。
警告:默认情况下 Vagrant box 是不安全的,设计、公开密码、用于 SSH 访问的不安全密钥对、可能允许通过 SSH 进行根访问等都会导致问题。凭借这些已知的凭据,网络中的任何人都可以轻松访问你的 box。在配置 Vagrant 使用公共网络之前,请考虑所有潜在的安全隐患并检查默认的配置以识别潜在的安全风险。
1. DHCP
最简单的使用公共网络的方式是通过 DHCP 分配 IP:
Vagrant.configure("2") do |config|
config.vm.network "public_network"
end
使用 DHCP 时,可以通过 vagrant ssh
登录到机器后,使用合适的命令行工具(ifconfig 等)可以查看分配到的 IP 地址。
使用 DHCP 分配的默认路由
某些情况下需要 DHCP 分配的默认路由不变。在这些情况下,可以指定 use_dhcp_assigned_default_route
选项。举个例子:
Vagrant.configure("2") do |config|
config.vm.network "public_network",
use_dhcp_assigned_default_route: true
end
2. 静态 IP
根据你的设置,你可能希望手动设置桥接接口的 IP。在网络定义中添加 ip: "xx.xx.xx.xx"
子句:
config.vm.network "public_network", ip: "192.168.0.17"
3. 默认网络接口
如果宿主机上有多个网络接口可用,Vagrant 会提示你选择虚拟机要桥接到的接口。可以在网络定义部分使用 bridge
选项指定默认接口。
config.vm.network "public_network", bridge: "en1: Wi-Fi (AirPort)"
标识所需接口的字符串必须与可用接口的名称完全匹配。如果无法找到,Vagrant 会再次提示你从可用网络接口列表中选择。
对于某些 provider,可以指定一个适配器列表来桥接,Vagrant 会按顺序尝试,直到找到存在且桥接成功的网络适配器:
config.vm.network "public_network", bridge: [
"en1: Wi-Fi (AirPort)",
"en6: Broadcom NetXtreme Gigabit Ethernet Controller",
]
这个例子中,会使用第一个存在且可以成功用于桥接的网络适配器。
4. 关闭自动配置
如果需要手动配置网络接口,可以通过 auto_config
选项关闭 Vagrant 的自动配置特性:
Vagrant.configure("2") do |config|
config.vm.network "public_network", auto_config: false
end
然后 shell 配置程序可以用来配置接口的 ip 地址:
Vagrant.configure("2") do |config|
config.vm.network "public_network", auto_config: false
# manual ip
config.vm.provision "shell",
run: "always",
inline: "ifconfig eth1 192.168.0.17 netmask 255.255.255.0 up"
# manual ipv6
config.vm.provision "shell",
run: "always",
inline: "ifconfig eth1 inet6 add fc00::17/7"
end
5. 默认路由器
根据设置,你可能希望手动覆盖默认的路由器配置。如果需要通过公共网络从其他网络访问 Vagrant box,则这是必需的。为此,可以使用 shell 配置程序脚本:
Vagrant.configure("2") do |config|
config.vm.network "public_network", ip: "192.168.0.17"
# default router
config.vm.provision "shell",
run: "always",
inline: "route add default gw 192.168.0.1"
# default router ipv6
config.vm.provision "shell",
run: "always",
inline: "route -A inet6 add default gw fc00::1 eth1"
# delete default gw on eth0
config.vm.provision "shell",
run: "always",
inline: "eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`"
end
注意,上述内容相当复杂,并且可能特定于操作系统,但我们记录了如何操作的粗略想法,因为这是一个常见问题。