资讯专栏INFORMATION COLUMN

Linux网络——GW总结

1treeS / 782人阅读

摘要:它一般是在网卡驱动的加载过程中,通过调用向内核注册的什么是虚接口,虚拟网络设备的总称,有等。那我们这个网关设备现在是用来干嘛的呢它现在只是一个桥接器了,不做任何上层业务,只做转发。

概述

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

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口,它们其实只表示一种相对的连接关系,如下图

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地址、端口号、协议等等,只要内网访问外网某个地址,这个外网地址的数据包就可以进入内网并到达这个设备。


未完待续

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10334.html

相关文章

  • linux服务器将iptables卸掉了,导致服务器网络问题

    摘要:如果是阿里云服务器,可以通过控制台登录服务器,参考一下步骤进行修复通过配置信息网卡掩码内网和外网网卡都是配置上。如果是专有网络服务器,网关只填写内网网关就可以如果是阿里云服务器,可以通过控制台登录服务器,参考一下步骤进行修复 通过ifconfig 配置IP信息ifconfig < IP > netmask 内网和外网网卡都是配置上。然后添加路由:route add -net 0.0.0...

    Prasanta 评论0 收藏0
  • k8s与网络--Flannel解读

    摘要:是一个专为定制的三层网络解决方案,主要用于解决容器的跨主机通信问题。收到的数据包被转发到进程。查询路由表,解封包,并将数据包发送到。然后在网络层的源和目的均是容器的,虚拟。默认也是使用容器网络方案,其官网也清晰的画出了的。 前言 我们知道docker官方并没有提供多主机的容器通信方案,单机网络的模式主要有host,container,brige,none。none这种模式,顾名思义就是...

    laznrbfe 评论0 收藏0
  • k8s与网络--Flannel解读

    摘要:是一个专为定制的三层网络解决方案,主要用于解决容器的跨主机通信问题。收到的数据包被转发到进程。查询路由表,解封包,并将数据包发送到。然后在网络层的源和目的均是容器的,虚拟。默认也是使用容器网络方案,其官网也清晰的画出了的。 前言 我们知道docker官方并没有提供多主机的容器通信方案,单机网络的模式主要有host,container,brige,none。none这种模式,顾名思义就是...

    Pink 评论0 收藏0
  • docker网络方案简介

    摘要:模式容器直接使用宿主机的网络配置,包括网卡,路由等,这种方案下,从网络层面来看,容器就不是容器了,只是一个宿主机上的进程端口而已。 注:本篇仅仅是对各个网络方案的简介和思考。需要深入学习如何部署和使用的同学请自行度娘~ 中小docker用户的苦恼 docker的使用者十分广泛,不止有网易蜂巢,daocloud,时速云这类的已经成熟化的公有云服务,许多中小型企业内部也在试图将docker...

    bbbbbb 评论0 收藏0
  • docker网络方案简介

    摘要:模式容器直接使用宿主机的网络配置,包括网卡,路由等,这种方案下,从网络层面来看,容器就不是容器了,只是一个宿主机上的进程端口而已。 注:本篇仅仅是对各个网络方案的简介和思考。需要深入学习如何部署和使用的同学请自行度娘~ 中小docker用户的苦恼 docker的使用者十分广泛,不止有网易蜂巢,daocloud,时速云这类的已经成熟化的公有云服务,许多中小型企业内部也在试图将docker...

    ?xiaoxiao, 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<