利用Linux bridge泛洪做流量审计与分析
1、Linux bridge泛洪
在 Linux 中,bridge 是虚拟的二层网络设备。不同于 eth 或 ens 等真实的网络设备,bridge 能够让同一 Linux 系统内的其他网络设备连接起来;比如 docker 默认的网络模型就是利用 bridge 将各个实例的网络打通,如图:
2、强制泛洪
在 brctl 的 manual 中有一段描述:
brctl setageing <brname> <time> sets the ethernet (MAC) address
ageing time, in seconds. After <time> seconds of not having seen
a frame coming from a certain address, the bridge will time out
(delete) that address from the Forwarding DataBase (fdb).
bridge 会维持一张 mac 地址表,叫 fdb。Linux 内核会为该 bridge 维持一个 gc 定时器,该定时器会定时去清理失效的 fdb 记录;该定时器默认的间隔为 300s;可以通过命令 brctl showstp docker0 看到:
brctl showstp docker0
docker0
bridge id 8000.0242d4005155
designated root 8000.0242d4005155
...
ageing time 300.00
...
veth4f17ef9 (1)
...
当这个 ageing time 设置为 0,会发生什么呢?
答案:强制泛洪效果
当一个网络包经过 bridge 而 bridge 在其 fdb 中找不到对应记录,即 bridge 不确定该网络包该通过那个网口发出去时,bridge 会将该网络包通过除收包网口外的其他所有网口发出去,俗称泛洪。 当将 ageing time 设置为 0 时, 意即 bridge 无需维持 fdb ,每当收到一个网络包,都将这个网络包泛洪出去。
3、利用Linux bridge泛洪做流量审计与分析
实验拓扑:
步骤:
# 准备 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
未开启强制泛洪时:
开启强制泛洪时:
在 bridge br0 窗口中执行命令 brctl setageing br0 0,再次试验 ping 和 http server。
总结
在网络设备上做流量镜像时,bridge 的强制泛洪实现了网卡级别的流量镜像效果。