Linux技術——netstat命令詳解

readyao發表於2016-03-01


簡介:

Netstat 是一款命令列工具,可用於列出系統上所有的網路套接字連線情況,包括 tcp, udp 以及 unix 套接字,另外它還能列出處於監聽狀態(即等待接入請求)的套接字。
netstat - 列印網路連線、路由表、連線的資料統計、偽裝連線以及廣播域成員。


常見引數:

-a (all)顯示所有選項,預設不顯示LISTEN相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態


-p 顯示建立相關連結的程式名
-r 顯示路由資訊,路由表
-e 顯示擴充套件資訊,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令。


1、列出所有的連線

netstat -a
-a選項會列出tcp,udp和unix協議下所有套接字的連線。但是我們一般只是想查詢某個協議或某個埠的具體連線情況。

2、只列出TCP或UDP協議的連線

用-t選項列出TCP協議的連線
root@linux_ever:~# netstat -at
啟用Internet連線 (伺服器和已建立連線的)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 yxk:domain              *:*                     LISTEN     
tcp        0      0 *:ftp                   *:*                     LISTEN     
tcp        0      0 *:ssh                   *:*                     LISTEN     
tcp        0      0 localhost:ipp           *:*                     LISTEN     
tcp        0      0 *:telnet                *:*                     LISTEN     
tcp        0      0 *:echo                  *:*                     LISTEN     
tcp        0      0 localhost:mysql         *:*                     LISTEN     
tcp        0      0 *:daytime               *:*                     LISTEN     
tcp        0      0 192.168.56.101:ssh      192.168.56.1:46119      ESTABLISHED
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
tcp6       0      0 ip6-localhost:ipp       [::]:*                  LISTEN     
tcp6       0      0 [::]:3128               [::]:*                  LISTEN     
tcp6       0      0 [::]:http               [::]:*                  LISTEN     
tcp6       1      0 ip6-localhost:53757     ip6-localhost:ipp       CLOSE_WAIT 
tcp6       1      0 ip6-localhost:53820     ip6-localhost:ipp       CLOSE_WAIT

用-u選項列出UDP協議的連線
root@linux_ever:~# netstat -au
啟用Internet連線 (伺服器和已建立連線的)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
udp        0      0 *:ipp                   *:*                                
udp        0      0 *:mdns                  *:*                                
udp        0      0 *:46678                 *:*                                
udp        0      0 *:51196                 *:*                                
udp        0      0 yxk:domain              *:*                                
udp        0      0 *:bootpc                *:*                                
udp        0      0 *:59784                 *:*                                
udp6       0      0 [::]:49703              [::]:*                             
udp6       0      0 [::]:56256              [::]:*                             
udp6       0      0 ip6-localhost:56355     ip6-localhost:42658     ESTABLISHED
udp6       0      0 [::]:mdns               [::]:*                             
udp6       0      0 ip6-localhost:42658     ip6-localhost:56355     ESTABLISHED
udp6       0      0 [::]:36927              [::]:* 

3. 禁用反向域名解析,加快查詢速度

預設情況下 netstat 會通過反向域名解析技術查詢每個 IP 地址對應的主機名。這會降低查詢速度。如果你覺得 IP 地址已經足夠,而沒有必要知道主機名,就使用 -n 選項禁用域名解析功能。

root@linux_ever:~# netstat -ant
啟用Internet連線 (伺服器和已建立連線的)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:7               0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:13              0.0.0.0:*               LISTEN     
tcp        0      0 192.168.56.101:22       192.168.56.1:46119      ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 :::3128                 :::*                    LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       1      0 ::1:53757               ::1:631                 CLOSE_WAIT 
tcp6       1      0 ::1:53820               ::1:631                 CLOSE_WAIT

tcp        0      0 192.168.56.101:22       192.168.56.1:46119      ESTABLISHED 是用ssh協議登入到主機的,所以可以看到這是建立的一條tcp連線。

4. 只列出監聽中的連線

任何網路服務的後臺程式都會開啟一個埠,用於監聽接入的請求。這些正在監聽的套接字也和連線的套接字一樣,也能被 netstat 列出來。使用 -l 選項列出正在監聽的套接字。
root@linux_ever:~# netstat -tnl
啟用Internet連線 (僅伺服器)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:7               0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:13              0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 :::3128                 :::*                    LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN

