本帖最后由 鸡爷 于 2019-11-22 15:49 编辑
版权声明:本文为CSDN博主「CloudMan6」的原创文章
Linux Bridge 基本概念 假设宿主机有 1 块与外网连接的物理网卡 eth0,上面跑了 1 个虚机 VM1,现在有个问题是: 如何让 VM1 能够访问外网? 至少有两种方案 1.将物理网卡eth0直接分配给VM1,但随之带来的问题很多: 宿主机就没有网卡,无法访问了; 新的虚机,比如 VM2 也没有网卡。 下面看推荐的方案 2.给 VM1 分配一个虚拟网卡 vnet0,通过 Linux Bridge br0 将 eth0 和 vnet0 连接起来,如下图所示
Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能大家可以简单的理解为是一个二层交换机或者 Hub。多个网络设备可以连接到同一个 Linux Bridge,当某个设备收到数据包时,Linux Bridge 会将数据转发给其他设备。 在上面这个例子中,当有数据到达 eth0 时,br0 会将数据转发给 vnet0,这样 VM1 就能接收到来自外网的数据; 反过来,VM1 发送数据给 vnet0,br0 也会将数据转发到 eth0,从而实现了 VM1 与外网的通信。
现在我们增加一个虚机 VM2,如下图所示 VM2 的虚拟网卡 vnet1 也连接到了 br0 上。 现在 VM1 和 VM2 之间可以通信,同时 VM1 和 VM2 也都可以与外网通信。
本节将演示如何在实验环境中实现下图所示的虚拟网络
配置 Linux Bridge br0 配置bridge上网方式 1、创建桥接器 在/etc/sysconfig/network-scripts目录下,创建一个ifcfg-br0 文件,其类型设为Bridge: 例: DEVICE=br0
BOOTPROTO=static
BROADCAST=192.168.110.255
IPADDR=192.168.110.205
NETMASK=255.255.255.0
NETWORK=192.168.110.0
ONBOOT=yes
GATEWAY=192.168.110.1
TYPE=Bridge
2、将物理接口桥接到桥接器
在/etc/sysconfig/network-scripts目录下,修改eth0的内容(本实验中,物理服务器是用eth0上网的),去掉其IP相关信息,加上“BRIDGE=br0”,将其桥接到br0上;如果是双网卡或是多网卡,照此过程修改: DEVICE=eth0
HWADDR=00:30:48:F1:7C:3A
ONBOOT=yes
BRIDGE=br0
3、重启物理机网络服务 [root@virt ~]# service network restart
正在关闭接口 br0: [确定]
正在关闭接口 eth0: [确定]
关闭环回接口: [确定]
弹出环回接口: [确定]
弹出界面 eth0: [确定]
弹出界面 br0: [确定] 重启宿主机,查看 IP 配置,可以看到 IP 已经放到 br0 上了
# ifconfig br0 Link encap:Ethernet HWaddr 00:0c:29:8d:ec:be inet addr:192.168.111.107 Bcast:192.168.111.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe8d:ecbe/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:22573 errors:0 dropped:0 overruns:0 frame:0 TX packets:2757 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4927580 (4.9 MB) TX bytes:368895 (368.8 KB)
eth0 Link encap:Ethernet HWaddr 00:0c:29:8d:ec:be inet6 addr: fe80::20c:29ff:fe8d:ecbe/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:24388 errors:0 dropped:0 overruns:0 frame:0 TX packets:2816 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:5590438 (5.5 MB) TX bytes:411558 (411.5 KB)
用 brctl show 查看当前 Linux Bridge 的配置。 eth0 已经挂到 br0 上了 # brctl show bridge name bridge id STP enabled interfaces br0 8000.000c298decbe no eth0 virbr0 8000.000000000000 yes
配置 VM1 下面我们在 virt-manager 中查看一下 VM1 的网卡配置 可以看到虚拟网卡的 source device 我们选择的是 br0 下面我们启动 VM1,看会发生什么
# virsh start VM1 Domain VM1 started # brctl show bridge name bridge id STP enabled interfaces br0 8000.000c298decbe no eth0 vnet0 virbr0 8000.000000000000 yes brctl show 告诉我们 br0 下面添加了一个 vnet0 设备,通过 virsh 确认这就是VM1的虚拟网卡。
# virsh domiflist VM1 Interface Type Source Model MAC ------------------------------------------------------- vnet0 bridge br0 rtl8139 52:54:00:75:dd:1a
给VM1 设置静态 IP (和Bridge IP同一网段),通过 virt-manager 控制台登录 VM1,查看 IP。 # ifconfig eth0 Link encap:Ethernet HWaddr 52:54:00:75:dd:1a inet addr:192.168.111.106 Bcast:192.168.111.255 Mask:255.255.255.0 inet6 addr: fe80::5054:ff:fe75:dd1a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:400 errors:0 dropped:0 overruns:0 frame:0 TX packets:101 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:41950 (41.9 KB) TX bytes:12583 (12.5 KB)
VM1 的 IP 是 192.168.111.106,与宿主机(IP为192.168.111.107)是同一个网段。
Ping 一下外网 64 bytes from 180.97.33.108: icmp_seq=1 ttl=53 time=34.9 ms 64 bytes from 180.97.33.108: icmp_seq=2 ttl=53 time=36.2 ms 64 bytes from 180.97.33.108: icmp_seq=3 ttl=53 time=38.8 ms
没问题,可以访问。 另外,在 VM1 中虚拟网卡是 eth0,并不是 vnet0。 vent0 是该虚拟网卡在宿主机中对应的设备名称,其类型是 TAP 设备,这里需要注意一下。、
配置 VM2 跟 VM1 一样,VM2 的虚拟网卡也挂在 br0上,启动 VM1,查看网卡信息 # virsh start VM2 Domain VM2 started # brctl show bridge name bridge id STP enabled interfaces br0 8000.000c298decbe no eth0 vnet0 vnet1 virbr0 8000.000000000000 yes
br0 下面多了 vnet1,通过 virsh 确认这就是 VM2 的虚拟网卡。 # virsh domiflist VM2 Interface Type Source Model MAC ------------------------------------------------------- vnet0 bridge br0 rtl8139 52:54:00:cf:33:a1
VM2 配置 IP地址 192.168.111.108,登录 VM2,验证网络的连通性
Ping VM1 root@VM2:~# ping VM1 PING VM1 (192.168.111.106) 56(84) bytes of data. 64 bytes from 192.168.111.106: icmp_seq=1 ttl=64 time=4.54 ms 64 bytes from 192.168.111.106: icmp_seq=2 ttl=64 time=1.63 ms 64 bytes from 192.168.111.106: icmp_seq=3 ttl=64 time=2.16 ms
Ping 宿主机 root@VM2:~# ping 192.168.111.107 PING 192.168.111.107 (192.168.111.107) 56(84) bytes of data. 64 bytes from 192.168.111.107: icmp_seq=1 ttl=64 time=1.02 ms 64 bytes from 192.168.111.107: icmp_seq=2 ttl=64 time=0.052 ms 64 bytes from 192.168.111.107: icmp_seq=3 ttl=64 time=0.064 ms
Ping 外网 64 bytes from 180.97.33.107: icmp_seq=1 ttl=53 time=53.9 ms 64 bytes from 180.97.33.107: icmp_seq=2 ttl=53 time=45.0 ms 64 bytes from 180.97.33.107: icmp_seq=3 ttl=53 time=44.2 ms |