因此,我在 MAC 笔记本上安装 Vagrant 的“hashicorp/precise64”时遇到了问题。
首先,我的配置:
VAGRANTFILE_API_VERSION =“2” Vagrant.configure(VAGRANTFILE_API_VERSION)执行|配置| 配置.vm.box = “hashicorp/precise64” config.vm.network“public_network”,类型:“dhcp”,:bridge =>'en4:Thunderbolt 以太网' config.vm.主机名 = “mddirector” 结尾
这是“vagrant up”的输出
==> 默认:尝试正常关闭 VM…… ==> 默认:检查框“hashicorp/precise64”是否是最新的…… ==> 默认:清除任何先前设置的转发端口... ==> 默认:清除任何先前设置的网络接口... ==> 默认:根据配置准备网络接口... 默认:适配器 1:nat 默认:适配器 2:桥接 ==> 默认:转发端口... 默认值:22 => 2222(适配器 1) ==> 默认:启动 VM... ==> 默认:等待机器启动。这可能需要几分钟... 默认:SSH 地址:127.0.0.1:2222 默认:SSH 用户名:vagrant 默认:SSH 身份验证方法:私钥 默认:警告:连接超时。正在重试... ==> 默认:机器已启动并准备就绪! GuestAdditions 4.3.10 正在运行 --- 确定。 ==> 默认:检查 VM 中的客户添加情况... ==> 默认:设置主机名... ==> 默认:配置并启用网络接口... ==> 默认:挂载共享文件夹... 默认:/vagrant => /Users/garthm/Projects/vagrant ==> 默认:机器已配置。运行 `vagrant provision` 或使用 `--provision` ==> 默认:强制配置。标记为始终运行的配置程序仍将运行。
‘ifconfig’显示以下内容:
vagrant@mddirector:~$ ifconfig eth0 链路封装:以太网 HWaddr 08:00:27:88:0c:a6 inet 地址:10.0.2.15 Bcast:10.0.2.255 掩码:255.255.255.0 inet6 地址:fe80::a00:27ff:fe88:ca6/64 范围:链接 上行广播运行多播 MTU:1500 度量:1 RX 数据包:725 错误:0 丢弃:0 超限:0 帧:0 TX 数据包:544 错误:0 丢弃:0 超限:0 载波:0 碰撞:0 txqueuelen:1000 RX 字节:90824 (90.8 KB) TX 字节:63375 (63.3 KB) eth1 链路封装:以太网 HWaddr 08:00:27:2f:bb:6a inet 地址:10.0.24.118 Bcast:10.0.31.255 掩码:255.255.248.0 上行广播运行多播 MTU:1500 度量:1 RX 数据包:3490 错误:0 丢弃:0 超限:0 帧:0 TX 数据包:7 错误:0 丢弃:0 超限:0 载波:0 碰撞:0 txqueuelen:1000 RX 字节:345981 (345.9 KB) TX 字节:1102 (1.1 KB) lo 链路封装:本地环回 inet 地址:127.0.0.1 掩码:255.0.0.0 inet6 地址:::1/128 范围:主机 上行环回运行 MTU:16436 度量:1 RX 数据包:0 错误:0 丢弃:0 溢出:0 帧:0 TX 数据包:0 错误:0 丢弃:0 超限:0 载波:0 碰撞:0 txqueuelen:0 RX 字节:0 (0.0 B) TX 字节:0 (0.0 B)
我的问题是,我可以从我的主机 ping 通 VM(IP: 10.0.24.112
),其他人也可以 ping 通我的 VM(10.0.24.XXX
),我的 VM 可以 ping 通我的 devbox(IP: 10.10.116.254
),我可以从我的 devbox ping 通其他开发人员的虚拟机设置(不是 Vagrant,IP: 10.10.116.254
),但我无法从我的 devbox ping 通我的 VM,其他开发人员也无法从他们的 devbox ping 通我的 VM。
他们所设置的虚拟机仅带有桥接 NIC,但出于某种原因,vagrant 同时具有 NAT 和桥接,尽管我在配置中指定了桥接。如您所见,Vagrant VM 有两个 IP 地址,这似乎不对。您还可以看到,当它启动时,它会在适配器 1(即 NAT 适配器)上进行端口转发,这意味着听起来它默认使用 NAT 适配器进行所有操作。
我如何摆脱 NAT 适配器并仅使用桥接?
如果我编辑 VirtualBox 设置并禁用 NAT 适配器,那么就只有桥接适配器并通过 VirtualBox 启动该框(即:不使用 vagrant up),那么它只有 eth0 和一个可以从我的 devbox ping 通的 IP 地址,这正是我想要的。如果我在编辑 VirtualBox 设置并禁用 NAT 适配器后尝试 vagrant up 该框,我会收到以下错误:
执行 Vagrant 使用的 CLI `VBoxManage` 时出错 用于控制 VirtualBox。命令和 stderr 如下所示。 命令:["modifyvm", "7f1c12f7-74cd-4c6b-aa5a-16d6209cf2b3", "--natpf1", "ssh,tcp,127.0.0.1,2222,,22"] Stderr:VBoxManage:错误:此名称的 NAT 规则已存在 VBoxManage:错误:详细信息:代码 NS_ERROR_INVALID_ARG(0x80070057),组件 NATEngine,接口 INATEngine,被调用者 nsISupports VBoxManage:错误:上下文:“AddRedirect(Bstr(strName).raw(),proto,Bstr(strHostIp).raw(),RTStrToUInt16(strHostPort),Bstr(strGuestIp).raw(),RTStrToUInt16(strGuestPort))”位于文件 VBoxManageModifyVM.cpp 第 1655 行
如果我立即再次执行 vagrant up,它会重新启用 NAT 适配器,我们又会遇到同样的问题。
答案1
eth0
因为 NAT 是Vagrant 当前状态的基本要求。但您可以覆盖 的默认路由器配置eth1
。
来自Vagrant 文档:
默认路由器
根据您的设置,您可能希望手动覆盖默认路由器配置。如果您需要通过公共网络从其他网络访问 Vagrant box。为此,您可以使用 shell provisioner 脚本:
config.vm.network“公共网络”,ip:“192.168.0.17” # 默认路由器 config.vm.provision “shell”, 运行:“总是”, 内联:“路由添加默认网关 192.168.0.1” # 默认路由器 ipv6 config.vm.provision “shell”, 运行:“总是”, 内联:“路由 -A inet6 添加默认 gw fc00::1 eth1” # 删除 eth0 上的默认网关 config.vm.provision “shell”, 运行:“总是”, 内联:“eval `route -n | awk'{if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`”请注意,上述内容相当复杂,并且可能特定于客户操作系统,但我们记录了如何执行的粗略想法,因为这是一个常见的问题。
答案2
(抱歉,我对 vagrant/virtualbox 不太了解,所以请原谅我缺乏正确的网络术语)
您的选择桥接器:en4) Thunderbolt很可能是问题所在。
以下是我认为您想要/需要的,而不是您要求的:
SSH 登录功能让 vagrant 能够从您的开发箱(主机)控制您的虚拟机。这就是带端口转发的 NAT 所做的。它不会弄乱任何其他东西,因此要求它消失并不是很有用。这显示在 VirtualBox 中的适配器 1 上。
来自 LAN 的连接,而不仅仅是主机的连接。假设是 192.168.1.xxx 范围内的某个地址。这才是适配器 2 上最重要的。
您只关心您的普通网卡/NIC,并没有特别的理由通过 Thunderbolt 端口运行以太网。
也就是说,您从具有 Bridged 且看不到 Vagrant 的 VirtualBox vm 中获得的内容几乎相同。
这是我在局域网上拥有的 VirtualBox 机器之一的 SSH ifconfig。它运行一个我可以连接的 Web 服务器,我的 Mac 可以通过 SSH 进入它并连接到其上的数据库。我将其称为参考。
[root@fdm ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:9A:85:1A
inet addr:192.168.1.143 Bcast:192.168.1.255 Mask:255.255.255.0
在 VirtualBox 中,该参考虚拟机的网络面板显示适配器 1 为桥接。所有其他适配器均已禁用。
好的,所以我现在要尝试从 Vagrant 获得相同的 LAN 连接结果,但我接受在适配器 1 处有一个 NAT,这是 vagrant-VB ssh 通信机制。
尝试 #1——失败。
起点是流浪者初始化。
然后在 Vagrantfile 中,我只改变了两件事:
config.vm.box = "opscode-ubuntu-14.04"
config.vm.network "public_network"
如果我流浪起来这样,我就会收到一个对话框,询问使用哪个界面:
==> default: Available bridged network interfaces:
1) en1: Wi-Fi (AirPort)
2) en0: Ethernet
3) en3: Thunderbolt 1
4) p2p0
5) bbptp0
6) bridge0
现在回想起来,我首先选择的是2)因为我认为我想要以太网,1)似乎“太苹果了”。
这可行,但 IP 10.0.xx.xx 条目不合适,我的 ISP 阻止了对该条目的 ping,见下文。我猜他们说的公共网络其实是指公共网络。
流浪者ssh
vagrant@vagrant:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:0c:41:3e
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe0c:413e/64 Scope:Link
eth1 Link encap:Ethernet HWaddr 08:00:27:ca:f4:64
inet6 addr: fe80::a00:27ff:feca:f464/64 Scope:Link
尝试 #2 - 正确版本
流浪停止,然后删除该目录,重新创建并流浪者初始化。(我发现过多地干扰网络可能会使 vagrant 和/或 virtualbox 混乱,完全删除并重新启动即可解决)
config.vm.box = "opscode-ubuntu-14.04"
config.vm.network "public_network"
但是,这次,选择 1) en1:Wi-Fi(AirPort)。
流浪者ssh
带有 192.168.1.123 的 eth1 看起来漂亮多了,不是吗?
vagrant@vagrant:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:0c:41:3e
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
eth1 Link encap:Ethernet HWaddr 08:00:27:53:6e:1d
inet addr:192.168.1.123 Bcast:192.168.1.255 Mask:255.255.255.0
事实上,我可以从我的参考虚拟机或 LAN 上的另一台物理机器 ping 192.168.1.123。
[root@fdm ~]# ping 192.168.1.123
PING 192.168.1.123 (192.168.1.123) 56(84) bytes of data.
64 bytes from 192.168.1.123: icmp_seq=1 ttl=64 time=1039 ms
64 bytes from 192.168.1.123: icmp_seq=2 ttl=64 time=40.4 ms
值得一提的是,VirtualBox 在适配器 1 上显示 NAT,在适配器 2 上显示桥接。
最终设置 -
添加了自动选择接口以及静态 IP(您不需要)。至少对我来说,问题解决了。
config.vm.network "public_network", bridge: 'en1: Wi-Fi (AirPort)', ip: "192.168.1.201"
编辑201902:在我的最新版本中,vagrant/virtualbox 抱怨无线网络(机场)未找到:
==> default: Specific bridge 'en1: Wi-Fi (AirPort)' not found. You may be asked to specify
==> default: which network to bridge to.
==> default: Available bridged network interfaces:
1) en0: Ethernet
2) en2: Thunderbolt 1
3) bridge0
改为
config.vm.network "public_network", bridge: "bridge0"
如果出现问题将稍后更新,但我想更新有关适配器名称的部分。
答案3
简短的回答似乎是不要。
您可以覆盖适配器 1,但至少会出现以下问题:vagrant ssh
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "hashicorp/precise64"
config.vm.network "public_network", :adapter=>1 , type: "dhcp", :bridge => 'en4: Thunderbolt Ethernet'
config.vm.hostname = "mddirector"
# In case you get the host wrong...
config.vm.boot_timeout = 30
config.vm.provider "virtualbox" do |vb, override|
vb.gui = true
end
config.ssh.host = '192.168.148.24'
end
生成:
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: bridged
==> default: Forwarding ports...
default: 22 => 2222 (adapter 1)
default: VirtualBox adapter #1 not configured as "NAT". Skipping port
default: forwards on this adapter.
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
不幸的是,它似乎锁定了配置网络适配器,但也许你会比我更幸运。
如果您这样做,您可以随时强制停止并使用更正的重新加载ssh.host
。或者,我听说过vagrant dns
但从未尝试过。
答案4
1-您不能仅仅eth0
用桥接接口替换它或者删除它,因为 Vagrant 本身需要能够在这里配置机器和 ssh。
2 - 因此,您已添加eth1
并根据需要对其进行配置,然后使默认路由仅使用此接口。(删除默认 gweth0
并仅保留开启eth1
)
en0: Wi-Fi
这是我的 Mac 上的 Wi-Fi 适配器的名称,请确保在此处使用正确的网络接口名称。
:adapter=>2
使该适配器eth1
位于 VM 内部
config.vm.network "public_network", bridge: 'en0: Wi-Fi', :adapter=>2 , type: "dhcp"
...
config.vm.provision "shell", inline: <<-SHELL
ip route del default dev eth0
SHELL
现在虚拟机应该有 2 个网络接口:eth0
- 用于 vagrant 访问的 NAT,eth1
- Wi-Fi 适配器上的桥接。
我已从(Vagrant 的 NAT 接口)中删除了 shell 命令中的默认路由eth0
。现在 VM 应该eth1
只使用来自(Wi-Fi 接口上的 breage)的默认路由。完成
让我们检查一下。VM 上的路由应如下所示:
$ ip r
default via 192.168.0.1 dev eth1 proto dhcp src 192.168.0.119 metric 1024
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 1024
10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 1024
10.0.2.3 dev eth0 proto dhcp scope link src 10.0.2.15 metric 1024
192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.119 metric 1024
192.168.0.1 dev eth1 proto dhcp scope link src 192.168.0.119 metric 1024