1. 程式人生 > >Linux網路問題排錯

Linux網路問題排錯

前言

作為一名軟體工程師,Linux相關的知識是一個不可或缺的技能點,而網路問題往往是初學者接觸Linux時最先碰到的一隻攔路虎,本篇部落格將系統的講解一個解決Linux網路問題的通用方法論,一個科學的方法論往往能達到事半功倍的效果。

本篇部落格側重點不是講解計算機網路的相關知識,所以假定你有一定的網路基礎,如果沒有的話,可以先看看我文末的推薦書單。

本篇部落格是基於Ubuntu 18.04來寫的,使用 cat /etc/issue 可檢視版本,對於其他版本的Linux發行版,部分命令可能會有所不同,但本質都是一樣的。

整體圖景

首先,要解決網路問題,哪麼你必須要了解網路的分層結構和拓撲結構,這會讓你對整個網路有一個巨集觀的認知,對你定位問題有極大的幫助。

  1. 對於網路的分層結構,你需要知道每一層都有哪些常用的協議,並瞭解協議的相關原理,因為後面我們提到的工具都是利用相應的協議來工作的。
  2. 對於網路的拓撲結構,你需要知道一個數據包在內網和公網中是怎麼流動的,還有交換機和路由器的區別是什麼。

問題定位

網路出了問題,無非就是硬體問題和軟體問題。

硬體問題

這個問題涉及的面比較廣,比如網線沒插好,路由器壞了,等等。其實這個屬於小概率事件,一般出了問題可能得相關專業的維修人員來解決,作為軟體工程師,我們關注的點是軟體問題。

軟體問題

對於一般的電腦使用者,上不了網了,大概率就指的是上不了百度等網站。但是作為軟體工程師,我們得明確為什麼上不了網了,到底是網路的那一層出現了問題?

一般排查問題的思路有兩種,自底向上和自頂向下,這兩種思路本質都是一樣的,本篇文章就自底向上來排查網路問題。

網絡卡是否正常工作?(鏈路層)

這個問題嚴格來說是屬於硬體問題,但是我們可以使用命令來操作網絡卡,在軟體行業,重啟可能會解決一大部分問題。

如下圖所示,使用 ifconfig 檢視網絡卡資訊,顯示的結果應該會有多條,有虛擬機器建立的虛擬網絡卡,還有你電腦的真實網絡卡,我們關注的網絡卡一般叫ens33,或者eth0,這個不重要,只是一個名稱。

然後我們使用 ifdown ens33 來關掉它,再使用 ifup ens33 來啟動它(ens33是你的網絡卡名稱),大多數情況下,重啟網絡卡後網路就能正常訪問。

網絡卡配置是否正確?(網路層)

在網絡卡沒有損壞的情況下,重啟後還是無法訪問網路,哪我們就應該排查網路層的問題,也就是網絡卡的配置資訊是否正常?主要有以下4點:

  1. IP地址

    我們都知道IP地址是用來標識你的計算機在網際網路上的地址,目前我們大多數情況下使用的是IPv4地址,不過在不久的將來,IPv6會普及。(32位的IPv4地址現在已經遠遠不夠用了)

    如上圖所示的 inet 192.168.81.129 就是我的IP地址。

  2. 子網掩碼

    子網掩碼和IP地址相與可以得到網路號,就是你所在的網段。

  3. 閘道器

    閘道器就是你的資料包要從內網傳送到公網所必須經過的,一般情況下是本網段的第一個或者最後一個地址。

    如下圖所示,我們可以使用 route -n 來檢視相關的資訊。

  4. 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站的韓立剛老師的視訊課程效果更佳