linux bridge

linux bridge处理原理

进入桥的数据报文分为几个类型,桥对应的处理方法也不同:
1. 报文是本机发送给自己的,桥不处理,交给上层协议栈;
2. 接收报文的物理接口不是网桥接口,桥不处理,交给上层协议栈;
3. 进入网桥后,如果网桥的状态为Disable,则将包丢弃不处理;
4. 报文源地址无效(广播,多播,以及00:00:00:00:00:00),丢包;
5. 如果是STP的BPDU包,进入STP处理,处理后不再转发,也不再交给上层协议栈;
6. 如果是发给本机的报文,桥直接返回,交给上层协议栈,不转发;
7. 需要转发的报文分三种情况:
1) 广播或多播,则除接收端口外的所有端口都需要转发一份;
2) 单播并且在CAM表中能找到端口映射的,只需要网映射端口转发一份即可;
3) 单播但找不到端口映射的,则除了接收端口外其余端口都需要转发;
(1) bridge 网络帧,如果帧的目的 MAC 地址是在桥的另一侧的某个网络设备上。
(2) 泛洪该网络帧,如果帧的目的 MAC 对网桥是不认识的。
(3) 转到更高一层的三层IP协议栈代码处理,如果帧的目的地址是桥本身的或者它的某个端口的。
忽略它,如果帧的目的地址是位于它来自的桥的方向的同一侧。

对 (1)和 (2)来说,接下来该数据帧被 filter 的 FORWARD 链处理。对(3)来说,它会被 filter 的 INPUT 链处理。发生这种情况时,该 bridge 其实是被用作一个路由器(一个对比例子是现实世界中的带路由的交换机设备)。包含 IP 包的以太帧的目的 MAC 地址是桥的MAC地址,但是目的 IP 地址不是桥的IP地址。

iptable linux bridge网络包匹配条件

x1.png

使用举例

实验环境

x.png

实验脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
brctl addbr br0 
ifconfig br0 1.1.2.254/24 up
ip addr add 1.1.1.254/24 dev br0

ip link add net0_eth0 type veth peer name tap0
ip netns add net0
ip link set dev net0_eth0 netns net0
ip netns exec net0 ip link set dev net0_eth0 name eth0
ip netns exec net0 ip addr add 1.1.1.1/24 dev eth0
ip netns exec net0 ip link set dev eth0 up
ip link set dev tap0 master br0
ip link set dev tap0 up


ip link add net1_eth0 type veth peer name tap1
ip netns add net1
ip link set dev net1_eth0 netns net1
ip netns exec net1 ip link set dev net1_eth0 name eth0
ip netns exec net1 ip addr add 1.1.1.2/24 dev eth0
ip netns exec net1 ip link set dev eth0 up
ip link set dev tap1 master br0
ip link set dev tap1 up

匹配linux网络数据包

1
2
3
4
iptables -A INPUT -p icmp -m physdev --physdev-in tap0 -j LOG
iptables -A FORWARD -p icmp -m physdev --physdev-in tap0 --physdev-out tap1 -j LOG
iptables -A FORWARD -p icmp -m physdev --physdev-is-out
iptables -A FORWARD -p icmp -m physdev --physdev-is-out --physdev-is-in --physdev-is-bridged

查看数据包

1
2
3
4
5
6
7
8
9
10
11
12
Chain INPUT (policy ACCEPT 122 packets, 8044 bytes)
pkts bytes target prot opt in out source destination
5 420 LOG icmp -- * * 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-in tap0 LOG flags 0 level 4

Chain FORWARD (policy ACCEPT 12 packets, 1008 bytes)
pkts bytes target prot opt in out source destination
6 504 LOG icmp -- * * 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-in tap0 --physdev-out tap1 LOG flags 0 level 4
12 1008 icmp -- * * 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-is-out
12 1008 icmp -- * * 0.0.0.0/0 0.0.0.0/0 PHYSDEV match --physdev-is-in --physdev-is-out --physdev-is-bridged

Chain OUTPUT (policy ACCEPT 85 packets, 20092 bytes)
pkts bytes target prot opt in out source destination