天天看点

Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)的基本操作

目录

文章目录

  • 目录
  • Linux bridge 的基本操作
  • 创建 Bridge
  • 将 veth pair 连上 Bridge
  • 为 Bridge 配置 IP 地址
  • 将物理网卡接口设备挂靠 Bridge
  • Linux Bridge 与虚拟机
  • Linux Bridge 与容器
  • Linux Bridge 的 MAC 地址行为
  • Linux Bridge 常用指令

Linux bridge 的基本操作

创建 Bridge

$ brctl addbr br0
# or
$ ip link add name br0 type bridge

$ ip link set br0 up      

刚新建的 bridge 是一个独立的虚拟网络设备,现阶段只有一个端口连着 TCP/IP Stack,此时的 bridge 没有实际功能,网络拓扑如下:

+----------------------------------------------------------------+
|                                                                |
|       +------------------------------------------------+       |
|       |             Newwork Protocol Stack             |       |
|       +------------------------------------------------+       |
|              ↑                                ↑                |
|..............|................................|................|
|              ↓                                ↓                |
|        +----------+                     +------------+         |
|        |   eth0   |                     |     br0    |         |
|        +----------+                     +------------+         |
| 192.168.3.21 ↑                                                 |
|              |                                                 |
|              |                                                 |
+--------------|-------------------------------------------------+
               ↓
         Physical Network      

将 veth pair 连上 Bridge

$ ip link add veth0 type veth peer name veth1

$ ip addr add 192.168.3.101/24 dev veth0
$ ip addr add 192.168.3.102/24 dev veth1

$ ip link set veth0 up
$ ip link set veth1 up

$ brctl addif br0 veth0
# or
$ ip link set dev veth0 master br0

$ bridge link
6: veth0 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2      

此时网络拓扑如下:

+----------------------------------------------------------------+
|                                                                |
|       +------------------------------------------------+       |
|       |             Newwork Protocol Stack             |       |
|       +------------------------------------------------+       |
|            ↑            ↑              |            ↑          |
|............|............|..............|............|..........|
|            ↓            ↓              ↓            ↓          |
|        +------+     +--------+     +-------+    +-------+      |
|        | .3.21|     |        |     | .3.101|    | .3.102|      |
|        +------+     +--------+     +-------+    +-------+      |
|        | eth0 |     |   br0  |<--->| veth0 |    | veth1 |      |
|        +------+     +--------+     +-------+    +-------+      |
|            ↑                           ↑            ↑          |
|            |                           |            |          |
|            |                           +------------+          |
|            |                                                   |
+------------|---------------------------------------------------+
             ↓
     Physical Network      

br0 和 veth0 相连之后,发生了几个变化:

  1. veth0 与 veth1 相连(类似网线的两端)。
  2. veth0 和 veth1 都与网络协议栈相连(具有 IP 地址)。
  3. veth0 与 br0 相连,其一端被插入到 br0 中。两者是双向通道。
  4. TCP/IP Stack 和 veth0 之间变成了单向通道。veth0 能接受 TCP/IP Stack 发来的数据,但 veth0 不会把从外面收到的数据转发给 TCP/IP Stack。
  • br0 的 “隐藏 MAC 地址” 变成了 veth0 的 mac 地址

相当于 bridge 在 veth0 和 TCP/IP Stack 之间插了一脚。veth0 本来要转发给 TCP/IP Stack 的数据被拦截,并全部转发给 bridge 了,即:接入到 bridge 的 veth pair 设备只能将数据包发送给 bridge,同时 bridge 也可以向 veth0 发送数据。

为 Bridge 配置 IP 地址

常见的物理交换机中,有些是支持配置 IP 地址的,管理员可以 SSH 到交换机上进行配置作业;有些事不支持配置 IP 地址的,提供了 COM 口给管理员接入;有些更简单的设备连 COM 口都没有,不支持额外的配置。

正如上文所言,Linux Bridge 具有 “虚拟网卡设备” 和 “虚拟网桥设备” 两重功能,所以 Bridge 属于支持配置 IP 地址的类型,其内含了一张 “隐藏的网卡(MAC 地址)”,通常的,会把挂载到 Bridge 的网络设备(e.g. eth0、veth0 等)的 IP 地址给 Bridge 使用。

