[Linux] netstat 查看網路狀態,指令範例教學


「 netstat 」是Linux查看網路連線、路由表、連接埠狀態及相關統計資訊的工具,常常被用來檢測網路環境是否正常,對於網管或相關領域的人員來說是一定要會的指令,在本文中,同樣整理一些我自己常會用到或者覺得不錯的指令參數供大家參考,並透過實際的範例說明,讓有興趣的人可以快速上手這個指令。

Linux、Windows都有netstat這個指令,但用法會有點不一樣,此處是以Linux為主
本文示範OS:Ubuntu 18.04 Server 英文版

參數說明

Parameter 說明
-a display all sockets (default: connected),顯示所有監聽、非監聽的Socket連線,包含連接埠,因為資訊量多,所以常和別的參數或grep搭配使用
-n –numeric, show numerical addresses instead of trying to determine symbolic host, port or user names. 直接以數字形式顯示位址或協定,而不去解析主機、連接埠或使用者名稱。亦可以各別設定,指定不要解析的項目,參數如下:
–numeric-hosts
–numeric-ports
–numeric-users
-s –statistics, display summary statistics for each protocol. 顯示每種協定的統計摘要資訊
-r –route, display the kernel routing tables. 顯示核心的路由表
-i –interfaces, display a table of all network interfaces. 顯示所有的網路卡資訊
-l –listening, show only listening sockets. 只顯示狀態是Listening的Socket
-t tcp. 只顯示TCP的連線資訊
-u udp. 只顯示UDP的連線資訊
-p –programs, display PID/Program name for sockets. 顯示Socket是被哪個PID/程式所使用
-e –extend, display other/more information. 顯示額外的資訊
-c –continuous, this will cause netstat to print the selected information every second continuously. 連續輸出連線資訊,一秒一次

常用範例

這邊列出幾個我自己比較常用的例子供大家參考

範例1:查詢TCP或UDP的連線資訊

-t代表顯示TCP的連線資訊,-u則是代表UDP,如果想針對TCP/UDP協定進行查閱,那麼可以利用這二個參數達成

netstat -at 或 netstat -au

顯示TCP或UDP連線

範例2:使用數字呈現主機、連接埠等資訊

即不解析主機、連接埠或使用者名稱,而用數字的方式來呈現,有時候用這種方式可以增加閱讀性,例如下圖中沒有加此參數時,資訊是呈現demo-host:ssh,而加了-n,資料就變成了172.16.66.188:22,配合grep指令有時候效果蠻不錯的

netstat -atn (以數字的方式呈現TCP連線資訊) 

numerical addresses

可以單獨指定哪個項目不要解析,例如以下是不解析Port的範例

netstat -at --numeric-ports

連續輸出連線資訊

範例3:查詢路由表資訊

在此例中,利用-r來呈現路由表資料,並用-n以數字方式呈現,這裡就可以看得出用數字呈現的好處,例如下圖的172.16.66.2通常才是我們想要的資訊

netstat -rn (以數字的方式呈現路由表資訊) 

路由表資訊

範例4:查詢網路卡資訊

透過-i來呈現網路卡簡單的資訊,這對只想要知道現在有哪幾張網路卡時特別好用,不會呈現太多不必要的資訊,另外,我通常也會注意一下RX-ERR、RX-DRP這二個資訊,分別代表在接收資料時遇到錯誤和被丟棄的封包數

netstat -i

網路卡資訊

可以再搭配-e來獲得更多的資訊,其結果和ifconfig相同

netstat -ie

網路卡額外資訊

範例5:呈現監聽狀態的資訊連線

如果只想要列出「LISTEN」監聽狀態下的資訊,則可以用-l來過濾,下圖是對比了加入-a的差別,如果有-a的參數,則會把其他非「LISTEN」狀態的資訊也一併列出

netstat -tnl (或比較常用的 netstat -tulpn)

顯示Listening狀態的連線

範例6:查看連線的統計資訊

-s會統計一些連線協定的相關摘要資訊,例如:TCP、UDP、ICMP等,我最常用的是利用-su來看查UDP的查詢結果,並觀察packet receive errors這個值,若此值一直不斷的增加,那麼可能就是有掉包的情況,至於為何掉包?原因有蠻多的,可以參考Linux 系统 UDP 丟包問題分析思路的說明

netstat -su

協定摘要資訊

範例7:查詢使用服務或Port的程式名

例如,想要查SSH服務是來自哪個程式 (範例是用字串ssh來過濾,所以不加參數n)

netstat -atp | grep ssh

查看哪個程式佔用服務

想查「22」Port是哪個程式在使用,一樣也可以
註:grep後面的-w指的是完整匹配

netstat -antp | grep -w 22

查看哪個程式佔用Port

範例8:連續輸出連線資訊

上面參數介紹中有提過,要連續輸出連線資訊的話,只要加入-c即可,範例如下,該範例會每隔一秒刷新一次資訊

netstat -atc

延伸閱讀:
[Linux] Tcpdump 擷取封包指令範例教學
[Linux] vnStat 網路流量監控工具使用教學
[Linux] Ubuntu 如何利用 Netplan 設定 固定IP