Linux網路問題排錯
- 2019 年 10 月 3 日
- 筆記
前言
作為一名軟體工程師,Linux相關的知識是一個不可或缺的技能點,而網路問題往往是初學者接觸Linux時最先碰到的一隻攔路虎,本篇部落格將系統的講解一個解決Linux網路問題的通用方法論,一個科學的方法論往往能達到事半功倍的效果。
本篇部落格側重點不是講解電腦網路的相關知識,所以假定你有一定的網路基礎,如果沒有的話,可以先看看我文末的推薦書單。
本篇部落格是基於Ubuntu 18.04來寫的,使用 cat /etc/issue 可查看版本,對於其他版本的Linux發行版,部分命令可能會有所不同,但本質都是一樣的。
整體圖景
首先,要解決網路問題,哪么你必須要了解網路的分層結構和拓撲結構,這會讓你對整個網路有一個宏觀的認知,對你定位問題有極大的幫助。


- 對於網路的分層結構,你需要知道每一層都有哪些常用的協議,並了解協議的相關原理,因為後面我們提到的工具都是利用相應的協議來工作的。
- 對於網路的拓撲結構,你需要知道一個數據包在內網和公網中是怎麼流動的,還有交換機和路由器的區別是什麼。
問題定位
網路出了問題,無非就是硬體問題和軟體問題。
硬體問題
這個問題涉及的面比較廣,比如網線沒插好,路由器壞了,等等。其實這個屬於小概率事件,一般出了問題可能得相關專業的維修人員來解決,作為軟體工程師,我們關注的點是軟體問題。
軟體問題
對於一般的電腦使用者,上不了網了,大概率就指的是上不了百度等網站。但是作為軟體工程師,我們得明確為什麼上不了網了,到底是網路的那一層出現了問題?
一般排查問題的思路有兩種,自底向上和自頂向下,這兩種思路本質都是一樣的,本篇文章就自底向上來排查網路問題。
網卡是否正常工作?(鏈路層)
這個問題嚴格來說是屬於硬體問題,但是我們可以使用命令來操作網卡,在軟體行業,重啟可能會解決一大部分問題。
如下圖所示,使用 ifconfig 查看網卡資訊,顯示的結果應該會有多條,有虛擬機創建的虛擬網卡,還有你電腦的真實網卡,我們關注的網卡一般叫ens33,或者eth0,這個不重要,只是一個名稱。

然後我們使用 ifdown ens33 來關掉它,再使用 ifup ens33 來啟動它(ens33是你的網卡名稱),大多數情況下,重啟網卡後網路就能正常訪問。
網卡配置是否正確?(網路層)
在網卡沒有損壞的情況下,重啟後還是無法訪問網路,哪我們就應該排查網路層的問題,也就是網卡的配置資訊是否正常?主要有以下4點:
IP地址
我們都知道IP地址是用來標識你的電腦在互聯網上的地址,目前我們大多數情況下使用的是IPv4地址,不過在不久的將來,IPv6會普及。(32位的IPv4地址現在已經遠遠不夠用了)
如上圖所示的
inet 192.168.81.129就是我的IP地址。子網掩碼
子網掩碼和IP地址相與可以得到網路號,就是你所在的網段。
網關
網關就是你的數據包要從內網發送到公網所必須經過的,一般情況下是本網段的第一個或者最後一個地址。
如下圖所示,我們可以使用
route -n來查看相關的資訊。
DNS伺服器
DNS伺服器是用來解析域名然後給你返回對應的IP地址,比如 www.baidu.com ,所對應的就是182.61.200.7,常見的DNS伺服器有1.1.1.1,8.8.8.8,114.114.114.114
如下圖所示,我們可以使用
cat /etc/resolv.conf命令來查看本機設置的DNS伺服器地址。
注意!!!
你的IP地址,子網掩碼,網關 ,DNS伺服器都正常才是網路正常工作的必要條件。
一般情況下,你的DHCP伺服器會自動地給你分配IP,以及相關的設置。如果DHCP伺服器沒有正常工作,這時候就需要你自己手動分配正確的IP,並且確保相關配置都正確。
(鑒於篇幅的原因,而且本文主要是講述一個科學的方法論,所以如何手動配置這些資訊,請大家查閱別的資料)
檢驗!!!
在這些配置都正確後,我們可以使用 ping 命令,來測試網路層是否正常工作。(注意,有些區域網的路由器被設置為禁止ping,這對我們排查網路問題造成了極大的困擾)
- 首先我們可以ping網關的IP地址,或者區域網內的別的IP地址,如果正常工作,哪么即可確認在區域網內我們是正常的。
(注意:Windows系統的防火牆默認是不通過ICMP協議(ping命令使用就是ICMP協議)的,所以你ping一台Windows系統的電腦可能會失敗)

- 其次,我們可以ping百度,如果正常工作,哪么說明在公網上我們也是正常的。

服務是否監聽埠?(傳輸層)
對一般使用者來說,能夠ping通百度,就足夠滿足他的日常需求了,但是對於我們軟體工程師來說,我們還會搭建自己的服務站點,提供自己的應用服務,或者我們會配置VPS來實現訪問Google。
當你按照教程配置好一台VPS後,發現使用不了,而且採用了前兩步的方法,發現VPS可以正常上網,這時候大概率就是你VPS服務的問題。
服務端
- 首先查看VPS進程是否正常工作?使用
ps -aux|grep docker(插一句哈,使用docker來部署我們的應用程式簡直太爽了)

- 查看VPS是否正常監聽埠?

客戶端
如果以上的兩步都沒有問題,但是在你的客戶端上還是無法訪問Google的話,哪么你需要來測試以下埠是否真的通了,即客服端和服務端是否能建立會話。
如下圖所示,我們可以使用telnet ip地址 埠 來測試。

如果連接失敗,就表示埠是不通的,此時很可能是VPS的配置文件有問題,需要做別的排查,如下圖所示。

防火牆,安全組
如果以上的測試都沒有問題,哪么問題大概率是防火牆或者安全策略組(買過阿里雲或者騰訊雲的同學應該知道),大多數情況下,我們所使用的協議和監聽的埠不會被防火牆所阻擋,所以碰到這種情況的時候不多,鑒於篇幅原因,本文就不講了。
服務是否正常工作?(應用層)
這種情況一般很明顯,比如大家常見的 404 NOT FOUND ,這種要麼是被牆了,要麼是服務端發生了錯誤。一般錯誤資訊比較明顯。
總結
初學電腦網路的時候,感覺知識又多又雜,而且單純的看書,效果比較差,而且容易犯困。其實,在我們剛開始學習一門知識的時候,首先要做的就是建立整個宏觀知識體系,然後學習工作中經常使用的部分,比如應用層,傳輸層,網路層的基本概念。等基本的和常用的知識都學完後,結合自己的興趣再去深入的學習原理。要知道28原理,即20%的知識可以解決80%的問題。
推薦資料
《電腦網路》謝希仁 編著(配合B站的韓立剛老師的影片課程效果更佳)