現在我們可以看到處於監聽狀態的 TCP 埠和連線。如果你檢視所有監聽埠,去掉 -t 選項。如果你只想檢視 UDP 埠,使用 -u 選項,代替 -t 選項。
root@linux_ever:~# netstat -unl
啟用Internet連線 (僅伺服器)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
udp        0      0 0.0.0.0:631             0.0.0.0:*                          
udp        0      0 0.0.0.0:5353            0.0.0.0:*                          
udp        0      0 0.0.0.0:46678           0.0.0.0:*                          
udp        0      0 0.0.0.0:51196           0.0.0.0:*                          
udp        0      0 127.0.1.1:53            0.0.0.0:*                          
udp        0      0 0.0.0.0:68              0.0.0.0:*                          
udp        0      0 0.0.0.0:59784           0.0.0.0:*                          
udp6       0      0 :::49703                :::*                               
udp6       0      0 :::56256                :::*                               
udp6       0      0 :::5353                 :::*                               
udp6       0      0 :::36927                :::* 

5. 獲取程式名、程式號以及使用者ID

檢視埠和連線的資訊時,能檢視到它們對應的程式名和程式號對系統管理員來說是非常有幫助的。舉個例子,Apache 的 httpd 服務開啟80埠,如果你要檢視 http 服務是否已經啟動,或者 http 服務是由 apache 還是 nginx 啟動的,這時候你可以看看程式名。

使用 -p 選項檢視程式資訊。
root@linux_ever:~# netstat -tnlp
啟用Internet連線 (僅伺服器)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      1112/dnsmasq    
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      826/vsftpd      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      813/sshd        
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      3517/cupsd      
tcp        0      0 0.0.0.0:23              0.0.0.0:*               LISTEN      815/xinetd      
tcp        0      0 0.0.0.0:7               0.0.0.0:*               LISTEN      815/xinetd      
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      933/mysqld      
tcp        0      0 0.0.0.0:13              0.0.0.0:*               LISTEN      815/xinetd      
tcp6       0      0 :::22                   :::*                    LISTEN      813/sshd        
tcp6       0      0 ::1:631                 :::*                    LISTEN      3517/cupsd      
tcp6       0      0 :::3128                 :::*                    LISTEN      945/squid3      
tcp6       0      0 :::80                   :::*                    LISTEN      1158/apache2 
使用 -p 選項時,netstat 必須執行在 root 許可權之下,不然它就不能得到執行在 root 許可權下的程式名,而很多服務包括 http 和 ftp 都執行在 root 許可權之下。
相比程式名和程式號而言,檢視程式的擁有者會更有用。使用 -ep 選項可以同時檢視程式名和使用者名稱。

root@linux_ever:~# netstat -ltep
啟用Internet連線 (僅伺服器)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
tcp        0      0 yxk:domain              *:*                     LISTEN      root       10511       1112/dnsmasq    
tcp        0      0 *:ftp                   *:*                     LISTEN      root       8890        826/vsftpd      
tcp        0      0 *:ssh                   *:*                     LISTEN      root       9398        813/sshd        
tcp        0      0 localhost:ipp           *:*                     LISTEN      root       19363       3517/cupsd      
tcp        0      0 *:telnet                *:*                     LISTEN      root       9559        815/xinetd      
tcp        0      0 *:echo                  *:*                     LISTEN      root       9558        815/xinetd      
tcp        0      0 localhost:mysql         *:*                     LISTEN      mysql      10645       933/mysqld      
tcp        0      0 *:daytime               *:*                     LISTEN      root       9557        815/xinetd      
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      root       9400        813/sshd        
tcp6       0      0 ip6-localhost:ipp       [::]:*                  LISTEN      root       19362       3517/cupsd      
tcp6       0      0 [::]:3128               [::]:*                  LISTEN      root       200066      945/squid3      
tcp6       0      0 [::]:http               [::]:*                  LISTEN      root       10582       1158/apache2

上面列出 TCP 協議下的監聽套接字,同時顯示程式資訊和一些額外資訊。這些額外的資訊包括使用者名稱和程式的索引節點號。這個命令對網管來說很有用。

6. 列印統計資料

netstat 可以列印出網路統計資料,包括某個協議下的收發包數量。選項是-s
下面列出所有網路包的統計情況:

root@linux_ever:~# netstat -s
Ip:
    共計收到421162個資料包
    0 已轉發
    0 incoming packets discarded
    419945 incoming packets delivered
    245868請求已發出
    436 發出的報被拋棄
    127 被拋棄,因為沒有路由
Icmp:
    6202 ICMP messages received
    18 input ICMP message failed.
    InCsumErrors: 18
    ICMP接收歷史
        目的地址不可達:6117
        echo requests: 36
        echo replies: 31
    6296 ICMP messages sent
    0 ICMP messages failed
    ICMP發出歷史
        目的地址不可達:6229
        echo request: 31
        echo replies: 36

如果想只列印出 TCP 或 UDP 協議的統計資料,只要加上對應的選項(-t 和 -u)即可。
比如:
root@linux_ever:~# netstat -su
IcmpMsg:
    InType0: 31
    InType3: 6117
    InType8: 36
    OutType0: 36
    OutType3: 6229
    OutType8: 31