该虚拟网卡一端连在 Bridge 上,另一端连在 TCP/IP Stack 上。另外,和物理交换机一样,Bridge 的 “虚拟网桥” 功能不依赖于 “虚拟网卡”。

$ ip addr del 192.168.3.101/24 dev veth0
$ ip addr add 192.168.3.101/24 dev br0      

此时网络拓扑如下:

+----------------------------------------------------------------+
|                                                                |
|       +------------------------------------------------+       |
|       |             Newwork Protocol Stack             |       |
|       +------------------------------------------------+       |
|            ↑            ↑                           ↑          |
|............|............|...........................|..........|
|            ↓            ↓                           ↓          |
|        +------+     +--------+     +-------+    +-------+      |
|        | .3.21|     | .3.101 |     |       |    | .3.102|      |
|        +------+     +--------+     +-------+    +-------+      |
|        | eth0 |     |   br0  |<--->| veth0 |    | veth1 |      |
|        +------+     +--------+     +-------+    +-------+      |
|            ↑                           ↑            ↑          |
|            |                           |            |          |
|            |                           +------------+          |
|            |                                                   |
+------------|---------------------------------------------------+
             ↓
     Physical Network      

这样的,br0 和 veth1 通过 veth0 连接了起来,此时的 veth pair 就相当于一根网线。

验证:

# 通过 veth0 不能 ping 通 veth1
$ ping -c 1 -I veth0 192.168.3.102

# 通过 br0 能 ping 通 veth0
$ ping -c 1 -I br0 192.168.3.102      

NOTE:此时 br0 还是 ping 不同网关(.3.1),因为 br0 上只有两个端口,并没有连接网关,所以无法将数据帧转发给网关。

将物理网卡接口设备挂靠 Bridge

$ brctl addif br0 eth0
# or
$ sudo ip link set dev eth0 master br0      

NOTE:物理网卡设备接口挂靠到 Bridge 之后,物理网卡设备的 IP 地址就会无效。所以再执行此处操作的时候,要注意 SSH 的网络连通性。

将 eth0 加入 br0 的效果与加入 veth0 是一样的,Bridge 不区分物理或网络设备,物理网卡设备从外部网络接收到的数据包都会直接转发给 br0。

另外,由于 eth0 的 IP 已经无效了,但原先的 Routes 依旧存在,会影响 TCP/IP 的路由选择。通常的,需要手动的进行配置,删除 eth0 的路由规则,增加 bridge 的路由规则。

# 错误的路由规则
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.3.1     0.0.0.0         UG    0      0        0 eth0

# 删除旧的默认网关(系统自动为网卡 eth0 生成的,也会自动删除)
$ ip addr del 192.168.3.21/24 dev eth0

# 添加新的默认网关(设备缺省为 br0)
$ ip route add default via 192.168.3.1 dev br0

# 正确的路由规则
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.3.1     0.0.0.0         UG    0      0        0 br0      

此时网络拓扑如下:

+----------------------------------------------------------------+
|                                                                |
|       +------------------------------------------------+       |
|       |             Newwork Protocol Stack             |       |
|       +------------------------------------------------+       |
|                         ↑                           ↑          |
|.........................|...........................|..........|
|                         ↓                           ↓          |
|        +------+     +--------+     +-------+    +-------+      |
|        |      |     | .3.101 |     |       |    | .3.102|      |
|        +------+     +--------+     +-------+    +-------+      |
|        | eth0 |<--->|   br0  |<--->| veth0 |    | veth1 |      |
|        +------+     +--------+     +-------+    +-------+      |
|            ↑                           ↑            ↑          |
|            |                           |            |          |
|            |                           +------------+          |
|            |                                                   |
+------------|---------------------------------------------------+
             ↓
     Physical Network      

真的此时的拓扑,需要注意:

  1. eth0 要启用混杂模式,不根据自身的 MAC 地址过滤数据帧,即:转发所有数据帧。
