LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

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。
复制代码

networking:bridge

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等等。

posted on   ArnoldLu  阅读(1359)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示