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來實現訪問Google。

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

服務端

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

进程是否正常

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

端口监听

客戶端

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

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

telnet连接成功

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

telnet连接失败

防火牆,安全組

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

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

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

總結

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

推薦資料

《電腦網路》謝希仁 編著(配合B站的韓立剛老師的影片課程效果更佳)

Tags: