隨者雲端架構與容器技術的興起,架設一個伺服器的門檻大幅度降低,透過簡單幾個操作就可以迅速的架設一個虛擬網段並且於上面部署虛擬機器與容器。
簡單便利的操作雖然能夠輕易的架設出一個複雜的系統架構,但是如果本身對於整個系統沒有足夠扎實的基本功,就沒有辦法真正的掌握這些架構,容易遇到問題時只能依賴現存的文件與解答,沒有辦法依靠自己對於系統的認知去除錯,甚至縮小範圍來找出真正可能的出錯點。
透過學習 Linux 內的網路實作來理解所有封包的流向,掌握這項能力未來就有辦法去分析封包的傳輸,面對任何網路問題時都能夠按部就班地去分析並且找出可能的問題點。

文章目錄
誰適合學習 Linux 底層網路架構
運算,儲存,網路三大元件可說是系統架構中最為重要的三大元件,而網路這個領域可說是每位工程師平常都會接觸到的領域,不論是前端,後端,DevOps,SRE,任何會使用 Linux 作為日常工作環境的人都可以去好好的學習 Linux 網路。
網路的世界非常複雜,除了經驗之外,很多時候其實都會依賴 Google 等工具來幫忙找尋答案以及可能的線索。但是就如同前面所述,網路不通是個非常模糊的描述,沒有辦法精確的描述問題時,實務上也沒有辦法使用 Google 搜尋。
因此掌握 Linux 網路實作的理解,未來遇到各種問題時,都能夠冷靜下來仔細的去思考,到底為什麼網路不通,為什麼封包會不見,目前有哪些線索以及接下來可以做哪些測試,透過這些步驟就能夠縮小問題範圍,最後才有辦法精準地問出問題。
如何學習 Linux 底層網路
過往學校課程學習網路概念時,都會從 OSI 七層與 TCP/IP 五層理論為出發點去介紹網路概論,然而這些理論實務上到底怎麼運作則沒有太多的探討,必須要依賴時間與經驗的累積,自己掌握出一套到底實務上是如何將理論給實作出來的。
為了能夠讓網路理論更容易地融入到日常生活之中,一個更好的學習方式則是由系統層面出發,從一個常用的方式為出發點,去探討其網路為什麼可以通,藉此過程中將理論一一的組合近來,最後組合出一個完整個藍圖。
前述提到容器化的興起,特別是 Docker 這個容器技術讓全世界的開發者都能夠輕鬆地透過 Docker 來運行各式各樣的服務,因此如果能夠從容器為出發點,去探討容器背後的網路架構就能夠學習到基本的網路概念了。
容器的網路模型
熟悉 Docker 的朋友一定都使用過 docker run 來運行容器,但是你知道其實在運行的時候可以透過 –network 給予不同的參數嗎?
None,Bridge,Host,ContaienrID 這些不同的參數到底代表了什麼含義?而這些選擇又會對容器本身產生什麼影響?
外部網路存取容器
另一個常見的參數就是 -p,透過 -p 可以讓節點本身特定的連接埠給轉發到容器內的連接埠,然而有沒有想過到底底層是怎麼運作的? 下這些指令的時候 Docker 會幫你做什麼事情,如果沒有 Docker 的話是否有辦法自己使用 Linux 指令打造出一樣的環境?
容器存取外部網路
另外一個一直存在但是很少被人注意對網路現象就是容器到底是如何存取外界網路的,有仔細注意的話可能會觀察到每個容器的IP預設都是私有網段,譬如 10.18.0.0/24 系列,這種情況下到底容器是如何與外部網路溝通的,這中間到底 Linux 又做了哪些事情。
容器間互相存取
最後探討的則是節點上多個容器間的網路存取,這些容器屬於相同網段,照理來說互相存取應該是個非常直觀的事情,但是直觀的事情背後都還是有一套邏輯來解釋。這種情況下 Linux 中有哪些機制會參與來處理這些網路轉發?
Linux 內的常見網路功能
熟悉 Linux 指令操作的人,一定很常看到各種網路指令,譬如 ifconfig, route, bridge, arp, ip, ethtool, netstat, ss, iptables 等,這些指令彼此都有各自適合使用的領域,要如何將這些指令的操作與理論上的 TCP/IP 給結合則是一個需要經驗與實戰累積的產物,此外你知道 ifconfig 已經漸漸地要被 ip 指令給取代了嗎?
除了上述指令的操作外,要讓 Docker 容器能夠順利地獲得網路能力,也需要下列 Linux 內各種元件的幫忙。
Network Namespace
如果有在 Container 內透過上述 ip, ifconfig, route 等指令觀察,一定會發現容器內的網路介面與外部主機是截然不同的世界,看到的 IP 地址與網卡資訊截然不同,這一切都要歸功於 Linux Kernel 內部的 Network Namespace 實作。 Kernel 透過這個方式提供了基於 Network 的隔離功能,讓不同容器之間的網路可以擁有自己的IP地址與網路介面
Linux Bridge/ARP
安裝好 Docker 的機器如果透過 ip, ifconfig 等指令,可能都會發現系統上多了一個 docker0 的網卡,而這個網卡實際上是一個透過 Linux Bridge 所創造的虛擬網卡,而系統上所有的容器都會基於這個 docker0 串接起來。
Conntrack/iptables/ebtalbes
Linux 的老手想必都聽過 iptables 這個工具,但是除了 iptables 之外,其實系統上還有另外一個 ebtables 也會執行類似的事情,而這些工具搭配 Conntrack 這套 Linux Kernel 的系統則能夠組合出更多的火花!
順道一提,其實封包在經過 Linux Bridge 這個號稱專注於 MAC 轉發的虛擬網卡時,會偷偷呼叫基於 IP 的 iptables 規則來處理封包。這個功能是安裝 docker 時會偷偷去開啟系統設定的,這種方式似乎跟傳統所學的網路處理流程概念有些不同,但是實作上反而可以達到更好的效果與彈性。這就是理論於實作上的差異。
Routing Table
最後探討的則是如何轉發 IP 封包,大多數的玩家都會想到 Routing Table 這個功能,透過 route 或是 ip route 等指令來操作,然而實際上 routing table 玩法可以很多元,所有指令預設都是針對 default 這張 table 進行操作,實務上是可以針對不同的 table 去進行操控處理的。
學會 Linux 底層網路可以做什麼
上述所談的其實都是最基本的 Linux 網路功能,當你熟悉這些功能與概念後,才有基礎與能力去探索更多不同的用法,譬如
- VPN, Site-To-Site VPN 的差異
- Load Balancing 的概念
- 封裝協定,譬如 VXLAN, GRE 等
特別是 Kubernetes 這套容器管理平台,本身就是由眾多節點組成,每個節點本身都會遵循上面所探討的概念去處理網路流程,此外還要處理跨節點間的容器傳輸,網路架構更為複雜。
沒有基本功與概念是沒有辦法好好面對 Kubernetes 這頭巨獸,更不用說未來還有 eBPF 等不同的網路架構
想要打好 Linux 網路基礎嗎?

推薦你這門「Linux 工程師維運大全|從容器幫你重新打造網路基底」課程,課程將從容器觀點出發,結合實戰與理論,幫你打好基礎以應對未來實務應用上所面臨的各種情境。
Hi 找我嗎?追蹤訂閱HiSKIO
- HiSKIO 嗨程式技能: 科技資訊文章、實用工具分享、新課程優惠領取
- Codefree:喝一杯咖啡,輕鬆學程式!
- HiSKIO LINE:叮咚!掌握最新資訊與優惠,現在就到 LINE 領200抵用券!
- HiSKIO YouTube:免費實用課程、工程師經驗分享
- 程式丼起來:不想一個人孤單寫 code ? 立即加入話題圈吧 !