只需要在 Vagrant 中做 Bridged Adapter,不需要 NAT

Syn*_*kSA 40 vagrant

所以我在我的 MAC 书上遇到了“hashicorp/precise64”的 Vagrant 设置问题。

首先,我的配置:

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) 做 |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.network "public_network", 输入: "dhcp", :bridge => 'en4: Thunderbolt Ethernet'
  config.vm.hostname = "mddirector"
结尾

这是 'vagrant up' 的输出

==> 默认值:尝试正常关闭 VM...
==> 默认值:检查框 'hashicorp/precise64' 是否是最新的...
==> 默认值:清除任何先前设置的转发端口...
==> 默认值:清除任何先前设置的网络接口...
==> 默认:根据配置准备网络接口...
    默认值:适配器 1:nat
    默认值:适配器 2:桥接
==> 默认值:转发端口...
    默认值:22 => 2222(适配器 1)
==> 默认:启动虚拟机...
==> 默认值:等待机器启动。这可能需要几分钟的时间...
    默认: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 广播: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)

我的问题是,我可以从我的主机 ( IP: 10.0.24.112) ping VM ,其他人也可以 ping 我的 VM ( 10.0.24.XXX),我的 VM 可以 ping 我的 devbox ( IP: 10.10.116.254),我可以从我的 devbox ping 其他开发人员的虚拟机设置 (不是 Vagrant,IP: 10.10.116.254),但我无法从我的开发箱 ping 我的 VM,其他开发人员也无法从他们的开发箱 ping 我的 VM。

他们拥有的虚拟机设置仅使用桥接 NIC,但由于某种原因,流浪者同时具有 NAT 和桥接,尽管我已经在配置中指定了桥接。如您所见,Vagrant VM 有两个 IP 地址,这似乎不正确。您还可以,当它启动时,它在适配器 1(即 NAT 适配器)上执行端口转发,这意味着它听起来像是默认情况下对所有内容都使用 NAT 适配器。

如何摆脱 NAT 适配器并仅使用桥接?

如果我编辑 VirtualBox 设置并禁用 NAT 适配器,那么只有桥接适配器并通过 VirtualBox 启动盒子(即:不使用 vagrant up),那么它只有 eth0 的 IP 地址可以从我的 devbox ping 通,这就是我要找的。如果我在编辑 VirtualBox 设置并禁用 NAT 适配器后尝试对盒子进行流浪,我会收到以下错误:

执行 VBoxManage(Vagrant 使用的 CLI)时出错
用于控制 VirtualBox。命令和标准错误如下所示。

命令:["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))" at文件 VBoxManageModifyVM.cpp 的第 1655 行

如果我立即再次执行 vagrant up,它会再次重新启用 NAT 适配器,我们又会再次遇到同样的问题。

ost*_*ach 27

eth0因为 NAT 是Vagrant 在当前状态下基本要求。但是您可以覆盖eth1.

来自Vagrant 文档

默认路由器

根据您的设置,您可能希望手动覆盖默认路由器配置。如果您需要通过公共网络从其他网络访问 Vagrant box,则这是必需的。为此,您可以使用 shell 配置程序脚本:

config.vm.network "public_network", ip: "192.168.0.17"

# 默认路由器
config.vm.provision “外壳”,
  运行:“总是”,
  内联:“路由添加默认 gw 1​​92.168.0.1”

# 默认路由器 ipv6
config.vm.provision “外壳”,
  运行:“总是”,
  内联:“路由 -A inet6 添加默认 gw fc00::1 eth1”

# 删除 eth0 上的默认网关
config.vm.provision “外壳”,
  运行:“总是”,
  内联:“eval `route -n | awk '{ if ($8 ==\"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`”

请注意,上述内容相当复杂,可能特定于来宾操作系统,但我们记录了如何执行此操作的粗略想法,因为这是一个常见问题。


JL *_*ret 11

(抱歉,对 vagrant/virtualbox 太天真了,所以请原谅缺乏正确的网络术语)

您选择的桥接器:en4) Thunderbolt很可能是问题所在。

