当前位置: 首页 > Linux

LinuxNetwork—GW总结

时间:2023-04-06 23:32:04 Linux

概述这段时间作为家庭网关设备,总结了Linux的各个方面以及涉及到的网络知识,主要涉及以下几个方面Switch和PortPHY以及MACLinux物理网口和虚拟接口Linux与NATWAN连接的Bridgeiptables开发人员看不到WAN和LAN端口。谈到网关设备,人们总是强调广域网和局域网。有必要在物理形式上区分一个WAN口和一些LAN口,记住WAN口是LAN口用来连接外网的,LAN口是用来连接内网的,因为如果你不小心把连接外网的网线接到LAN口,很可能家里的网络就上不去了;为此,开发厂商专门用不同的颜色来区分无线路由器的网口。WAN口一般是蓝色的,LAN口一般是黄色的。那么,什么是WAN口,什么是LAN口呢?百度一下,可以找到很多关于WAN和LAN的说法,但大多比较混乱,没有讲到本质/核心思想;我想说的是,首先,作为开发者,一定要去掉Thinkingpattern,不要强行理解和区分物理层的WAN口和LAN口,它们不是物理层的概念,是业务概念!如果强行解释WAN口和LAN口,其实它们只是代表了一种相对的连接关系。如下图,WAN口用于连接外网,LAN口用于连接内网,可以设置为WAN口和LAN口,但是开发者会给用户留下设置接口的问题其实就是Port,也就是插网线的地方,不管是WAN还是LAN,都是Ports,相同的物理形态和接口,RJ45标准,它们对应ISO/OSI七层模型,属于物理层。简单来说,它的作用就是接收电信号并将其转换成比特。说复杂一点,里面的知识就多了,比如CSMA/CD,编解码,纠错和检错等等;通常家庭路由器上会有多个。Port,它们会连接到一个Switch上,这个Switch要么是外接的Switch芯片,要么是CPU内置的片上Switch,它的作用是连接多个Port,然后进行转发,可以设置Vlan,port速度、QoS等;那么,交换机连接了多个端口,系统如何从这些端口接收数据呢?前面PHY和MAC中提到,Port是一个物理层概念,负责接收电信号。其实这个函数就是Port中的PHY芯片制作完成。这里的PHY是物理层,MAC是媒体访问控制子层,是数据链路层的下半层。它们之间有标准接口连接,如MII、GMII、RGMII、SGMII等,MII是100M接口,后者是千兆接口。下图只是一个连接关系的示意图。实际中并不能直接这样连接,还会有FIFO、DMAcontroller等复杂的操作。这里可以一个PHY对应一个MAC,或者一个MAC对应多个PHY。Switch芯片将多个PHY连接到一个MAC;PHY和MAC可以分离或集成到一个芯片中。它们之间连接后,MAC就可以获取到物理层的数据;MAC的作用是形成一个帧,将比特组合成以太网协议的帧。当然,还有很多功能。我不会详细说明系统可以控制的地方。羊毛布?就是MAC,通过MAC连接PHY的MII接口,根据时序控制,从数据线上读写数据,从MDC/MDIO线上控制PHY芯片的工作。这里说一个比较重要的一点,Linux中的网络设备,网络接口eth0对应MAC。如果有几个MAC,就有几个eth0、1、2,它们是软件对CPU的MAC接口的抽象,在物理上肯定是实际存在的;关于详细的Linux网络发送和接收设备号的过程,包括硬中断和软中断、NAPI机制、DMA操作、协议栈处理,后面会出一篇文章专门总结。到目前为止,唯一与WAN和LAN相关的就是将一个端口连接到外部网络,如果是,则将其PHY和MAC接口设置为千兆。对于LAN口,一般是一个100M的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接收到的所有数据,带有Vlanx的数据都会发送到eth0.x。网关设备WAN和LAN如何结合使用,如果交换机只有一个MAC,WAN和LAN如何分离?可以用vlan来区分。上图中为交换机的多个端口设置了不同的Vlan。这里的Vlan类型是报文进入端口时标记为该端口的Vlan。具体类型记不清了。简而言之,端口有不同类型的Vlan设置。这里所说的Vlan并不是交换机上常见的Vlan。端口将判断传入的数据包。如果与端口Vlan不一致,则丢弃。使用Vlan来区分数据包的传入端口,Port1的Vlan为11,其他端口的Vlan为1。创建eth0.11和eth0.1,那么eth0.11接收到的数据必须从Port1进入,eth0.1接收到的数据必须从其他端口,以便区分端口。Linux桥是好的。理解了物理接口和虚拟接口的概念后,就可以区分Port了,在软件中也可以区分不同Port进来的数据了。然而,另一个非常重要的问题是:广域网和局域网数据如何通信?家用路由器在广域网设置中通常有不同的工作模式,分别是路由(route)模式和网桥(bridge)模式。这里桥接模式和LinuxBridge有什么关系呢?指LinuxBridge!什么是Linux桥?可以简单理解为Linux虚拟化的软件中枢。它在第二层工作。绑定到Bridge的所有接口,当数据从一个接口进入,Bridge会从其他所有接口转发,forward。这里的接口就是上面说的物理接口或者虚拟接口。既然Bridge可以转发,那不就相当于接口互通了吗?让我们想象一下最简单的路由器桥接模式。上图中,当eth0.11和eth0.1都绑定br0后,Port1和其他端口的数据就可以互通了。那么现在我们的网关设备是做什么用的呢?现在只是一个网桥,不做任何上层业务,只做转发。用户设备接入所谓的LAN侧,通过DHCP、PPPoE或静态IP自行接入WAN侧网络!现在有个小问题,这个桥机,怎么管理呢?家庭路由器通常的管理地址是如何工作的?其实就是给br0设置一个IP地址。什么,br0也可以设置IP地址?这里有一点需要铺垫,input和forward的概念,它们属于iptables上层的概念,但是又离不开这里的Bridge。简单的说,Bridge会做一系列的判断,包括学习地址和转发。当Bridge有自己的地址时,会判断数据包的目的IP是否是自己。如果是它自己,则称为输入,否则称为前向。然后应用层创建一个HttpServer并绑定到br0。当用户设置静态IP和br0的地址在同一网段时,访问br0的地址实现本地管理?如果需要远程管理怎么办?类似于外网的telnet或者其他管理环境,如何管理这个设备?总之,WAN侧有上位设备来管理网桥,怎么办?目前假设Port1和Vlan11连接的是外网,所以暂且称之为所谓的WAN口,其他端口都在LAN侧。这时候就会用到虚拟接口。在eth0已经存在的前提下,eth0.11不要绑定br0,只需要将LAN侧端口绑定br0,然后在eth0.11上启动PPPoE或DHCPClient,获取外网地址,就可以远程管理了可能很快吗?但是在这种情况下,WAN口和LAN口是不相连的,用户如何与业务进行通信呢?只能多用一个eth实体接口!比如eth1,然后把eth1和eth0.1绑定到br0上。管理通道和数据通道分开好像很麻烦,而且组网也不方便,那么有什么更好的办法呢?那才是真正意义上的门户。使用NAT转换时,iptables和NAT转换不需要eth1。只需要一个eth0。还是需要vlan来区分连接外网的端口和连接内网的端口。eth0.1绑定到br0,eth0.11未绑定到br0。br0设置本地管理的IP地址,同时启动一个DHCPServer为内网用户分配IP地址。eth0.11启动一个DHCPClient或PPPoE,请求外网地址,用于远程管理,也是数据通道。eth0.11和br0之间做NAT转换,实现WAN侧和LAN侧的数据连接。核心iptables规则是iptables-tnat-Achain_name-slan_addr-owan_ifname-jMSQUERADE。这条iptables规则的意思是源IP地址是LAN端地址,从WAN接口发出的数据包伪装成IP。当外网与内网用户设备通信时,内网用户设备完全被当作外网设备,在出口处将其源IP改为外网地址。此过程称为SNAT。当外网数据到达WAN接口时,目的IP会被更改为内网设备的IP。这个过程称为DNAT。本质上iptables为每条去往外网的数据流记录维护一张表,包括IP地址、端口号、协议等,只要内网访问外网的一个地址,这个外网的数据包地址可以进入内网,到达该设备。待续