$ ifconfig eth0 0.0.0.0 promisc      
  1. 由于 Linux 下的 ARP 特性,当 TCP/IP Stack 转发外部网络的 ARP request 时,不管路由给 101 还是 102,都会得到两个 ARP reply,分别包含 br0 和 veth1 的 MAC 地址。这是因为 Linux 觉得从外部网络接收到的 101 和 102 数据包无论是从 br0 还是 veth1 进入 TCP/IP Stack 都是一样的。不过,由于回复了两个 arp reply,而外部网络的设备只会随机的用到其中的一个,所以外部网络发送给 102 的数据包可能会从 101 的 br0 上进来,反之亦然。说明数据流在 Bridge 并没有完全的隔离开,br0 和 veth1 会收到对方的 IP 应答包。为了解决上述问题,可以配置 rp_filter、arp_filter、arp_ignore、arp_announce 等参数,但会比较复杂。所以,一般不建议同一个 Bridge 上有多个端口接入到 Linux Kernel TCP/IP Stack,而是应该使用 Network Namespace 进行 TCP/IP Stack 的隔离(veth pair 的两端处于不同的 Namespace)。上述只是用于说明的测试拓扑。
  2. 在无线网络环境中,情况会变得比较复杂,因为无线网络需要登录,登陆后无线路由器只认一个 MAC 地址。所有,从这台机器出去的 MAC 地址都必须是那一个,于是通过无线网卡上网的机器上的所有 VMs 想要上网的话,都必须依赖虚拟机管理软件(e.g. VirtualBox)将每个虚拟机的网卡 MAC 地址转成同一个出口的 MAC 地址(即:无线网卡的 MAC 地址),数据包回来的时候还要转回来。所以,如果一个 IP 有两个 ARP replay 的话,有可能导致 MAC 地址的转换有问题,导致网络不通,或者有时通有时不通。解决办法就是将连接进 br0 的所有设备的 MAC 地址都改成和 eth0 一样的 MAC 地址,因为 eth0 的 MAC 地址会被虚拟机正常的做转换。
$ ip link set dev veth1 down

# 08:00:27:3b:0d:b9 是 eth0 的 MAC 地址。
$ ip link set dev veth1 address 08:00:27:3b:0d:b9
$ sudo ip link set dev veth1 up      

Linux Bridge 与虚拟机

Linux 上的 KVM 虚拟机通过虚拟网卡设备(e.g. tap、tun)将虚拟机与 Bridge 连接起来,达到与真实交换机一样的网络拓扑模型。虚拟机发出的数据包先到 br0 然后再由 br0 交给 eth0 并发送到外部网络。整个过程数据包都不需要经过宿主机的网络协议栈,效率高。

+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
|                          Host                                  |              VirtualMachine1            |              VirtualMachine2            |
|                                                                |                                         |                                         |
|       +------------------------------------------------+       |       +-------------------------+       |       +-------------------------+       |
|       |             Newwork Protocol Stack             |       |       |  Newwork Protocol Stack |       |       |  Newwork Protocol Stack |       |
|       +------------------------------------------------+       |       +-------------------------+       |       +-------------------------+       |
|                          ↑                                     |                   ↑                     |                    ↑                    |
|..........................|.....................................|...................|.....................|....................|....................|
|                          ↓                                     |                   ↓                     |                    ↓                    |
|                     +--------+                                 |               +-------+                 |                +-------+                |
|                     | .3.101 |                                 |               | .3.102|                 |                | .3.103|                |
|        +------+     +--------+     +-------+                   |               +-------+                 |                +-------+                |
|        | eth0 |<--->|   br0  |<--->|tun/tap|                   |               | eth0  |                 |                | eth0  |                |
|        +------+     +--------+     +-------+                   |               +-------+                 |                +-------+                |
|            ↑             ↑             ↑                       |                   ↑                     |                    ↑                    |
|            |             |             +-------------------------------------------+                     |                    |                    |
|            |             ↓                                     |                                         |                    |                    |
|            |         +-------+                                 |                                         |                    |                    |
|            |         |tun/tap|                                 |                                         |                    |                    |
|            |         +-------+                                 |                                         |                    |                    |
|            |             ↑                                     |                                         |                    |                    |
|            |             +-------------------------------------------------------------------------------|--------------------+                    |
|            |                                                   |                                         |                                         |
|            |                                                   |                                         |                                         |
|            |                                                   |                                         |                                         |
+------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+
             ↓
     Physical Network  (192.168.3.0/24)      
Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)的基本操作

Linux Bridge 与容器

