Linux网络——GW总结

概述

这段时间作家庭网关设备,对涉及到的多方面Linux和网络知识进行总结,主要涉及如下几个方面bash

  • SwitchPort
  • PHYMAC
  • Linux物理网口和虚接口
  • Linux Bridge
  • iptablesNAT
  • WAN链接

开发人员眼中没有WAN口和LAN口

当谈论网关设备时,人们老是会强调WAN和LAN,必定要从物理形态上区分出一个WAN口和一些LAN口,并紧紧记住,WAN口是用来接外网的,LAN口是用来接内网的,由于若是不当心把链接外网的那根网线连到了LAN口上,颇有可能家里的网络就不通了;为此,开发商专门把无线路由器的网口用不一样的颜色区分开来,WAN口通常是蓝色的,LAN口通常是黄色的网络

那么,到底什么是WAN口,什么是LAN口呢?学习

百度一下,能够搜索到很多关于WAN和LAN的说法,但大都让人看的晕头转向,没有谈到本质/核心的点子上;我要说的是,首先,做为开发人员,要去除脑壳里面的思惟定式,不要从物理层去强行理解和区分WAN口和LAN口,它们并非物理层的概念,它们是业务上的概念!编码

若是强行要解释WAN口和LAN口,它们其实只表示一种相对的链接关系,以下图
clipboard.png
WAN口是用来链接外部网络的,LAN口是链接内部网络的,仅此而已
任何一个物理形态的口,均可以设置成WAN口和LAN口,只是开发人员给用户留不留设置接口的问题spa

Switch和Port

先来从物理形态上提及吧,业务上的WAN、LAN,最终对应到物理层的硬件上,其实就是Port,就是网线插进去的地方,不论是WAN仍是LAN,它们都是Port,同样的物理形态和接口,RJ45标准,它们对应到ISO/OSI七层模型中,属于物理层,其功能简单来讲,就是电信号的接收,转换为bit位,往复杂的说,里面学问多了去,CSMA/CD、编码解码、纠错检错等等;
一般家用路由器上会有多个Port,它们会接到一个Switch上,这个Switch或者是一个外置Switch芯片,或者是CPU内置的片上Switch,其功能就是链接多个Port,而后作转发,而且能够对Port设置Vlan、端口速率、QoS等;
好,Switch链接了多个Port,系统如何接收到这些Port上的数据呢?code

PHY和MAC

前面说到,Port是物理层概念,负责接收电信号,其实这个功能是Port里的PHY芯片完成的,这里的PHY就是物理层,MAC是媒体访问控制子层,就是数据链路层的下半层,它们之间有标准的接口来链接,如MII、GMII、RGMII、SGMII等,MII是百兆接口,后面的是千兆接口,以下图对象

clipboard.png
这里只表示一种链接关系的示意图,实际中并非直接这样接的,还会存在FIFO、DMA控制器等复杂操做接口

这里能够是一个PHY对应一个MAC,也能够是一个MAC对应多个PHY,Switch芯片就是将多个PHY链接到一个MAC上;PHY和MAC能够是分开的,也能够是一个芯片集成ip

总之,PHY和MAC之间进行链接后,MAC就能够获取到物理层的数据了;MAC的做用就是成帧,将bit位组合成以太网协议的帧,固然做用还不少,这里不细说路由

系统能够控制到的是哪里呢?就是MAC,经过MAC与PHY链接的MII...接口,按照时序控制,从数据线读写数据,从MDC/MDIO线控制PHY芯片的工做

这里有一个比较重要的点,Linux里的网络设备,eth0这种网络接口,对应的就是MAC,有几个MAC,就有几个eth0、一、2,它们就是软件对CPU的MAC接口的抽象,必定是物理上实际存在的;关于详细的Linux网络设备数收发的流程,包括硬中断和软中断、NAPI机制、DMA操做以及协议栈处理,后面会再发文章专门总结

到目前为止,惟一一点和WAN、LAN有关的就是将某个Port接外网的话,设置其PHY和MAC接口为千兆,LAN口的话通常是百兆

Linux物理网口与虚接口

什么是物理网口,好比上文说到的eth0这种接口,你能经过ifconfig命令看到它,是由于Linux网络子系统为你维护了一个网络设备的对象,它抽象了全部网络设备的信息和功能。可是它不光光只有软件的抽象,并且是有物理实际实体的对应,说白了就是CPU的片上MAC接口,有几个MAC,最多就能有几个ethn。它通常是在网卡驱动的加载过程当中,经过调用register_netdev()向内核注册的

什么是虚接口,Linux虚拟网络设备的总称,有eth0:x、eth0.x、veth0等。为何要有这么多种虚拟网络接口?这正是Linux网络强大的地方,它能够利用各类虚接口以及更上层的一些东西,组合出来各类花样,本文的核心正是总结其中的一小部分

  • eth0:x
    首先,它存在的前提是,必须存在eth0这个物理网口,它是依附于eth0的。当你在eth0的基础上建立了一个eth0:1,能够把它理解为一个软件层实际存在的网口,全部eth0收到数据,它均可以收到,能够为它单独设置IP等网络层信。网卡必须设置成混杂模式
  • eth0.x
    它的道理同样,必须存在eth0这个实体网口,做用是全部eth0收到的数据,带Vlan为x的数据都会被发送到eth0.x
  • 怎么用
    结合网关设备的WAN和LAN,若是switch只有一个MAC,如何作到WAN和LAN的分离?能够利用Vlan来区分,上图

