最近接触到交换机产品,正好借机会学习下二层相关网络技术。之前一直想写点东西,又懒得写。这次乘机会多写点,记录下,也算是对学习的一个交代。另自己是初学者,也希望能和前辈多交流。有写的不对的地方,希望前辈们不吝赐教。

        先用到的是交换机的模拟器,运行在Ubuntu虚拟机上。通过linux网桥实现每个模拟器的接口互联,并根据TOPO配置虚拟网络环境。这里主要介绍下网桥的基本知识,以及linux网桥的相关配置。linux通过brctl创建的网桥(bridge)和传统意义的网桥在理解上存在一定的偏差。

1 网桥的基本知识

1.1 网桥的背景

        以太网的发展历程基本上可以被看做在一种先天缺欠的结构上修修补补的过程。为了缓解前述的冲突问题,提高网络的可扩展性,人们想到将网络分段。这种思想很简单,如果一条总线上有40 台主机,它们冲突的概率是80%,那么我就将其分割成两条总线,这样每条总线将只包含20台主机,冲突概率是40%,依此类推。

        但是简单地将总线分割,会丧失连通性。需要的是在保持网络连通性的同时,将冲突域减小。要达到这个目的就要在网络中引入一种特殊的设备,这种设备有一个形象的名字——网桥(Bridge)。

1.2 网桥的概念

        网桥是根据物理地址过滤和转发数据包的连接设备,它工作于OSI 模型的数据链路层(对应于TCP/IP 网络的网络访问层)。

        网桥监听它所连接的每个网段,建立一个表来反映物理地址位于哪个网段。当数据在网桥会查看数据的目标地址,与路由表进行比较。如果目标地址属于一个网段上传输时,发送数据的网段,网桥就忽略这个数据。如果目标地址在不同的网段,网桥就把数据转发到适当的网段。如果目标地址不在路由表里,网桥就会把数据转发到除源网段之外的全部网段。

         

         通俗点解释,网桥将网络划分为网段A和网段B两个总线型网络。当网段A中的主机A1要向主机A2发送数据时,由于主机A2并不在网段B中,网桥会将这一数据阻断在网段A中,网段B中的主机这时不会发现总线被占用,反之亦然。这就相当于将原先的大冲突域分割成了A、B两个小冲突域,有效地降低了冲突概率。与此同时,如果网段A中的主机A1要向网段B中的主机B1发送数据,由于总线并没有硬性地被剪断,网桥完全可以将数据转发到网段B,主机B1仍然可以收到来自网段A的数据,反之亦然。这就是所谓的“有机”隔离。

        网桥能够做到“有机”隔离的关键在于其使用的“存储/转发(Store andForward)”算法。由于网桥同时处于网段A和网段B,所以网桥可以接收到全网数据。当网桥接收到数据时先将数据存储在内存中进行分析,如果数据的目的地址不在本网段,网桥会将该数据转发到另一网段。网桥存储/转发算法的依据是数据的MAC地址,所以网桥是工作在数据链路层的网络设备。

        网桥的这种工作机制有利于广播数据在全网的扩散。广播数据的目的MAC地址是全F,网桥会无条件转发,广播数据全网扩散。因此,网桥可以有效地隔离冲突域,但无法隔离广播域。

1.3 网桥工作原理

        上图中分为3个LAN,每个LAN都有2台设备。网桥的每个端口都对应一个冲突域,可以将LAN1-1、LAN1-2和bridge1连接LAN1的接口视为一个冲突域。

        首先需要了解的是,冲突域内任意一个设备发送消息,其它的设备都可以收到对应的消息帧。

        假设Bridge 1和Bridge 2的转发表都是空的初始化状态,以从设备LAN1-1到LAN3-1为例,理解网桥的“存储/转发”算法。

                1. 当LAN1-1发送消息时,冲突域内都会收到,所以Bridge 1必然会收到H1发送的帧;

                2.Bridge 1查找转发表,发现并没有LAN1-1的表项,记录LAN1-1的MAC表项是从端口一学习到的;

                3.Bridge 1查找转发表,发现并没有LAN3-1的表项,那么将该数据帧发往其它的冲突域;

                4.此时LAN2-1、LAN2-2和Bridge 2的左边端口都会收到该数据帧,LAN2-1和LAN2-2发现这不是给自己的数据,会丢掉;

                5.Bridge 2查找转发表,发现并没有LAN1-1的表项,记录LAN1-1的MAC表项是从左边端口一学习到的;

                6.Bridge 2查找转发表,发现并没有LAN3-1的表项,那么将该数据帧发往其它的冲突域;

                7.此时LAN3-1、LAN3-2收到该数据帧,LAN3-2丢掉数据;LAN3-1发现是发给自己的包,就会处理该数据帧。

        这个过程较好理解,网桥存储/转发的流程都很清晰。

        这里还有一个问题,比如,Bridge 1连接着局域网LAN 1和LAN 2。如果设备LAN1-1与设备LAN2-1通信。LAN1-1发送消息给Bridge 1,Bridge 1发现目标地址和原地址不属于一个局域网(或者没找到目标表项),那么就进行转发功能。如果LAN1-1给LAN1-1发送消息,网桥发现原地址和目的地址属于同一个局域网,这时候网桥怎么处理呢?

        这里涉及到一个非常重要的概念,过滤数据库。网桥把知道的地址信息都存在这个过滤数据库里面,每次接收一个目的地址,就和数据库里面的数据进行比对,如果发现和源地址不在一个LAN就进行转发;如果在一个局域网下面就过滤掉这个信息。

        过滤数据库的转发规则是,网桥从A端口接收到一个帧:

                1.搜索数据库确定MAC地址是不是在一个端口port上面;
                2.如果没有找到这个MAC地址,那么把该帧泛洪flooding到所有端口(A除外);
                3.如果找到了MAC地址对应应该发往B端口,那么检查B,如果B不处于阻塞态,那么就 从B端口发送,如果是阻塞态,那么不发送。
                4.如果MAC地址对应的也是A端口,那么不发送,过滤掉这个信息。

        转发和过滤都是网桥的基本功能。