容器运行在自己单独的 network namespace 里,有着自己单独的协议栈,整体上的网络拓扑与虚拟机的情况差不多,但容器采用了另一种方式来和外界通信。

容器中配置网关为 .9.1,发送的数据包先到达 br0 然后再交给宿主机的协议栈,由于目的 IP 是外网 IP,且宿主机开启了 IP forward(路由转发)功能,于是数据包就会通过 eth0 发送出去。由于 .9.1 是内网 IP,所以一般发出去之前会先做 NAT(网络地址转换)。显然 “容器+Bridge” 的性能没有 “虚拟机+Bridge” 的好,不过优点是容器处于内网中,安全性相对要高点。(由于数据包统一由 IP 层从 eth0 转发出去,所以不存在上文提到的多个 MAC 地址应答的问题)

+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
|                          Host                                  |              Container 1                |              Container 2                |
|                                                                |                                         |                                         |
|       +------------------------------------------------+       |       +-------------------------+       |       +-------------------------+       |
|       |             Newwork Protocol Stack             |       |       |  Newwork Protocol Stack |       |       |  Newwork Protocol Stack |       |
|       +------------------------------------------------+       |       +-------------------------+       |       +-------------------------+       |
|            ↑             ↑                                     |                   ↑                     |                    ↑                    |
|............|.............|.....................................|...................|.....................|....................|....................|
|            ↓             ↓                                     |                   ↓                     |                    ↓                    |
|        +------+     +--------+                                 |               +-------+                 |                +-------+                |
|        |.3.101|     |  .9.1  |                                 |               |  .9.2 |                 |                |  .9.3 |                |
|        +------+     +--------+     +-------+                   |               +-------+                 |                +-------+                |
|        | eth0 |     |   br0  |<--->|  veth |                   |               | eth0  |                 |                | eth0  |                |
|        +------+     +--------+     +-------+                   |               +-------+                 |                +-------+                |
|            ↑             ↑             ↑                       |                   ↑                     |                    ↑                    |
|            |             |             +-------------------------------------------+                     |                    |                    |
|            |             ↓                                     |                                         |                    |                    |
|            |         +-------+                                 |                                         |                    |                    |
|            |         |  veth |                                 |                                         |                    |                    |
|            |         +-------+                                 |                                         |                    |                    |
|            |             ↑                                     |                                         |                    |                    |
|            |             +-------------------------------------------------------------------------------|--------------------+                    |
|            |                                                   |                                         |                                         |
|            |                                                   |                                         |                                         |
|            |                                                   |                                         |                                         |
+------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+
             ↓
     Physical Network  (192.168.3.0/24)      
Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)的基本操作

Linux Bridge 的 MAC 地址行为

# 创建 bridge,查看默认 MAC
$ ip link add br-mac type bridge
20: br-mac: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether f6:b0:c9:7c:04:1d brd ff:ff:ff:ff:ff:ff
    
# 创建 veth pair 设备 
$ ip link add mac-veth01 type veth peer name mac-veth02
20: br-mac: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether f6:b0:c9:7c:04:1d brd ff:ff:ff:ff:ff:ff
21: mac-veth02: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 92:a2:23:d5:88:56 brd ff:ff:ff:ff:ff:ff
22: mac-veth01: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:50 brd ff:ff:ff:ff:ff:ff

# attach mac-veth01(大 MAC)
$ ip link set dev mac-veth01 master br-mac
20: br-mac: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether de:ee:ff:8d:0c:50(自动变为mac-veth01的mac) brd ff:ff:ff:ff:ff:ff
21: mac-veth02: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 92:a2:23:d5:88:56 brd ff:ff:ff:ff:ff:ff
22: mac-veth01: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:50 brd ff:ff:ff:ff:ff:ff

# attach mac-veth02(小 MAC)
$ ip link set dev mac-veth02 master br-mac
20: br-mac: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether 92:a2:23:d5:88:56(变化为小mac,mac-veth02的mac) brd ff:ff:ff:ff:ff:ff
21: mac-veth02: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether 92:a2:23:d5:88:56 brd ff:ff:ff:ff:ff:ff
22: mac-veth01: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:50 brd ff:ff:ff:ff:ff:ff

