Vagrant
Public Networks
Network identifier: public_network
Vagrant public networks 的私密性不如 private networks,并且确切含义实际上因 提供程序而异,因此定义模糊。 想法是,虽然 private networks 不应允许公众访问你的机器,但 public networks 可以。
困惑了吗? 我们也是。 Public networks 可能会在未来的版本中被 :bridged 取代,因为从通常意义上来说,这就是 public networks 应该做的事情,并且不提供桥接的提供程序通常也没有任何与 public networks 对应的功能。
警告! Vagrant boxes 默认情况下是不安全的,并且设计上存在公共密码、SSH 访问的不安全密钥对,并且可能允许通过 SSH 进行 root 访问。 凭借这些已知凭据,您的 box 很容易被网络上的任何人访问。 在配置 Vagrant 使用 public network 之前,请考虑所有潜在的安全隐患,并查看 默认 box 配置 以识别潜在的安全风险。
DHCP
使用 public network 的最简单方法是允许通过 DHCP 分配 IP。在这种情况下,定义 public network 很容易
Vagrant.configure("2") do |config|
config.vm.network "public_network"
end
当使用 DHCP 时,可以通过使用 vagrant ssh 登录到机器,并使用适当的命令行工具查找 IP,例如 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
静态 IP
根据您的设置,您可能希望手动设置桥接接口的 IP。为此,请在网络定义中添加 :ip 子句。
config.vm.network "public_network", ip: "192.168.0.17"
默认网络接口
如果主机上有多个网络接口可用,Vagrant 会要求您选择虚拟机应该桥接到的接口。可以通过在网络定义中添加 :bridge 子句来指定默认接口。
config.vm.network "public_network", bridge: "en1: Wi-Fi (AirPort)"
用于标识所需接口的字符串必须与可用接口的名称完全匹配。如果找不到该接口,Vagrant 会要求您从可用网络接口列表中进行选择。
在某些提供程序中,可以指定要桥接的适配器列表
config.vm.network "public_network", bridge: [
"en1: Wi-Fi (AirPort)",
"en6: Broadcom NetXtreme Gigabit Ethernet Controller",
]
在此示例中,将使用存在的第一个网络适配器,并且可以成功桥接。
禁用自动配置
如果您想自己手动配置网络接口,可以通过指定 auto_config 来禁用自动配置
Vagrant.configure("2") do |config|
config.vm.network "public_network", auto_config: false
end
然后可以使用 shell provisioner 来配置接口的 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
默认路由器
根据您的设置,您可能希望手动覆盖默认路由器配置。如果您需要通过公共网络从其他网络访问 Vagrant 盒子,则这是必需的。为此,您可以使用 shell provisioner 脚本
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
或者,另一种更简单的方法,假设您从公共网络获取 DHCP
Vagrant.configure("2") do |config|
config.vm.network "public_network"
# default router
config.vm.provision "shell",
run: "always",
inline: "ip route del default via 10.0.2.2 || true"
end
请注意,上述内容非常复杂,并且将取决于来宾操作系统,但我们记录了操作的大致思路,因为这是一个常见问题。