2 理解和配置Linux网桥

2.1 Linux Bridge基本概念

        网桥是一种在链路层实现中继,对帧进行转发的技术,根据MAC分区块,可隔离碰撞,将网络的多个网段在数据​​链路层​​连接起来的网络设备。

        Linux Bridge是一个​​虚拟网络设备​​​,具有网络设备的特性(可以配置IP、MAC地址等)。

        可以看作是一个​​虚拟交换机,与物理交换机工作原理类似。可以有多个端口​​​,数据可以从任何端口进来,进来之后根据​​mac地址判断从哪个口出去​​。

        bridge是​​建立在从设备上​​(物理设备、虚拟设备、vlan设备等,即attach一个从设备,类似于现实世界中的交换机和一个用户终端之间连接了一根网线),并且可以为bridge配置一个IP(参考LinuxBridge MAC地址行为),这样该主机就可以通过这个bridge设备与网络中的其他主机进行通信了。另外它的从设备被虚拟化为端口port,它们的IP及MAC都不在可用,且它们被设置为接受任何包,最终由bridge设备来决定数据包的去向:接收到本机、转发、丢弃、广播。

        bridge是用于连接两个不同网段的常见手段,不同网络段通过bridge连接后就如同在一个网段一样,工作原理很简单就是L2数据链路层进行数据包的转发。

        通过Linux bridge来实现打通容器网络是一个非常有效的方法,可以连接同宿主机内所有容器的虚拟网络。通过bridge将数据转发到真实的往里网卡eth0中将容器内网与外网打通。

        默认情况下 docker 容器的IP 都是 docker0 这个 bridge 下独立网段的虚拟子网。我们可以通过手工配置 bridge 来实现每一个docker 的IP都和宿主机IP在同一个网段。

2.2 Linux Bridge基本配置

        Linux Bridge配置常用brctl命令,配置参数如下:

root@ubuntu:~# brctl 
Usage: brctl [commands]
commands:
        addbr           <bridge>                add bridge
        delbr           <bridge>                delete bridge
        addif           <bridge> <device>       add interface to bridge
        delif           <bridge> <device>       delete interface from bridge
        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>                show bridge stp info
        stp             <bridge> {on|off}       turn stp on/off

        比如,添加接口到Bridge。

root@ubuntu:~# brctl show
bridge name     bridge id               STP enabled     interfaces
lxcbr0          8000.00163e000000       no
root@ubuntu:~# brctl addif lxcbr0 vsbr0
root@ubuntu:~# brctl show
bridge name     bridge id               STP enabled     interfaces
lxcbr0          8000.00163e000000       no              vsbr0

        1、bridge不区分接入进来的是物理设备还是虚拟设备,对于bridge来说都是一样都是网络设备,所以当eth0加入bridge之后,它就和其他veth一样了,从外面网络到eth0收到的数据包将无条件的转发给br0,eth0自己变成一根网线的角色。这时通过eth0 ping网关则失败,由于bridge通过eth0这根网线连接上了外面的物理机,所以只有连接到bridge上的设备才可以ping通网关。br0可以理解为自己有一块自带的网卡。

        2、由于eth0已经变成了和网线差不多的功能,所以在eth0上配置IP已经没有什么意义了,并且还会影响协议栈的路由选择,比如如果上面ping的时候不指定网卡的话,协议栈有可能优先选择eth0,导致ping不通,所以最好将eth0上的IP配置去掉。

        3、当一个设备attach到bridge上时,该设备上原来配置的IP则变为无效,Linux不再使用原来那个IP在三层接受数据。此时应该把原来的IP赋值给bridge设备。

2.3 常用虚拟机网桥配置

2.3.1 单网桥配置模式

        通过lxc容器运行sim1和sim2,分别存在虚拟口mgt-eth。通过tun/tap技术,将mgt-eth接口引入Ubuntu栈。将虚拟出来的接口都添加到同一个网桥lxcbr_mgt,同时将Ubuntu ens33也添加到该网桥。那么对于sim1和sim2的mgt-eth,与Ubuntu ens33相当于同时接入了一个虚拟的交换机lxcbr_mgt。

        这样的好处包括

                1.配置简单,VMNet、lxcbr_mgt、mgt-eth可以配置在同一网段;

                2.效率快,比如,从mgt-eth发出去的包,可以不通过Ubuntu的栈,直接通过网桥发出去。

        但是也存在缺陷,外网直接接入网桥,会导致网桥流量骤增。当BUM流量过多时,可能导致流量拥塞。

 2.2 多网桥配置模式

        多网桥配置与单网桥类似,仅在Ubuntu ens33是加入单独的网桥br_out,还是与虚拟机接口加入相同的网桥lxcbr_mgt。

        多网桥的配置相对复杂一些,因为当mgt-eth要与VMNe通信时,实际是通过Ubuntu的Linux Protocol Stack中转的。

        由于br_out和lxcbr_mgt属于一个栈,那么不能配置相同的网段。如果相同会导致该网段包找不到出接口而转发失败。

        那么如果需要mgt-eth和VMNet之间三层可达,就需要在Ubuntu配置IP转发功能(默认是有的),同时需要在sim1和VMNet上配置路由。

        当然这样的配置同样存在好处,首先是容器在内网中,安全性能更好。而且数据包统一从ens33转发出去,就不存在MAC地址冲突问题,在WIFI环境也能工作。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