一、Linux Bridge网桥管理
网络虚拟化是虚拟化技术中最复杂的部分,也是非常重要的资源。
第一节中我们创建了一个名为br0的linux-bridge网桥,如果在此网桥上新建一台vm,如下图:
VM2 的虚拟网卡 vnet1 也连接到了 br0 上。 现在 VM1 和 VM2 之间可以通信,同时 VM1 和 VM2 也都可以与外网通信。
查看网络状态:
brctl命令:
brctl show 查看网桥
brctl addbr br1 创建一个网桥
brctl delbr br1 删除一个网桥
二、Vlan介绍
LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机。一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在同一个 LAN 中。
一个 LAN 表示一个广播域。 其含义是:LAN 中的所有成员都会收到任意一个成员发出的广播包。
VLAN 表示 Virtual LAN。一个带有 VLAN 功能的switch 能够将自己的端口划分出多个 LAN。计算机发出的广播包可以被同一个 LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。 简单地说,VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。
比方说,有两组机器,Group A 和 B,我们想配置成 Group A 中的机器可以相互访问,Group B 中的机器也可以相互访问,但是 A 和 B 中的机器无法互相访问。 一种方法是使用两个交换机,A 和 B 分别接到一个交换机。 另一种方法是使用一个带 VLAN 功能的交换机,将 A 和 B 的机器分别放到不同的 VLAN 中。
VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越 VLAN 的边界。但在三层上(比如IP)是可以通过路由器让 A 和 B 互通的。
现在的交换机几乎都是支持 VLAN 的。 通常交换机的端口有两种配置模式: Access 和 Trunk。如下图
Access 口
这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。 不同 VLAN 用 VLAN ID 来区分,VLAN ID 的 范围是 1-4096。 Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access 口后就被打上了所在 VLAN 的标签。 Access 口只能属于一个 VLAN。
Trunk 口
假设有两个交换机 A 和 B。 A 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);B 上也有 VLAN1、2、3,那如何让 AB 上相同 VLAN 之间能够通信呢?
办法是将 A 和 B 连起来,而且连接 A 和 B 的端口要允许 VLAN1、2、3 三个 VLAN 的数据都能够通过。这样的端口就是Trunk口了。 VLAN1, 2, 3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的 VLAN 标签。
三、Linux Bridge实现Vlan原理
KVM 虚拟化环境下实现 VLAN 架构,如下图
eth0 是宿主机上的物理网卡,有一个命名为 eth0.10 的子设备与之相连。 eth0.10 就是 VLAN 设备了,其 VLAN ID 就是 VLAN 10。 eth0.10 挂在命名为 brvlan10 的 Linux Bridge 上,虚机 VM1 的虚拟网卡 vent0 也挂在 brvlan10 上。
这样的配置其效果就是: 宿主机用软件实现了一个交换机(当然是虚拟的),上面定义了一个 VLAN10。 eth0.10,brvlan10 和 vnet0 都分别接到 VLAN10 的 Access口上。而 eth0 就是一个 Trunk 口。VM1 通过 vnet0 发出来的数据包会被打上 VLAN10 的标签。
eth0.10 的作用是:定义了 VLAN10
brvlan10 的作用是:Bridge 上的其他网络设备自动加入到 VLAN10 中
(1)查看核心是否提供VLAN 功能,执行
# dmesg | grep -i 802
或者检查/proc/net/vlan目录是否存在。
如果沒有提供VLAN 功能,/proc/net/vlan目录是不存在的。
如果8021q模块没有载入系统,则可以通过使用modprobe模组命令载入802.1q模组,並且利用lsmod命令确认模组是否已经载入到核心内。
# modprobe 8021q
# lsmod | grep 8021q
设置开机载入8021q模块(可选)
在/etc/sysconfig/modules下增加一个8021q.modules文件,文件内容为modprobe 8021q
# vi /etc/sysconfig/modules/8021q.modules
modprobe 8021q
环境前部署
[root@zxw6 ~]# modprobe 8021q
[root@zxw6 ~]# lsmod | grep 8021q
8021q 33104 0
garp 14384 1 8021q
mrp 18542 1 8021q
[root@zxw6 ~]#
第一步:添加网卡
第二步:重启网络服务
root@zxw6 ~]# systemctl restart network
第三步:查看
[root@zxw6 ~]# ip a
6: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:5c:6c:a8 brd ff:ff:ff:ff:ff:ff
inet 192.168.92.128/24 brd 192.168.92.255 scope global dynamic ens37
valid_lft 1683sec preferred_lft 1683sec
inet6 fe80::d664:933f:8fd6:76bd/64 scope link
valid_lft forever preferred_lft forever
第四步:添加ens37网卡配置文件
[root@zxw6 network-scripts]# cat ifcfg-ens37
HWADDR=00:0C:29:5C:6C:A8
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
UUID=ee1f5996-5816-36f0-b561-877e9e3bc499
ONBOOT=yes
AUTOCONNECT_PRIORITY=-999
第五步:上穿 vconfig包并安装(创建vlan的软件包)
[root@zxw6 ~]# yum localinstall vconfig-1.9-16.el7.x86_64.rpm -y
第六步:ens37修配置文件给为静态
[root@zxw6 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37
DEVICE="ens37"
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
第七步:创建ens37的vlan网口:为vlan10,vlan20:ens37.10 ,ens37.20
[root@zxw6 ~]# vconfig add ens37 10
Added VLAN with VID == 10 to IF -:ens37:-
[root@zxw6 ~]# vconfig add ens37 20
Added VLAN with VID == 20 to IF -:ens37:-
第八步:查看ens37创建出来的网口
[root@zxw6 ~]# ip a
8: ens37.10@ens37: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:0c:29:5c:6c:a8 brd ff:ff:ff:ff:ff:ff
9: ens37.20@ens37: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:0c:29:5c:6c:a8 brd ff:ff:ff:ff:ff:ff
第九步:创建网卡的配置文件ens37
[root@zxw6 network-scripts]# vim ifcfg-ens37.10
VLAN=yes 开启vlan
TYPE=vlan 类型
PHYSDEV=ens37 网卡
VLAN_ID=10 ID
NAME=ens37.10 名字
ONBOOT=yes 开机启动
DEVICE=ens37.10 驱动
BRIDGE=brvlan-10 绑定
ZONE=trusted 开启zone域
~
[root@zxw6 network-scripts]# vim ifcfg-ens37.20
VLAN=yes
TYPE=vlan
PHYSDEV=ens37
VLAN_ID=20
NAME=ens37.20
ONBOOT=yes
DEVICE=ens37.20
BRIDGE=brvlan-20
ZONE=trusted
~
第十步:创建网桥brvlan-10 ,brvlan-20
[root@zxw6 network-scripts]# brctl addbr brvlan-10
[root@zxw6 network-scripts]# brctl addbr brvlan-20
[root@zxw6 network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c295c6c9e no ens33
brvlan-10 8000.000000000000 no
brvlan-20 8000.000000000000 no
virbr0 8000.52540005d291 yes virbr0-nic
第十一步:创建网桥的配置文件
[root@zxw6 network-scripts]# vim ifcfg-brvlan-10
TYPE=bridge
BOOTPROTO=static
NAME=brvlan-10
DEVICE=brvlan-10
ONBOOT=yes
[root@zxw6 network-scripts]# vim ifcfg-brvlan-20
TYPE=bridge
BOOTPROTO=static
NAME=brvlan-20
DEVICE=brvlan-20
ONBOOT=yes
第十二步:在网桥添加网口brvlan-10——>ens37.10
brvlan-20——>ens37.20
[root@zxw6 network-scripts]# brctl addif brvlan-10 ens37.10
[root@zxw6 network-scripts]# brctl addif brvlan-20 ens37.20
[root@zxw6 network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
brvlan-10 8000.000c295c6ca8 no ens37.10
brvlan-20 8000.000c295c6ca8 no ens37.20
第十三步:重新启动网卡
[root@zxw6 network-scripts]# systemctl restart network
第十四步:查看网卡
[root@zxw6 network-scripts]# ip a
6: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:5c:6c:a8 brd ff:ff:ff:ff:ff:ff
inet 192.168.92.128/24 brd 192.168.92.255 scope global dynamic ens37
valid_lft 934sec preferred_lft 934sec
inet6 fe80::d664:933f:8fd6:76bd/64 scope link
valid_lft forever preferred_lft forever
8: ens37.10@ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master brvlan-10 state UP qlen 1000
link/ether 00:0c:29:5c:6c:a8 brd ff:ff:ff:ff:ff:ff
9: ens37.20@ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master brvlan-20 state UP qlen 1000
link/ether 00:0c:29:5c:6c:a8 brd ff:ff:ff:ff:ff:ff
10: brvlan-10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 00:0c:29:5c:6c:a8 brd ff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:fe5c:6ca8/64 scope link
valid_lft forever preferred_lft forever
11: brvlan-20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 00:0c:29:5c:6c:a8 brd ff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:fe5c:6ca8/64 scope link
valid_lft forever preferred_lft forever
12: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 00:0c:29:5c:6c:9e brd ff:ff:ff:ff:ff:ff
inet 192.168.126.6/24 brd 192.168.126.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe5c:6c9e/64 scope link
valid_lft forever preferred_lft forever
取消操作
分离vlan和虚拟网卡
[root@zxw6 ~]# brctl delif brvlan-10 ens37.10
[root@zxw6 ~]# brctl delif brvlan-20 ens37.20
[root@zxw6 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c295c6c9e no ens33
brvlan-10 8000.000000000000 no
brvlan-20 8000.000000000000 no
virbr0 8000.52540005d291 yes virbr0-nic
删除虚拟网卡
[root@zxw6 ~]# vconfig rem ens37.10
Removed VLAN -:ens37.10:-
[root@zxw6 ~]# vconfig rem ens37.20
Removed VLAN -:ens37.20:-
删除配置文件
[root@zxw6 network-scripts]# rm -f ifcfg-ens37.10 ifcfg-ens37.20
ifcfg-brvlan-20 ifcfg-brvlan-10
nmtui删除brvlan