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來實現訪問谷歌。
當你按照教程配置好一台VPS後,發現使用不了,而且採用了前兩步的方法,發現VPS可以正常上網,這時候大概率就是你VPS服務的問題。
服務端
- 首先查看VPS進程是否正常工作?使用
ps -aux|grep docker
(插一句哈,使用docker來部署我們的應用程序簡直太爽了)
- 查看VPS是否正常監聽端口?
客戶端
如果以上的兩步都沒有問題,但是在你的客戶端上還是無法訪問谷歌的話,哪么你需要來測試以下端口是否真的通了,即客服端和服務端是否能建立會話。
如下圖所示,我們可以使用telnet ip地址 端口
來測試。
如果連接失敗,就表示端口是不通的,此時很可能是VPS的配置文件有問題,需要做別的排查,如下圖所示。
防火牆,安全組
如果以上的測試都沒有問題,哪么問題大概率是防火牆或者安全策略組(買過阿里雲或者騰訊雲的同學應該知道),大多數情況下,我們所使用的協議和監聽的端口不會被防火牆所阻擋,所以碰到這種情況的時候不多,鑒於篇幅原因,本文就不講了。
服務是否正常工作?(應用層)
這種情況一般很明顯,比如大家常見的 404 NOT FOUND
,這種要麼是被牆了,要麼是服務端發生了錯誤。一般錯誤信息比較明顯。
總結
初學計算機網絡的時候,感覺知識又多又雜,而且單純的看書,效果比較差,而且容易犯困。其實,在我們剛開始學習一門知識的時候,首先要做的就是建立整個宏觀知識體系,然後學習工作中經常使用的部分,比如應用層,傳輸層,網絡層的基本概念。等基本的和常用的知識都學完後,結合自己的興趣再去深入的學習原理。要知道28原理,即20%的知識可以解決80%的問題。
推薦資料
《計算機網絡》謝希仁 編著(配合B站的韓立剛老師的視頻課程效果更佳)