Linux網絡問題排錯

  • 2019 年 10 月 3 日
  • 筆記

前言

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

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

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

整體圖景

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

網絡分層

網絡分層和拓撲結構

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

問題定位

網絡出了問題,無非就是硬件問題和軟件問題。

硬件問題

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

軟件問題

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

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

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

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

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

ifconfig查看網絡信息

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

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

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

  1. IP地址

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

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

  2. 子網掩碼

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

  3. 網關

    網關就是你的數據包要從內網發送到公網所必須經過的,一般情況下是本網段的第一個或者最後一個地址。

    如下圖所示,我們可以使用 route -n 來查看相關的信息。

    route

  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服務器地址。

    DNS地址查詢

注意!!!

你的IP地址子網掩碼網關DNS服務器都正常才是網絡正常工作的必要條件。

一般情況下,你的DHCP服務器會自動地給你分配IP,以及相關的設置。如果DHCP服務器沒有正常工作,這時候就需要你自己手動分配正確的IP,並且確保相關配置都正確。

(鑒於篇幅的原因,而且本文主要是講述一個科學的方法論,所以如何手動配置這些信息,請大家查閱別的資料)

檢驗!!!

在這些配置都正確後,我們可以使用 ping 命令,來測試網絡層是否正常工作。(注意,有些局域網的路由器被設置為禁止ping,這對我們排查網絡問題造成了極大的困擾)

  • 首先我們可以ping網關的IP地址,或者局域網內的別的IP地址,如果正常工作,哪么即可確認在局域網內我們是正常的。

(注意:Windows系統的防火牆默認是不通過ICMP協議(ping命令使用就是ICMP協議)的,所以你ping一台Windows系統的電腦可能會失敗)

ping網關

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

服務是否監聽端口?(傳輸層)

對一般使用者來說,能夠ping通百度,就足夠滿足他的日常需求了,但是對於我們軟件工程師來說,我們還會搭建自己的服務站點,提供自己的應用服務,或者我們會配置VPS來實現訪問谷歌。

當你按照教程配置好一台VPS後,發現使用不了,而且採用了前兩步的方法,發現VPS可以正常上網,這時候大概率就是你VPS服務的問題。

服務端

  • 首先查看VPS進程是否正常工作?使用 ps -aux|grep docker (插一句哈,使用docker來部署我們的應用程序簡直太爽了)

進程是否正常

  • 查看VPS是否正常監聽端口?

端口監聽

客戶端

如果以上的兩步都沒有問題,但是在你的客戶端上還是無法訪問谷歌的話,哪么你需要來測試以下端口是否真的通了,即客服端和服務端是否能建立會話。

如下圖所示,我們可以使用telnet ip地址 端口 來測試。

telnet連接成功

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

telnet連接失敗

防火牆,安全組

如果以上的測試都沒有問題,哪么問題大概率是防火牆或者安全策略組(買過阿里雲或者騰訊雲的同學應該知道),大多數情況下,我們所使用的協議和監聽的端口不會被防火牆所阻擋,所以碰到這種情況的時候不多,鑒於篇幅原因,本文就不講了。

服務是否正常工作?(應用層)

這種情況一般很明顯,比如大家常見的 404 NOT FOUND ,這種要麼是被牆了,要麼是服務端發生了錯誤。一般錯誤信息比較明顯。

總結

初學計算機網絡的時候,感覺知識又多又雜,而且單純的看書,效果比較差,而且容易犯困。其實,在我們剛開始學習一門知識的時候,首先要做的就是建立整個宏觀知識體系,然後學習工作中經常使用的部分,比如應用層,傳輸層,網絡層的基本概念。等基本的和常用的知識都學完後,結合自己的興趣再去深入的學習原理。要知道28原理,即20%的知識可以解決80%的問題。

推薦資料

《計算機網絡》謝希仁 編著(配合B站的韓立剛老師的視頻課程效果更佳)