clipboard.png
对switch的多个Port设置不一样的Vlan,这里的Vlan类型是进入Port的包被打上Port的Vlan,具体叫什么类型记不清了。总之对Port设置Vlan是有不一样种类的,这里说的Vlan不是一般说的交换机上Vlan那种端口会对进入的包作判断,若是和端口Vlan不一致,就丢弃

用Vlan区分了数据包的进入Port,Port1的Vlan为11,其余Port的Vlan为1。建立eth0.11和eth0.1,那么eth0.11接收到的数据必定是从Port1进入的,eth0.1接收到的数据必定是从其余Port进入的,这样就把Port区分出来了

Linux Bridge

好,理解了物理接口和虚接口的概念,能够作到将Port区分,从不一样的Port进来的数据,我能够在软件上很好的区分了。可是,另一个很是重要的问题是:WAN和LAN的数据如何互通?

家用路由器一般在WAN设置中有工做模式的区分,分别是路由(route)模式和桥(bridge)模式,这里的桥模式和Linux Bridge有什么关系呢?指的就是Linux Bridge!

Linux Bridge是干吗的?能够简单的理解为一个Linux虚拟出来的软件Hub,它工做在2层,全部绑定到Bridge上的接口,当数据从一个接口进入时,Bridge会将它们从全部其余接口转发,forward。这里的接口就是上文说的物理接口或者虚接口

Bridge既然能够作转发,那不就至关于接口互通了吗?
咱们来设想一个最最简单的路由器桥模式,上图

clipboard.png

当把eth0.11和eth0.1都绑定到br0上之后,Port1和其余Port的数据就互通了。那咱们这个网关设备如今是用来干吗的呢?它如今只是一个桥接器了,不作任何上层业务,只作转发。用户设备接在所谓的LAN侧,经过DHCP、PPPoE或者静态IP,本身去访问WAN侧网络吧!

clipboard.png

如今有一个小小的问题,这个桥机器,怎么管理它呢?那个家用路由器一般的管理地址怎么玩的呢?其实就是为br0设置一个IP地址。什么,br0还能够设置IP地址?

这里有一个点须要作铺垫,input和forward的概念,它们是属于更上层的iptables里的概念,可是又和这里的Bridge有着密不可分的关系,简单来讲,Bridge收到数据包会作一系列判断,包括学习地址和转发。当Bridge本身有地址后,它会判断数据包的目的IP是否是本身,若是是本身,就叫input,不然,就叫forward。那么应用层建立一个Http Server绑定到br0上,当用户设置静态IP与br0地址在同一网段时,访问br0的地址,不就实现了本地管理吗?

若是须要远程管理呢?相似telnet或者外网中有其余管理环境,如何管理到这个设备?总之就是WAN侧有上级设备来管理这个桥接器,怎么办?

目前假定的是Port1,Vlan11这个端口是接外网的,就叫它所谓的WAN口吧,其余Port就处于LAN侧。这时就要使用到虚接口了,在eth0已经存在的前提下,eth0.11不要绑到br0上,只有LAN侧Port绑到br0上,而后在eth0.11上起PPPoE或者DHCP Client,拿到外网地址,不久能够实现远程管理了吗?

clipboard.png

但是这样的话,WAN口和LAN口没有了链接,用户怎么通业务?
只能再起一个eth实体接口!好比eth1,而后将eth1和eth0.1绑定到br0,管理通道和数据通道分开

clipboard.png

这样看起来很麻烦,并且组网也不方便,那么有什么更好的办法呢?那就是真正意义上的网关gateway,使用NAT转换的时候到了

iptables和NAT转换

不须要eth1,只要一个eth0,仍是要作Vlan来区分链接外网的Port和内网的Port。eth0.1绑定到br0,eth0.11不绑定到br0。br0设置IP地址用于本地管理,同时起一个DHCP Server为内网用户分配IP地址。eth0.11起一个DHCP Client或者PPPoE,请求到外网地址,用做远程管理,同时也是数据通道。在eth0.11和br0之间作NAT转换,实现WAN侧和LAN侧的数据链接。

clipboard.png

核心的iptables规则是

iptables -t nat -A chain_name -s lan_addr -o wan_ifname -j MSQUERADE

这条iptables规则的含义是源IP地址是LAN侧地址,从WAN接口发出的数据包,作IP假装,其效果是外网在和内网用户设备通讯时,内网的用户设备彻底看成一个外网中的设备来处理,在出口会将其源IP修改成一个外网地址,这个过程叫SNAT。当外网数据到达WAN接口时,会将目的IP修改成内网该设备的IP,这个过程叫DNAT。

本质上是iptables为每条到外网去的数据流记录维护一个表,包括IP地址、端口号、协议等等,只要内网访问外网某个地址,这个外网地址的数据包就能够进入内网并到达这个设备。


未完待续

相关文章
相关标签/搜索