简单来说,桥接就是把一台机器上的若干个网络接口连接
起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去,使得网口之间的报文能够互相转发,类似交换机
。
Linux内核支持网口的桥接与交换机有一点点不同,交换机只是一个二层设备,对于接收到的报文,要么转发、要么丢弃。而运行着Linux内核的机器本身就是一台主机,有可能就是网络报文的目的地。其收到的报文除了转发和丢弃,还可能被送到网络协议栈的上层(网络层),从而被自己消化。
网桥是工作在 TCP/IP
二层协议的虚拟网络设备,与现实世界中的交换机功能相似。与其他虚拟网络设备一样,可以配置 IP
、MAC
。Bridge 的主要功能是在多个接入 Bridge 的网络接口间转发数据包。
对于普通的网络设备,就像一个管道,只有两端,数据从一端进,从另一端出。而 Bridge 有多个端口,数据可以从多个端口进,从多个端口出。
如下图,Bridge (设备名 br0)
充当主设备,连接了四个从设备,分别是 tap1
,tap2
,veth1
,eth0
。
Bridge设备br0绑定了实际设备eth0与虚拟设备tap0
、tap1
、veth1
,此时,对于Hypervisor的网络协议栈上层来说,只看得到br0
,并不会关心网桥的细节。当这些从设备接收到数据包时,会将其提交给br0
,它来决定数据包的去向,br0会根据MAC地址
与端口
的映射关系进行转发。
因为Bridge工作在第二层,所以绑定在br0上的从设备eth0
、tap0
、tap1
、veth1
均不需要再设置IP,对上层路由器来说,它们都位于同一子网,因此只需为br0设置IP,比如10.0.1.0/24
,此时,eth0、tap0、tap1、veth1均通过br0出入10.0.1.0/24
网段。
因为具有自己的IP,所以br0可以被加入到路由表,并利用它来发送数据,而最终实际的发送过程则是由某个从设备来完成。
如果eth0本身具有自己的IP,比如192.168.3.7
,在绑定br0之后,它的IP会失效,用户程序不能接收到发送到这个IP的地址,只有目的地址为br0 IP的数据包才会被Linux接收。
桥的使用
ip命令建桥
ip link add br2 type bridge # 创建网桥
ip link set dev eth0 master br2 # 为网桥添加物理接口
ip link del br2 type bridge # 删除网桥
ip link set dev eth0 nomaster # 删除网桥接口
ip addr show type bridge # 显示网桥列表信息
ip addr show type bridge br2 # 显示网桥br2的信息
如果需要查看网卡挂载桥信息,可以采用ip addr
命令实现,如下图所示,master后面表示挂载得网桥名称。
桥的持久化
对于centos而言,如果重启网络服务,则所有的配置则会消失,所以我们需要修改配置文件,才能永久保存网桥配置;
配置文件如下:
cd /etc/sysconfig/network-scripts/
cp ifcfg-enp1s0 ifcfg-br0
#编辑配置文件
vim ifcfg-br0
TYPE=Bridge #注意,这个地方一点要大写
BOOTPROTO=none
DEVICE=br0 #指定设备名称,一定要与文件名中ifcfg-br0后的"br0"相同
ONBOOT=yes #开机启动
IPADDR=192.168.1.1 #配置网桥的地址
NETMASK=255.255.255.0
GATEWAY=192.168.238.1 #指定网关
:wq
vim ifg-enp1s0
TYPE=Ethernet
BOOTPROTO=none
NM_CONIROLLED=no
NAME=enp1s0
DEVICE=enp1s0
ONBOOT=yes
BRIDGE=br0 #将该网卡桥接到br0上面去
:wq
systemctl restart network #重启网络服务