上一篇博文Vagrant虚拟化之网络配置主要是单网卡环境的配置,当我们的电脑开启docker等服务时,就出现了多个网卡的情况下,我们应该怎么配置呢?
基本配置
1.下面先来看下我本机的网卡情况:
root@yanggd-OptiPlex-380:~# ifconfig
docker0 Link encap:以太网 硬件地址 02:42:08:e0:d0:6a
inet 地址:172.17.0.1 广播:0.0.0.0 掩码:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 跃点数:1
接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:0
接收字节:0 (0.0 B) 发送字节:0 (0.0 B)
enp2s0 Link encap:以太网 硬件地址 bc:30:5b:ba:7f:7d
inet 地址:10.11.2.102 广播:10.11.255.255 掩码:255.255.0.0
inet6 地址: fe80::9cc6:6dc7:1de2:237e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:3859380 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:1276942 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:2343679715 (2.3 GB) 发送字节:370668100 (370.6 MB)
中断:16
.........
vboxnet0 Link encap:以太网 硬件地址 0a:00:27:00:00:00
inet 地址:10.11.2.1 广播:10.11.2.255 掩码:255.255.255.0
inet6 地址: fe80::800:27ff:fe00:0/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 跃点数:1
接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
发送数据包:2066 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:0 (0.0 B) 发送字节:243885 (243.8 KB)
其中:
docker0是我本机docker服务启动后的网卡
enp2s0是我本机自带的网卡
vboxnet0是vagrant启动public_network的交接网卡
2.当我们配置好vagrantfile启动后,就会提示我们输入需要桥接的网卡,如下:
vim Vagrantfile
Vagrant.configure("2") do |config|
config.vm.define :admin do |admin|
admin.vm.hostname = "ubuntu-admin"
admin.vm.box = "yanggd/ubuntu"
admin.vm.network "public_network", auto_config: false
admin.vm.provision "shell",
run: "always",
inline: "ifconfig eth1 10.11.5.211 netmask 255.255.0.0 up"
admin.vm.provision "shell",
run: "always",
inline: "route add default gw 10.11.15.4"
admin.vm.provision "shell",
run: "always",
inline: "eval `route -n | awk '{ if ($8 == \"eth0\" && $2 != \"0.0.0.0\") print \"route del default gw \" $2; }'`"
end
end
当我们vagrant reload时,会提示我们输入需要桥接的网卡:
==> admin: Attempting graceful shutdown of VM...
admin: Guest communication could not be established! This is usually because
admin: SSH is not running, the authentication information was changed,
admin: or some other networking issue. Vagrant will force halt, if
admin: capable.
==> admin: Forcing shutdown of VM...
==> admin: Clearing any previously set forwarded ports...
==> admin: Clearing any previously set network interfaces...
==> admin: Available bridged network interfaces:
1) enp2s0
2) docker0
==> admin: When choosing an interface, it is usually the one that is
==> admin: being used to connect to the internet.
admin: Which interface should the network bridge to?
由于enp2s0是我们本机自带的网卡,因此需要桥接到此网卡上,直接输入”1”即可:
admin: Which interface should the network bridge to? 1
==> admin: Preparing network interfaces based on configuration...
admin: Adapter 1: nat
admin: Adapter 2: hostonly
admin: Adapter 3: bridged
==> admin: Forwarding ports...
admin: 22 (guest) => 2222 (host) (adapter 1)
==> admin: Booting VM...
==> admin: Waiting for machine to boot. This may take a few minutes...
admin: SSH address: 127.0.0.1:2222
admin: SSH username: vagrant
admin: SSH auth method: private key
......
如果每次输入桥接网卡,很麻烦,我们可以在vagrantfile里通过”bridge:”直接指定,如
admin.vm.network "public_network", bridge: "enp2s0", auto_config: false
这样在vagrant reload后会自动桥接到enp2s0网卡上。
出现问题:
public_network无法ping通网络中其他主机
root@yanggd-OptiPlex-380:/# vagrant ssh
vagrant@ubuntu-admin:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:32:20:37 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe32:2037/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:c8:33:f3 brd ff:ff:ff:ff:ff:ff
inet 10.11.5.211/16 brd 10.11.255.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fec8:33f3/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:47:14:c9 brd ff:ff:ff:ff:ff:ff
inet6 fe80::a00:27ff:fe47:14c9/64 scope link
valid_lft forever preferred_lft forever
此时发现我们的vagrant vm有3个网卡,在vm里能ping我们的主机,但是ping不同网络中其他服务器,我们设置成public_network了啊,为什么?
下面我们开下此时vagrant up启动信息:
==> admin: Attempting graceful shutdown of VM...
admin: Guest communication could not be established! This is usually because
admin: SSH is not running, the authentication information was changed,
admin: or some other networking issue. Vagrant will force halt, if
admin: capable.
==> admin: Forcing shutdown of VM...
==> admin: Clearing any previously set forwarded ports...
==> admin: Clearing any previously set network interfaces...
==> admin: Available bridged network interfaces:
1) enp2s0
2) docker0
==> admin: When choosing an interface, it is usually the one that is
==> admin: being used to connect to the internet.
admin: Which interface should the network bridge to? 1
==> admin: Preparing network interfaces based on configuration...
admin: Adapter 1: nat
admin: Adapter 2: hostonly
admin: Adapter 3: bridged
当我们选定要桥接的网卡后,发现vm的3个网卡信息:
admin: Adapter 1: nat
admin: Adapter 2: hostonly
admin: Adapter 3: bridged
adapter 1为nat模式
adapter 2为hostonly模式,也就是private_networkd
adapter 3为bridage模式,也就是桥接模式
上面ifconfig信息中eth0、eth1、eth2就分别对应adapter1、adapter2、adapter3;其中我们在vagrantfile中配置ip的网卡为eth1,启动信息中adapter2显示为hostonly模式,因此我们的vm只能ping通本机,而无法ping通网络中的其他主机。
我们在vagrantfile中虽然绑定了桥接主机网卡,但是并没有说明vm中哪个网卡为public_network、哪个网卡为hostonly,因此出现了以上的问题。
解决方案:
经过测试,需要将设置ip的eth1,设置成public_network才能解决问题:
admin.vm.network "public_network", bridge: "enp2s0",adapter: 2, auto_config: false
vagrant reload后,我们可以看到启动信息:
==> admin: Attempting graceful shutdown of VM...
==> admin: Clearing any previously set forwarded ports...
==> admin: Clearing any previously set network interfaces...
==> admin: Preparing network interfaces based on configuration...
admin: Adapter 1: nat
admin: Adapter 2: bridged
adapter2网卡的模式变成了bridged,而不是hostonly了,此时测试vm既能ping通主机,又能ping同网络中其他机器。
注意:
在此public_network模式下,我将vm的ip地址和主机的ip地址设置成一个网段的,发现ping不通主机,改成其他网段是可以的。