在上一章 Linux bridge 泛洪 中介绍了 Linux bridge 强制泛洪的原理,接下来抓一下 bridge 泛洪出来的网络包。

环境准备

学习了 docker网络之namespacedocker网络之veth设备docker网络之网桥 等知识之后,在一台 Linux 虚拟机中部署如下网络环境:

Linux bridge

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 准备 namespace client
ip netns add nsclient
ip link add vci type veth peer name vco
ip link set vci netns nsclient
ip netns exec nsclient bash -c "
ip link set dev vci up
ip addr add 10.0.0.2/24 dev vci
ip route add default via 10.0.0.1 dev vci
"

# 准备 namespace server
ip netns add nsserver
ip link add vsi type veth peer name vso
ip link set vsi netns nsserver
ip netns exec nsserver bash -c "
ip link set dev vsi up
ip addr add 10.0.0.1/24 dev vsi
ip route add default via 10.0.0.2 dev vsi
"

# 准备 namespace pcap,用于抓包
ip netns add nspcap
ip link add vpi type veth peer name vpo
ip link set vpi netns nspcap
ip netns exec nspcap bash -c "
ip link set dev vpi up
"

# 准备 bridge br0
# brctl 管理,需要安装 bridge-utils
brctl addbr br0
brctl addif br0 vco
brctl addif br0 vso
brctl addif br0 vpo
ip link set dev vco up
ip link set dev vso up
ip link set dev vpo up
ip link set dev br0 up
# brctl setageing br0 0 # 强制泛洪,稍后再开启

注意: 如果该环境中已经运行 docker,则需要执行命令 iptables -t filter -I FORWARD -i br0 -o br0 -j ACCEPT ,使得 br0 的流量不受 docker 的影响。

未开启强制泛洪

开启几个终端窗口:namespace client, namespace server, namespace pcap, bridge br0 各一个窗口。

进入 namespace 的命令:ip netns exec ${ns name} bash

比如进入 namespace client:ip netns exec nsclient bash

ping

在 namespace client 中 ping namespace server 的 IP。

ping without flood

namespace pcap 抓包结果:

pcap without flood

http server

在 namespace server 中拉起一个 http server,然后在 namespace client 中访问该 http server。

curl without flood

namespace pcap 抓包结果:

pcap with flood

开启强制泛洪

在 bridge br0 窗口中执行命令 brctl setageing br0 0,再次试验 ping 和 http server。

ping 的抓包结果:

ping with flood

http server 的抓包结果:

curl with flood

总结

在网络设备上做流量镜像时,bridge 的强制泛洪实现了网卡级别的流量镜像效果。