# 增加 mac-veth02 的 MAC
$ ifconfig mac-veth02 hw ether de:ee:ff:8d:0c:51
20: br-mac: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether de:ee:ff:8d:0c:50(变化为小mac,mac-veth01的mac) brd ff:ff:ff:ff:ff:ff
21: mac-veth02: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:51 brd ff:ff:ff:ff:ff:ff
22: mac-veth01: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:50 brd ff:ff:ff:ff:ff:ff
    
# 更改 br-mac 的 MAC(大 MAC)
$ ifconfig br-mac hw ether de:ee:ff:8d:0c:52
20: br-mac: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether de:ee:ff:8d:0c:52(变化为指定的mac) brd ff:ff:ff:ff:ff:ff
21: mac-veth02: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:51 brd ff:ff:ff:ff:ff:ff
22: mac-veth01: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:50 brd ff:ff:ff:ff:ff:ff

# 设置 br-mac same as mac-veth01,mac-veth02 MAC 减小
$ ifconfig br-mac hw ether de:ee:ff:8d:0c:50
$ ifconfig mac-veth02 hw ether de:ee:ff:8d:0c:49
20: br-mac: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether de:ee:ff:8d:0c:50(和设置的 mac 一样,不变) brd ff:ff:ff:ff:ff:ff
21: mac-veth02: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:49 brd ff:ff:ff:ff:ff:ff
22: mac-veth01: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:50 brd ff:ff:ff:ff:ff:ff

# 增加 mac-veth01 的 mac
$ ifconfig mac-veth01 hw ether de:ee:ff:8d:0c:51
20: br-mac: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether de:ee:ff:8d:0c:50(mac 不变) brd ff:ff:ff:ff:ff:ff
21: mac-veth02: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:49 brd ff:ff:ff:ff:ff:ff
22: mac-veth01: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:51 brd ff:ff:ff:ff:ff:ff
    
# 增加新的设备
$ ip link add mac-veth03 type veth peer name mac-veth04
20: br-mac: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether de:ee:ff:8d:0c:50 brd ff:ff:ff:ff:ff:ff
21: mac-veth02: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:49 brd ff:ff:ff:ff:ff:ff
22: mac-veth01: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:51 brd ff:ff:ff:ff:ff:ff
23: mac-veth04: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 46:62:dd:cd:4f:41 brd ff:ff:ff:ff:ff:ff
24: mac-veth03: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c6:3f:65:95:e0:93 brd ff:ff:ff:ff:ff:ff
    
# attach mac-veth04(小 mac)
$ brctl addif br-mac mac-veth04
20: br-mac: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether de:ee:ff:8d:0c:50(不变) brd ff:ff:ff:ff:ff:ff
21: mac-veth02: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:49 brd ff:ff:ff:ff:ff:ff
22: mac-veth01: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether de:ee:ff:8d:0c:51 brd ff:ff:ff:ff:ff:ff
23: mac-veth04: <BROADCAST,MULTICAST> mtu 1500 qdisc noop master br-mac state DOWN group default qlen 1000
    link/ether 46:62:dd:cd:4f:41 brd ff:ff:ff:ff:ff:ff
24: mac-veth03: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c6:3f:65:95:e0:93 brd ff:ff:ff:ff:ff:ff      

​结论​:br0 如果没有指定 hw MAC,br0 的 MAC 地址会根据 bridge 中 port 的变化,自动选择 port 中最小的一个 MAC 地址作为 br0 的 MAC 地址。br0 只能指定 port 中有的 interface 的 MAC 作为 br0 的 MAC 地址。

Linux Bridge 常用指令

help:

$ 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      
# 创建网桥
brctl addbr br-test 
# 为网桥添加物理接口
brctl addif br-test enp4s0 
# 删除网桥
brctl delbr br-test 
# 删除网桥接口
brctl delif br-test enp4s0 
# 显示网桥列表信息
brctl show 
# 显示网桥br-test的信息
brctl show br-test 
# 显示网桥的MAC地址信息
brctl showmacs br-test 
# 显示网桥的stp信息
brctl showstp br-test 
# 开|关 STP 生成树,关闭可以减少数据包污染
brctl stp br-test on|off 
# 为网络设备开启混杂模式
ifconfig eth0 0.0.0.0 promisc      

继续阅读