这是我假设您想要/需要的,而不是您要求的:

  • vagrant 的 SSH 登录功能可以从您的开发箱(主机)控制您的虚拟机。这就是带有端口转发的 NAT 的作用。它不会把其他任何事情搞砸,所以要求它消失并不是那么有用。这显示在 VirtualBox 中的适配器 1 上。

  • 来自您的 LAN 的连接,而不仅仅是您的主机。让我们说一下 192.168.1.xxx 范围内的内容。在适配器 2 上,这很重要。

  • 你只关心你的普通网卡/网卡,没有特别的理由通过你的 Thunderbolt 端口运行以太网。

即几乎可以从带有桥接的 VirtualBox 虚拟机中获得,并且不会看到 Vagrant。

这是来自我局域网上只有 VirtualBox 的机器之一的 SSH ifconfig。它运行一个我可以连接的网络服务器,我的 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
Run Code Online (Sandbox Code Playgroud)

在 VirtualBox 中,该参考虚拟机的网络面板将 Adapter1 显示为桥接。所有其他适配器都被禁用。

好的,所以我现在要尝试从 Vagrant 获得相同的 LAN 连接结果,但我接受我将在适配器 1 上有一个 NAT,这就是 vagrant-VB ssh 通信机制。

尝试 #1 - 失败。

起点是一个vagrant init

然后在 Vagrantfile 中,我只更改了两件事:

config.vm.box = "opscode-ubuntu-14.04"
config.vm.network "public_network"
Run Code Online (Sandbox Code Playgroud)

如果我无所事事,我会收到一个对话框,询问要使用哪个界面:

==> default: Available bridged network interfaces:
1) en1: Wi-Fi (AirPort)
2) en0: Ethernet
3) en3: Thunderbolt 1
4) p2p0
5) bbptp0
6) bridge0
Run Code Online (Sandbox Code Playgroud)

现在,看着它,我首先选择了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
Run Code Online (Sandbox Code Playgroud)

尝试 #2 - 正确的版本

vagranthalt,然后删除目录,再次创建它并vagrant init。(我发现对网络进行过多处理可能会混淆 vagrant 和/或 virtualbox,完全删除和重新启动可以解决这些问题)

config.vm.box = "opscode-ubuntu-14.04"
config.vm.network "public_network"
Run Code Online (Sandbox Code Playgroud)

但是,这一次,选择 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
Run Code Online (Sandbox Code Playgroud)

而且,确实,我可以从我的参考虚拟机或 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
Run Code Online (Sandbox Code Playgroud)

FWIW,VirtualBox 在适配器 1 上显示了 NAT,在适配器 2 上显示了桥接。

最终设置 -

添加了接口的自动选择以及静态 IP(您不需要)。问题解决了,至少对我来说。

  config.vm.network "public_network", bridge: 'en1: Wi-Fi (AirPort)', ip: "192.168.1.201"
Run Code Online (Sandbox Code Playgroud)

编辑 201902:在我的最新版本中,vagrant/virtualbox 抱怨找不到Wifi(机场)

==> 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
Run Code Online (Sandbox Code Playgroud)

把它改成

config.vm.network "public_network", bridge: "bridge0"

如果出现问题,稍后会更新,但我想我会更新有关适配器名称的信息。


KCD*_*KCD 5

简短的回答似乎是不。

您可以覆盖适配器 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
Run Code Online (Sandbox Code Playgroud)

产生:

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...
Run Code Online (Sandbox Code Playgroud)

不幸的是,它似乎会锁定配置网络适配器,但也许你会比我更幸运。

如果你这样做,你总是可以强制停止并重新加载更正的ssh.host. 或者我听说过vagrant dns但从未尝试过。


小智 3

我在 StackOverflow 上找到了这个讨论

对我来说,打开相关内容Vagrantfile并取消注释以下行就足够了:

config.vm.network "public_network"
Run Code Online (Sandbox Code Playgroud)

然后运行vagrant reload

  • 我相信它总是会有一个 NAT 连接,因为当你执行 vagrant ssh 或任何配置时,它总是会通过 127.0.0.1:2222 或它转发到访客盒子上的 22 的任何端口来访问它。 (3认同)
  • 如果您查看我的 Vagrantfile 配置,您会发现配置设置已经存在。 (2认同)