Linux bridge及其配置
1. Linux下Bridge原理
1.1 Linux Bridge配置
Kernel要支持Bridge功能,需要打开802.1d Ethernet Bridging:
Networking support ->Networking options
->802.1d Ethernet Bridging
1.2 Linux Bridge原理
OSI七层模型,说明以及每层的常见协议:
OSI模型和Linux下TCP/IP协议对应关系如下:
应用层:应用层是TCP/IP协议的第一层,是直接为应用进程提供服务的。对不同种类的应用程序它们会根据自己的需要来使用应用层的不同协议,邮件传输应用使用了SMTP协议、万维网应用使用了HTTP协议、远程登录服务应用使用了有TELNET协议。应用层还能加密、解密、格式化数据。应用层可以建立或解除与其他节点的联系,这样可以充分节省网络资源。
运输层:作为TCP/IP协议的第二层,运输层在整个TCP/IP协议中起到了中流砥柱的作用。且在运输层中,TCP和UDP也同样起到了中流砥柱的作用
网络层:网络层在TCP/IP协议中的位于第三层。在TCP/IP协议中网络层可以进行网络连接的建立和终止以及IP地址的寻找等功能
网络接口层:在TCP/IP协议中,网络接口层位于第四层。由于网络接口层兼并了物理层和数据链路层所以,网络接口层既是传输数据的物理媒介,也可以为网络层提供一条准确无误的线路
Bridge工作在OSI的二层(即数据链路层)设备。根据MAC地址转发数据包。为Bridge配置IP地址后,也可工作在三层网络,工作原理类似于三层交换机。Bridge一端连接着内核协议栈,另一端可以连接多个网络设备。
创建一个bridge后(br0),可以把其他的网络设备(比如eth0)attach到br0上,eth0称作br0的从设备。需要注意的是,eth0 attach到br0上,不是对应的将eth0插接到“交换机”br0上,而是eth0变成了br0的一个端口(网线插口)。
从设备(eth0)被attach到br上之后,它的IP及MAC都不再可用了(退化为一个端口了)且它们被设置为接收任何包(工作在链路层,且是混杂模式,不需要ip),最终由bridge设备来决定数据包的去向:接收到本机、转发、丢弃。
STP(Spanning Tree Protocol)是一种工作在OSI网络模型中的第二层(数据链路层)的通信协议,基本应用是防止交换机冗余链路产生的环路。用于确保以太网中无环路的逻辑拓扑结构。从而避免了广播风暴,大量占用交换机的资源。
FDB(Forwarding Database)用于保存二层设备中MAC地址和端口的关联关系,就像交换机中的MAC地址表一样。
MDB(Multicast group database)用于保存IP或L2组播地址表。
更多参考《linux网桥简单理解和持久化配置》
1.3 代码分析
br_init()是网桥模块的初始化入口:
br_init
->stp_proto_register--STP(Spanning Tree Protocol)
->br_fdb_init--创建bridge_fdb_cache缓存。
->register_pernet_subsys--注册一个创建network namespace子系统的函数。
->br_nf_core_init
->register_netdevice_notifier--注册网络事件到netdev_chain的通知回调函数br_device_notifier。
->register_switchdev_notifier--注册到switchdev_notif_chain的通知回调函数br_switchdev_notifier。
->br_netlink_init
->br_mdb_init
->rtnl_af_register--注册bridge Router Netlink的Address Family的操作函数br_af_ops。
->rtnl_link_register--注册bridge Router Netlink的link操作函数br_link_ops。
->brioctl_set--设置br_ioctl_hook为br_ioctl_deviceless_stub。
待完善,更多参考《浅析linux内核网络协议栈--linux bridge(一)》。
2 Linux Bridge配置工具
2.1 以太网桥管理工具:brctl
在Buildroot中打开brctl:
Target packages
->Network applications
->bridge-utils
brctl配置网桥
addbr <bridge>--添加一个网桥。 delbr <bridge>--删除一个网桥。 addif <bridge> <device>--将一个网络接口加入到网桥中。 delif <bridge> <device>--将一个网络接口从网桥中删除。 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>--显示网桥的STP信息。 stp <bridge> {on|off}--设置网桥是否参与STP。
2.2 iproute2: ip link和bridge
在Buildroot中打开iproute2:
Target packages ->Networking applications ->iproute2
ip用于显示或管理Linux网络的路由、网络设备、网络接口和隧道。
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help } ip [ -force ] -batch filename where OBJECT := { address | addrlabel | amt | fou | help | ila | ioam | l2tp | link | macsec | maddress | monitor | mptcp | mroute | mrule | neighbor | neighbour | netconf | netns | nexthop | ntable | ntbl | route | rule | sr | tap | tcpmetrics | token | tunnel | tuntap | vrf | xfrm } OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | -h[uman-readable] | -iec | -j[son] | -p[retty] | -f[amily] { inet | inet6 | mpls | bridge | link } | -4 | -6 | -M | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -br[ief] | -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] | -rc[vbuf] [size] | -n[etns] name | -N[umeric] | -a[ll] | -c[olor]}
关于ip详细使用说明参考《ip(8) - Linux manual page》。
bridge用于显示或管理网桥的连接、FDB/MDB/VLAN,以及对设备和地址的监控功能。
Usage: bridge [ OPTIONS ] OBJECT { COMMAND | help } bridge [ -force ] -batch filename where OBJECT := { link | fdb | mdb | vlan | monitor } OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -o[neline] | -t[imestamp] | -n[etns] name | -c[ompressvlans] -color -p[retty] -j[son] }
关于bridge的详细使用说明参考《bridge(8) - Linux manual page》。
《An introduction to Linux bridging commands and features》:介绍了网桥处理的两个命令ip和bridge,以及对STP、VLAN filter、VLAN tunnel mapping、Multicast、Switchdev、Netfilter、Ageing time等配置。
《Introduction to Linux interfaces for virtual networking》:介绍了Bridge的使用,以及其他Linux下虚拟网络。包括Bonded interface,Team interface,VLAN,VXLAN,IPVLAN等等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义