目录
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 相连之后,发生了几个变化:
veth0 与 veth1 相连(类似网线的两端)。
veth0 和 veth1 都与网络协议栈相连(具有 IP 地址)。
veth0 与 br0 相连,其一端被插入到 br0 中。两者是双向通道。
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 发送数据。
+----------------------------------------------------------------+
| |
| +------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------------------------------+ |
| ↑ ↑ | ↑ |
|............|............|..............|............|..........|
| ↓ ↓ ↓ ↓ |
| +------+ +--------+ +-------+ +-------+ |
| | .3.21| | | | .3.101| | .3.102| |
| +------+ +--------+ +-------+ +-------+ |
| | eth0 | | br0 |<--->| veth0 | | veth1 | |
| +------+ +--------+ +-------+ +-------+ |
| ↑ ↑ ↑ |
| | | | |
| | +------------+ |
| | |
+------------|---------------------------------------------------+
↓
Physical Network
br0 和 veth0 相连之后,发生了几个变化:
- veth0 与 veth1 相连(类似网线的两端)。
- veth0 和 veth1 都与网络协议栈相连(具有 IP 地址)。
- veth0 与 br0 相连,其一端被插入到 br0 中。两者是双向通道。
- 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
2.由于 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)。上述只是用于说明的测试拓扑。
3.在无线网络环境中,情况会变得比较复杂,因为无线网络需要登录,登陆后无线路由器只认一个 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 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 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 常用指令
$ 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