概述
这段时间做家庭网关设备,对涉及到的多方面Linux和网络知识进行总结,主要涉及以下几个方面
-
Switch
和Port
-
PHY
和MAC
-
Linux
物理网口和虚接口 Linux Bridge
-
iptables
和NAT
- WAN连接
开发人员眼中没有WAN口和LAN口
当谈论网关设备时,人们总是会强调WAN和LAN,一定要从物理形态上区分出一个WAN口和一些LAN口,并牢牢记住,WAN口是用来接外网的,LAN口是用来接内网的,因为如果不小心把连接外网的那根网线连到了LAN口上,很有可能家里的网络就不通了;为此,开发商专门把无线路由器的网口用不同的颜色区分开来,WAN口一般是蓝色的,LAN口一般是黄色的
那么,到底什么是WAN口,什么是LAN口呢?
百度一下,可以搜索到不少关于WAN和LAN的说法,但大都让人看的晕头转向,没有谈到本质/核心的点子上;我要说的是,首先,作为开发人员,要去除脑袋里面的思维定式,不要从物理层去强行理解和区分WAN口和LAN口,它们并不是物理层的概念,它们是业务上的概念!
如果强行要解释WAN口和LAN口,它们其实只表示一种相对的连接关系,如下图
WAN口是用来连接外部网络的,LAN口是连接内部网络的,仅此而已
任何一个物理形态的口,都可以设置成WAN口和LAN口,只是开发人员给用户留不留设置接口的问题
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上的数据呢?
PHY和MAC
前面说到,Port是物理层概念,负责接收电信号,其实这个功能是Port里的PHY芯片完成的,这里的PHY就是物理层,MAC是媒体访问控制子层,就是数据链路层的下半层,它们之间有标准的接口来连接,如MII、GMII、RGMII、SGMII等,MII是百兆接口,后面的是千兆接口,如下图
这里只表示一种连接关系的示意图,实际中并不是直接这样接的,还会存在FIFO、DMA控制器等复杂操作
这里可以是一个PHY对应一个MAC,也可以是一个MAC对应多个PHY,Switch芯片就是将多个PHY连接到一个MAC上;PHY和MAC可以是分开的,也可以是一个芯片集成
总之,PHY和MAC之间进行连接后,MAC就可以获取到物理层的数据了;MAC的作用就是成帧,将bit位组合成以太网协议的帧,当然作用还很多,这里不细说
系统可以控制到的是哪里呢?就是MAC,通过MAC与PHY连接的MII...接口,按照时序控制,从数据线读写数据,从MDC/MDIO线控制PHY芯片的工作
这里有一个比较重要的点,Linux里的网络设备,eth0这种网络接口,对应的就是MAC,有几个MAC,就有几个eth0、1、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来区分,上图
对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既然可以做转发,那不就相当于接口互通了吗?
我们来设想一个最最简单的路由器桥模式,上图
当把eth0.11和eth0.1都绑定到br0上以后,Port1和其他Port的数据就互通了。那我们这个网关设备现在是用来干嘛的呢?它现在只是一个桥接器了,不做任何上层业务,只做转发。用户设备接在所谓的LAN侧,通过DHCP、PPPoE或者静态IP,自己去访问WAN侧网络吧!
现在有一个小小的问题,这个桥机器,怎么管理它呢?那个家用路由器通常的管理地址怎么玩的呢?其实就是为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,拿到外网地址,不久可以实现远程管理了吗?
可是这样的话,WAN口和LAN口没有了连接,用户怎么通业务?
只能再起一个eth实体接口!比如eth1,然后将eth1和eth0.1绑定到br0,管理通道和数据通道分开
这样看起来很麻烦,而且组网也不方便,那么有什么更好的办法呢?那就是真正意义上的网关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侧的数据连接。
核心的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地址、端口号、协议等等,只要内网访问外网某个地址,这个外网地址的数据包就可以进入内网并到达这个设备。
未完待续
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。