Udp:
    22928 packets received
    6226 packets to unknown port received.
    0 packet receive errors
    24063 packets sent
UdpLite:
IpExt:
    InNoRoutes: 107
    InMcastPkts: 17763
    OutMcastPkts: 1007
    InBcastPkts: 181400
    InOctets: 87091549
    OutOctets: 93256156
    InMcastOctets: 1948386
    OutMcastOctets: 129620
    InBcastOctets: 15828501
    InNoECTPkts: 443329

7. 顯示核心路由資訊

使用 -r 選項列印核心路由資訊。列印出來的資訊與 route 命令輸出的資訊一樣。我們也可以使用 -n 選項禁止域名解析。
root@linux_ever:~# netstat -rn
核心 IP 路由表
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.56.0    0.0.0.0         255.255.255.0   U         0 0          0 eth0

8. 列印網路介面

netstat 也能列印網路介面資訊,-i 選項就是為這個功能而生。
root@linux_ever:~# netstat -i
Kernel Interface table
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500 0    434501      0      0 0        222915      0      0      0 BMRU
lo        65536 0     36530      0      0 0         36530      0      0      0 LRU
上面輸出的資訊比較原始。我們將 -e 選項和 -i 選項搭配使用,可以輸出使用者友好的資訊。並且和ifconfig命令輸出的結果是一樣的。
root@linux_ever:~# netstat -ie
Kernel Interface table
eth0      Link encap:乙太網  硬體地址 08:00:27:23:9c:b4  
          inet 地址:192.168.56.101  廣播:192.168.56.255  掩碼:255.255.255.0
          inet6 地址: fe80::a00:27ff:fe23:9cb4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  躍點數:1
          接收資料包:434595 錯誤:0 丟棄:0 過載:0 幀數:0
          傳送資料包:222934 錯誤:0 丟棄:0 過載:0 載波:0
          碰撞:0 傳送佇列長度:1000 
          接收位元組:93754320 (93.7 MB)  傳送位元組:95995756 (95.9 MB)

lo        Link encap:本地環回  
          inet 地址:127.0.0.1  掩碼:255.0.0.0
          inet6 地址: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  躍點數:1
          接收資料包:36536 錯誤:0 丟棄:0 過載:0 幀數:0
          傳送資料包:36536 錯誤:0 丟棄:0 過載:0 載波:0
          碰撞:0 傳送佇列長度:0 
          接收位元組:2911517 (2.9 MB)  傳送位元組:2911517 (2.9 MB)

9. netstat 持續輸出

我們可以使用 netstat 的 -c 選項持續輸出資訊。
比如 netstat -ct 這個命令可持續輸出 TCP 協議資訊。會持續輸出下面的內容。
root@linux_ever:~# netstat -ct
啟用Internet連線 (w/o 伺服器)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 192.168.56.101:ssh      192.168.56.1:46119      ESTABLISHED
tcp6       1      0 ip6-localhost:53757     ip6-localhost:ipp       CLOSE_WAIT 
tcp6       1      0 ip6-localhost:53820     ip6-localhost:ipp       CLOSE_WAIT 
啟用Internet連線 (w/o 伺服器)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 192.168.56.101:ssh      192.168.56.1:46119      ESTABLISHED
tcp6       1      0 ip6-localhost:53757     ip6-localhost:ipp       CLOSE_WAIT 
tcp6       1      0 ip6-localhost:53820     ip6-localhost:ipp       CLOSE_WAIT

10. 顯示多播組資訊

選項 -g 會輸出 IPv4 和 IPv6 的多播組資訊。
root@linux_ever:~# netstat -g
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      224.0.0.1
eth0            1      224.0.0.251
eth0            1      224.0.0.1
lo              1      ip6-allnodes
getnameinfo failed
lo              1      [未知]
getnameinfo failed
eth0            1      [未知]
getnameinfo failed
eth0            1      [未知]
eth0            1      ip6-allnodes
getnameinfo failed
eth0            1      [未知]

11、列印 active 狀態的連線

active 狀態的套接字連線用 "ESTABLISHED" 欄位表示,所以我們可以使用 grep 命令獲得 active 狀態的連線:

root@linux_ever:~# netstat -atnp | grep ESTA
tcp        0     52 192.168.56.101:22       192.168.56.1:46119      ESTABLISHED 10964/1 

配合 watch 命令監視 active 狀態的連線:
$ watch -d -n0 "netstat -atnp | grep ESTA"

12、檢視服務是否在執行

如果你想看看 http,smtp 或 ntp 服務是否在執行,使用 grep。
root@linux_ever:~# netstat -aple | grep http
tcp6       0      0 [::]:http               [::]:*                  LISTEN      root       10582       1158/apache2 
從這裡可以看到 http 服務正在執行。


參考文章:


相關文章