什么是brctl

brctl 用来管理以太网桥,在内核中建立、维护、检查网桥配置。一个网桥一般用来连接多个不同的网络,这样这些不同的网络就可以像一个网络那样进行通讯。

网桥是一种在链路层实现中继,对帧进行转发的技术,根据MAC分区块,可隔离碰撞,将网络的多个网段在数据链路层连接起来的网络设备。网桥工作在数据链路层,将两个LAN连起来,根据MAC地址来转发帧,可以看作一个“底层的路由器”。

在网桥上每个以太网连接可以对应到一个物理接口,这些以太网接口组合成一个大的逻辑的接口,这个逻辑接口对应于桥接网络。
————————————————
版权声明:本文为CSDN博主「Lee木木」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44983653/article/details/103138223

安装 bridge-utils

1
yum info bridge-utils

brctl命令详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[riscv@fedora-riscv ~]$ brctl 
Usage: brctl [commands]
commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge
delif <bridge> <device> delete interface from bridge
hairpin <bridge> <port> {on|off} turn hairpin on/off
setageing <bridge> <time> set ageing time
setbridgeprio <bridge> <prio> set bridge priority
setfd <bridge> <time> set bridge forward delay
sethello <bridge> <time> set hello time
setmaxage <bridge> <time> set max message age
setpathcost <bridge> <port> <cost> set path cost
setportprio <bridge> <port> <prio> set port priority
show [ <bridge> ] show a list of bridges
showmacs <bridge> show a list of mac addrs
showstp <bridge> show bridge stp info
stp <bridge> {on|off} turn stp on/off

下面详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
brctl addbr 网卡 ## 创建一个名为 name 的桥接网络接口
brctl delbr 网卡## 删除一个名为 name 的桥接网络接口,桥接网络接口必须先 down 掉后才能删除
brctl show ## 显示目前所有的桥接接口
brctl addif 桥接口 网卡 ##把网卡加入桥接口中,所有从网卡收到的帧都会被桥接口处理
##所有发往网桥的帧,网卡就像输出接口一样。处于混杂模式了,不需要配置ip
brctl delif 桥接口 网卡 ##从桥接口中脱离一个网卡口
brctl show 桥接口

brctl stp 桥接口 状态(on off)
STP 多个以太网桥可以工作在一起组成一个更大的网络,利用 802.1d 协议在两个网络之间寻找最短路径
STP 的作用是防止以太网桥之间形成回路,如果确定只有一个网桥,则可以关闭 STP
#显然我们图中只有一个网桥,可以关闭STP
控制网桥是否加入 STP 树中
<state> 可以是'on'或者'yes'表示加入 stp 树中,这样当 lan 中有多个网桥时可以防止回环
##'off'表示关闭stp

网桥性质设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# brctl setbridgeprio <bridge> <priority>
## 设置网桥的优先级,<priority> 的值为0-65535,值小的优先级高,优先级最高的是根网桥。

# brctl setfd <bridge> <time>
## 设置网桥的'bridge forward delay'转发延迟时间,时间以秒为单位

# brctl sethello <bridge> <time>
## 设置网桥的'bridge hello time'存活检测时间

# brctl setmaxage <bridge> <time>
## 设置网桥的'maximum message age'时间

# brctl setpathcost <bridge> <port> <cost>
## 设置网桥中某个端口的链路花费值

# brctl setportprio <bridge> <port> <priority>
## 设置网桥中某个端口的优先级

介绍一下STP命令在这里的使用

1
2
# brctl stp br0 on          ## 开启网桥 br0 的 STP,避免成环。
# brctl stp br0 off ## 关闭网桥 br0 的 STP,因为只有一个网桥,一条路。

image-20220612113718275

1
brctl showstp br0

对于我新建的网桥br0配置好之后,让其显示stp配置。

STP(spanning tree protocol)的工作工程

首先依据网桥优先级和MAC组合生成的桥ID,将桥ID最小的设置为根桥。如图中的bridge id故8000最小,为根桥。

在此基础上,计算每个节点到根桥的距离,并由这些路径得到各冗余链路的代价,选择最小的成为通信路径,状态变为forwarding

如图中所示,其他的就成为备份路径,状态变为blocking

端口状态 端口能力
Disabled 不收发任何报文。
Blocking 不接收或者转发数据,接收但不发送BPDU,不进行地址学习。
Listening 不接收或者转发数据,接收并发送BPDU,不进行地址学习。
Learning 不接收或者转发数据,接收并发送BPDU,开始进行地址学习。
Forwarding 接收或者转发数据,接收并发送BPDU,进行地址学习。

image-20220612114157527

这就是网桥连接的几张网卡

实战介绍

1
2
3
4
5
6
7
8
增加网桥
sudo brctl addbr br0
添加网卡到网桥
sudo brctl addif br0 ens33
启用网桥
sudo ifconfig br0 up
为网桥分配IP地址
sudo ifconfig br0 IP地址

此时已经无法ping通外网,因为所有包都要通过网桥来走,然而网桥还并没有通外网。

我们建议用DHCP分配IP地址,这样即可

1
sudo dhclient br0

此时网桥和网卡在同一网段,仍然可以通外网。

在虚拟机中打开新虚拟机后,可以先查看ip,然后再在原虚拟机中查看

1
sudo brctl showstp