linux网桥如何发包
linux网桥如何发包详细介绍
在 Linux 中,网桥(Bridge)作为二层网络设备,用于在多个网络接口之间转发以太网帧。以下是 Linux 网桥处理数据包(发包)的核心机制和过程:
一、网桥的基本结构与工作原理
- 网桥设备
网桥(如br0)是一个虚拟二层设备,可绑定多个物理接口(如eth0、eth1)或虚拟接口(如veth)。每个接口称为网桥的一个 端口。 - 核心功能
- MAC 地址学习:记录端口收到的帧的源 MAC 地址,建立 “MAC 地址→端口” 的映射表(转发表)。
- 帧转发 / 过滤:根据目的 MAC 地址决定是否转发帧,以及从哪个端口转发。
- 环路避免(可选):通过生成树协议(STP/RSTP)避免二层环路。
二、网桥发包(转发帧)的具体过程
当一个以太网帧到达网桥的某个端口时,网桥按以下步骤处理:
1.
接收帧并解析头部
网桥从某个端口(如 eth0)接收帧,提取 源 MAC 地址(SMAC) 和 目的 MAC 地址(DMAC)。
2.
学习源 MAC 地址
- 检查转发表中是否已有源 MAC 地址对应的端口:
- 若没有,将
SMAC→接收端口的映射记录到转发表(老化时间默认约 5 分钟)。 - 若已有,但端口不同(如接口故障后更换),更新端口映射。
- 若没有,将
3.
决策是否转发及转发端口
- 若目的 MAC 是广播 / 多播地址:
向除接收端口外的所有其他端口洪泛(Flood)该帧。 - 若目的 MAC 是单播地址:
- 查找转发表中是否有
DMAC对应的端口:- 存在:将帧从对应的端口转发(单播转发)。
- 不存在:向除接收端口外的所有其他端口洪泛(未知单播洪泛)。
- 查找转发表中是否有
4.
处理特殊情况
- 同一端口接收和转发:若目的 MAC 对应的端口是接收端口(如帧来自本地主机发往自身),网桥直接丢弃该帧(避免环路)。
- 生成树协议(STP):若启用 STP,处于阻塞状态的端口不会转发帧,避免环路。
三、Linux 网桥的实现与工具
- 内核模块
网桥功能由内核模块bridge.ko实现,通过br_netfilter模块支持二层包过滤(需配合iptables或nftables)。 - 配置工具
- 传统工具:
brctl(如brctl addbr br0创建网桥,brctl addif br0 eth0添加接口)。 - 现代工具:
ip link(如ip link add br0 type bridge,ip link set eth0 master br0)。
- 传统工具:
- 抓包验证
使用tcpdump在网桥或接口上抓包,观察帧的转发路径:
bashtcpdump br0tcpdump eth0
四、示例:两台主机通过网桥通信
假设:
- 网桥
br0绑定接口eth0(连接主机 A,MAC:00:01:02:03:04:05)和eth1(连接主机 B,MAC:00:06:07:08:09:0a)。
- 主机 A 发送帧到主机 B
- 帧到达
eth0,网桥学习到00:01:02:03:04:05→eth0。 - 目的 MAC 是
00:06:07:08:09:0a,转发表中无记录,洪泛到eth1。 - 主机 B 接收帧,网桥学习到
00:06:07:08:09:0a→eth1。
- 帧到达
- 主机 B 回复主机 A
- 帧到达
eth1,网桥查找转发表,发现00:01:02:03:04:05→eth0,直接从eth0转发(不再洪泛)。
- 帧到达
五、关键特性总结
- 二层透明性:网桥对上层协议(如 IP)透明,仅处理以太网帧。
- 无状态转发:转发决策仅基于 MAC 地址,不涉及 IP 层逻辑。
- 性能优化:通过 MAC 地址学习减少洪泛,提升转发效率。
如需进一步调试或配置网桥,可结合 bridge link、bridge fdb(查看转发表)等命令分析状态。