只需要在流浪者中做桥接适配器,无需NAT


36

因此,我的MAC书籍上的Vagrant设置为“ hashicorp / precise64”时遇到问题。

首先,我的配置:

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”
结束

这就是“流浪汉”的主张

==>默认值:尝试正常关闭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链接encap:以太网HWaddr 08:00:27:88:0c:a6
          inet地址:10.0.2.15广播:10.0.2.255掩码:255.255.255.0
          inet6地址:fe80 :: a00:27ff:fe88:ca6 / 64范围:链接
          UP广播多播MTU:1500公制:1
          RX数据包:725错误:0掉落:0超限:0帧:0
          TX封包:544错误:0掉线:0超限:0载波:0
          碰撞:0 txqueuelen:1000
          接收字节:90824(90.8 KB)发送字节:63375(63.3 KB)

eth1链接encap:以太网HWaddr 08:00:27:2f:bb:6a
          inet地址:10.0.24.118广播:10.0.31.255掩码:255.255.248.0
          UP广播多播MTU:1500公制:1
          RX数据包:3490错误:0掉落:0超限:0帧:0
          TX数据包:7个错误:0掉落:0超限:0运营商:0
          碰撞:0 txqueuelen:1000
          接收字节:345981(345.9 KB)发送字节:1102(1.1 KB)

lo链接封套:本地环回
          inet地址:127.0.0.1掩码:255.0.0.0
          inet6 addr::: 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虚拟机(IP: 10.0.24.112),其他人也可以ping我的虚拟机(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,但是由于某种原因,流浪者同时具有NAT和网桥,即使我在配置中指定了网桥。如您所见,Vagrant VM有两个IP地址,这似乎不正确。您还可以在启动时在适配器1(即NAT适配器)上进行端口转发,这意味着听起来好像默认情况下所有组件都使用NAT适配器。

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

如果我编辑VirtualBox设置并禁用NAT适配器,那么只有桥接的适配器并通过VirtualBox启动该框(即:不使用流浪汉),那么它只有eth0,其IP地址可从我的devbox ping通,这就是我想要的。如果我在编辑VirtualBox设置并禁用NAT适配器后尝试更改该框,则会出现以下错误:

执行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行

如果我立即再次做一个流浪汉,它又重新启用了NAT适配器,我们又回到了同样的问题。

Answers:


21

eth0因为NAT是Vagrant当前状态基本要求。但是您可以覆盖的默认路由器配置eth1

流浪文档

默认路由器

根据您的设置,您可能希望手动覆盖默认路由器配置。如果您需要通过公共网络从其他网络访问“ Vagrant”框,则需要这样做。为此,您可以使用Shell Provisioner脚本:

config.vm.network“ public_network”,ip:“ 192.168.0.17”

#默认路由器
config.vm.provision“外壳”,
  运行:“始终”,
  内联:“路由添加默认gw 192.168.0.1”

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

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

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


9

(对不起,对流浪汉/虚拟盒子很幼稚,请原谅缺乏适当的网络术语)

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

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

  • SSH登录功能可让流浪者从您的开发箱(主机)控制您的虚拟机。这就是带有端口转发的NAT所做的。它不会弄乱其他任何东西,所以要求它消失就不是那么有用了。这将显示在VirtualBox中的适配器1上。

  • 通过局域网(而不只是主机)进行连接。假设是192.168.1.xxx范围内的内容。在适配器2上,这很重要。

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

即几乎可以从带有Bridged的VirtualBox虚拟机中获得什么,而看不到流浪汉。

这是我在局域网上只有一台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中,对于该参考vm,“网络”面板将Adapter1显示为“桥接”。所有其他适配器均被禁用。

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

尝试#1-失败。

起点是无所事事的初始化

然后在Vagrantfile中,我仅更改了2件事:

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暂停,然后删除目录,再次创建它,然后vagrant init。(我发现与网络混乱太多,可能会使无所事事的虚拟机和/或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

而且的确,我可以从参考vm或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

FWIW,VirtualBox显示适配器1上的NAT和适配器2上的桥接。

最终设置-

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

  config.vm.network "public_network", bridge: 'en1: Wi-Fi (AirPort)', ip: "192.168.1.201"

EDIT 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

改成

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

如果有什么事情会稍后更新,但是以为我会更新一下适配器名称。


他的答案值得加分,添加一个简单的适配器如此简单,我什至没有菜单(只有1张活动卡)。
Glenn Plas 2015年

4

简短的答案似乎不是。

您可以覆盖适配器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但从未尝试过。


3

我发现 在StackOverflow上这个讨论

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

config.vm.network "public_network"

然后运行 vagrant reload


2
如果查看我的Vagrantfile配置,您将看到配置设置已经存在。
SynackSA 2014年

哦对不起!我错过了。
泰勒

3
我相信它总会具有NAT连接,因为当您执行vagrant ssh或任何配置时,它始终会通过127.0.0.1:2222或将其转发到来宾盒上的22个端口访问它。
海顿2014年

这是对我的回答。它只是增加了一个NIC
格伦普拉斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.