您的位置:首页 > 理论基础 > 计算机网络

vagrant 网络

2016-07-25 19:44 381 查看

vagrant 网络

为了连接vagrant创建的环境,他提供了一些高级的网络选项例如:端口转发、连接到公用网络,或者创建一个私有的网络。高级的网络选项用来创建一个在不同的虚拟机间工作的抽象层。这也就是说你可以用你的vagrantfile来运行在Virtualbox虚拟机同时你也可以合理的期望这个vagrantfile在vmware虚拟机下也能运行。首先应当赌一下基本应用内容,然后读下面的针对特定网络功能的指导。

网络的基本应用

vagrant提供了很多用来把你的客户机连接到网络的选项。但是很重要的一点,就像很多网络配置一样,他有一个标准的模式。

配置

所有的网络配置都是在vagrantfile的config.vm.network方法里面。例如下面的这些配置,顶一下一些转发端口

 

Vagrant.configure("2") do |config|
# ...
config.vm.network "forwarded_port", guest: 80, host: 8080
end


每一个网络类型都有一个标识符,例如上面例子中:forwarded_port。下面是一组可以针对每个网络类型不同的配置参数。转发端口的情况下,需要两个数字参数。客户机端口,以及客户机可以连接的主机端口。

多网络

多网络配置可以通过定义多个config.vm.network在一个vagrantfile中来实现。更确切的说,对于不同的提供者,网络的配置可以不同。一般来说,命令指定启用网络的顺序。

网络开启

网络会自动配置和开启,当在vagrantfile中定义了,运行vagrant up或者运行vagrant reload的过程中

转发端口

网络标识符:forwarded_port

vagrant转发端口允许连接主机的一个端口,让所有的数据都转发到客户机端口上,不管是TCP还是UDP协议。例如:如果客户机运行一个网络服务监听程序在80端口上,你可以把他映射到你主机的8080端口上。这样你就可以在浏览器中输入localhost:8080来浏览网页,所有的网络数据都会被转发到客户机。

定义转发端口

转发端口的配置需要两个参数,客户机端口和主机端口

 

Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080
end


这个配置将会通过主机的8080端口访问客户机的80端口。

对于大多数的提供者来说,转发端口默认绑定到所有接口。这也就是说网络上的其他设备也可以连接转发端口。如果你想限制连接可以看guest_ip和host_ip部分。

参考选项

这是转发端口的所有选项列表。

guest(int)--你希望暴露给主机的端口,可以是任何端口
guest_ip(string)--绑定到转发端口的客户IP,如果这个没有设置,这个端口可以转到任何一个IP接口。默认为空
host(int)--用来连接客户机端口的主机端口。这个数值必须大于1024,除非vagrant作为root用户运行。
host_ip(string)--你打算绑定转发端口的主机IP。如果没有指定,这个可以绑定到任何一个IP地址,默认为空。
protocol(string)--或者是TCP或者是UDP.这个选项指定了准许通过转发端口的协议。默认是TCP

转发端口协议

默认情况下,任何定义的端口只会转发TCP协议。作为可选的第三个选项,为了传输UDP包,你可以指定 protocal:'udp'。如果一个端口需要监听这2种协议,你必须定义这个端口协议2次,每次指定一个协议。就像下面这样

 

Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 2003, host: 12003, protocol: "tcp"
config.vm.network "forwarded_port", guest: 2003, host: 12003, protocol: "udp"
end


端口冲突和纠正

当运行多个vagrant机器的时候,经常会遇到定义一个转发端口,互相冲突。vagrant包括内建的机制会自动检测和纠正这种情况。端口冲突检测总是这样做的。vagrant通常不会允许你定义一个主机已经接收和连接的转发端口。

对于每个转发端口都必须手动启用端口冲突自动校正,因为当它发生的时候,往往是出人意料的。并且还会导致vagrant用户认为这个端口没有被转发。启动端口校正很简单:

 

Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080,
auto_correct: true
end


最后的:auto_correct参数设置为true,告诉vagrant自动纠正任何冲突。当运行vagrant up和vagrant reload的时候,vagrant会打印冲突检测和自动纠正的信息,这样你就可以注意和纠正信息。

私有网络

网络标志符:private_network

vagrant私有网络允许你连接你的客户机,通过不是公共Internet网络访问的IP地址。也就是说,你的机器获得一个私有地址空间。在同一个私有网络中的多台机器可以互相通信。

DHCP

应用私有网络的最简单的方式是,通过DHCP来分发IP地址。

 

Vagrant.configure("2") do |config|
config.vm.network "private_network", type: "dhcp"
end


这将会从保留的地址空间中,自动的分配IP地址。这个可以IP可以通过用vagrant ssh命令来SSH连接到这台机器,或者用合适的命令来获取这个IP地址,例如ifconfig。

静态IP

你也可以指定一个静态的IP地址。这样就可以通过这个静态的IP地址,连接到你的vagrant机器中。配置静态IP地址的vagrantfile如下:

 

Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "192.168.50.4"
end


在配置的时候需要注意,这个静态的IP地址没有和同一个网络的其他IP地址冲突。

如果你能够选择你想要的IP地址,应该从保留的私有地址空间中选择。这些地址将会被保证不会公共转发,对于大多数的路由也会阻断外部网络发送给他们的信息。

对于大多数的操作系统来说,增加静态IP地址的配置选项,通过设置默认的网关和MTU是可行的。

IPV6

你也可以指定一个静态的IPV6的地址。对于DHCP是不支持IPV6的。用IPV6只需要指定一个地址就可以了。

 

Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "fde4:8dba:82e1::c4"
end


这个将会指定一个IP到这个机器。整个/64子网是保留的。确认使用保留本地空间的IPV6地址。你也可以修改前缀长度通过改变netmask选项

Vagrant.configure("2") do |config|
config.vm.network "private_network",
ip: "fde4:8dba:82e1::c4",
netmask: "96"
end


只有vagrant 1.7.5之后的版本,才支持IPV6私有网络,并且不是每个提供者都支持。

禁止自动配置

如果你想手工配置网络接口,你可以通过指定auto_config参数来禁用vagrant自动配置的特性。

 

Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "192.168.50.4",
auto_config: false
end


如果在设置auto_config之前,你已经启动了vagrant环境。它最初放置的文件将在那里停留。你必须手动删除掉它,然后重新创建机器。

不同的操作系统创建的文件路径不同。例如,对于Linux版本,他的路径是/etc/network/interfaces.通常你应该查看网络接口配置的通用位置。

公共网络

网络标识符:public_network

vagrant的公共网络,比起私有网络的私有性差一点。对于不同的提供者具体的含义也是不同的。公共网络的意思是,当私有网络不允许别的机器连接到你的机器,而公共网络可以。

DHCP

最简单的用公共网络的是通过DHCP分配公共IP地址。这种情况下配置很简单。

 

Vagrant.configure("2") do |config|
config.vm.network "public_network"
end

当用DHCP的时候,这个可以IP可以通过用vagrant ssh命令来SSH连接到这台机器,或者用合适的命令来获取这个IP地址,例如ifconfig。

用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提供者就会被用来配置接口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盒子,这是需要配置的。为了完成这个,你可以用一个提供者脚本。

 

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; }'`"


上面的配置有点复杂。可能需要客户系统指定。但是我们在这里粗略的介绍,因为这是个公共的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vagrant