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地址、端口號、協議等等,只要內網訪問外網某個地址,這個外網地址的數據包就能夠進入內網併到達這個設備。


未完待續

相關文章
相關標籤/搜索