为 vagrant box 提供公共静态 IP

为 vagrant box 提供公共静态 IP

我有一台服务器(Debian Squeeze),它有 1 个以太网卡和 2 个公共静态 IP(188.120.245.4 和 188.120.244.5)。

我想要的:设置虚拟盒(Ubuntu),并通过静态 IP(188.120.244.5)进行访问。

我正在尝试:

  • config.vm.forward_port - 好主意:在主机上将接口“eth1:1”设置为 188.120.244.5,然后将其添加到 Vagrant 文件“config.vm.forward_port = hmm..?”
  • config.vm.network :hostonly, "188.120.244.5" - 不起作用。在主机上创建了 IP 为“188.120.244.1”的新接口。当然 188.120.244.1 IP 不是我的,我无法通过此 IP 访问我的服务器。
  • config.vm.network :bridged — 我很困惑它是如何工作的:)

我现在拥有的:不起作用的配置。

Debian-host-machine# cat Vagrantfile
Vagrant::Config.run do |config|
  config.vm.define :gitlab do |box_config|
    box_config.vm.box = "ubuntu"
    box_config.vm.host_name = "ubuntu"
    box_config.vm.network :bridged
    box_config.vm.network :hostonly, "188.120.244.5", :auto_config => false
  end
end

Debian-host-machine# ifconfig
eth1      Link encap:Ethernet  HWaddr 00:15:17:69:71:bb  
          inet addr:188.120.245.4  Bcast:188.120.247.255  Mask:255.255.248.0

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0

vboxnet0  Link encap:Ethernet  HWaddr 0a:00:27:00:00:00  
          inet addr:188.120.244.1  Bcast:188.120.246.255  Mask:255.255.255.0

Ubuntu-virtual-machine# ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:ee:8d:0c  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0

eth1      Link encap:Ethernet  HWaddr 08:00:27:45:71:87  

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0

我如何通过网络的公共静态 IP 访问虚拟盒?

我正在使用 Oracle VM VirtualBox Manager 4.1.18 和 Vagrant 版本 1.0.3。

提前感谢您的反馈。

答案1

自 1.3.0 版本以来:

Static IP can now be set on public networks. [GH-1745]

你只需要把这个配置放到你的 Vagrantfile 中(文档)

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

这个 Vagrant 东西真的很棒 :-)

答案2

两周后,我这样解决了我的问题:

Cookbook 根据模板生成 Vagrantfile:

Vagrant::Config.run do |config|
  config.vm.define :gitlab do |box_config|
    box_config.vm.box = "mybox"
    box_config.vm.host_name = "mybox"
    box_config.vm.forward_port 80, 4567
    box_config.vm.forward_port 22, 2222
    box_config.vm.network :hostonly, "192.168.5.10"
  end
end

rebuild-iptables 需要生成并应用 iptables 规则:

# /etc/iptables/general
*filter
:INPUT ACCEPT [0,0]
:FORWARD ACCEPT [0,0]
:OUTPUT ACCEPT [0,0]
# Vagrand boxes forwarding ports
-A FORWARD -p tcp -d 192.168.5.10 --dport 80 -j ACCEPT
-A FORWARD -p tcp -d 192.168.5.10 --dport 22 -j ACCEPT
COMMIT
*nat
:PREROUTING ACCEPT [0,0]
:POSTROUTING ACCEPT [0,0]
:OUTPUT ACCEPT [0,0]
# Nat all traffic to vagrant boxes
# For example, my vagrant box public static ip is 8.8.8.8
-A PREROUTING -d 8.8.8.8 -p tcp -j DNAT --to-destination 192.168.5.10
-A POSTROUTING -j MASQUERADE
COMMIT

和:

echo '1' > /proc/sys/net/ipv4/ip_forward

现在,我可以将应用程序安装到盒子中并通过公共静态 IP 连接到它们,而无需“port_forwarding”设置(就像在 VPS 上一样)。

答案3

你真正需要的是具有静态 IP 的桥接接口。不幸的是,vagrant 尚不支持此功能(请参阅讨论)这里)。

首先,设置 box_config.vm.network:bridged 因为您需要 virtualbox 创建桥接接口,并且您可以删除 box_config.vm.network:hostonly。

您可以使用shell 配置用您的 IP 重新配置网络,但您无法修改 /etc/network/interfaces 文件,否则如果您执行 vagrant halt,VM 将无法重新启动(执行 vagrant up 将尝试重新配置网络接口,如果您修改了该文件,它将死机)。
因此,另一种方法是在 /etc/network/if-up.d/ 中创建一个脚本,重新设置接口的 IP。这不是理想的选择,但我还没有想出更好的解决方案!


请参阅下面配置的相关部分。在 bash 脚本中,您应该设置 IP/网络掩码、网关和 DNS(以及接口号,如果您的接口号不同,则应该是 eth1,但如果您刚刚在 Vagrantfile 中设置了桥接)。
因此,第一次执行 vagrant up 并创建 VM 时,它会创建一个脚本 /etc/network/if-up.d/custom-network-config,该脚本设置 IP 配置、路由并重新启动 apache(如果您使用依赖于网络配置的其他服务,则需要修改它),并设置 DNS。
然后,如果您在 VM 已经存在时再次执行 vagrant up(例如在执行 vagrant halt 之后),它所做的就是重新启动网络接口,以便脚本运行并配置接口(出于某种原因,我发现在 VM 打开并且接口最初出现时脚本没有启动 - 不确定为什么)。

Vagrant文​​件

config.vm.network :bridged
config.vm.provision :shell, :path => "vagrant-setup.sh"

vagrant-setup.sh

#!/bin/bash

ip="188.120.244.5/24"
gateway=""
dns="8.8.8.8"


#####################
# NEW VM
#####################
if [ ! -f /etc/network/if-up.d/custom-network-config ]; then

cat >/etc/network/if-up.d/custom-network-config <<EOL
#!/bin/bash
if [ "\$IFACE" != "eth1" ]; then
exit 0
fi
ifconfig eth1 down
ifconfig eth1 ${ip} up
route del default
route add default gw ${gateway} dev eth1
service apache2 restart
EOL

cat >/etc/resolv.conf <<EOL
nameserver ${dns}
EOL

chmod +x /etc/network/if-up.d/custom-network-config
/etc/init.d/networking restart


#####################
# EXISTING VM
#####################
else

/etc/init.d/networking restart

fi

相关内容