TCP狀態統計 - 腳本命令


一、netstat命令說明

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

-p 顯示建立相關鏈接的程序名
-r 顯示路由信息,路由表
-e 顯示擴展信息,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令。

提示:LISTEN和LISTENING的狀態只有用-a或者-l才能看到

二、統計TCP狀態

統計TCP狀態:netstat -ant | awk 'NR>=3 {++State[$6]} END {for (key in State) print key,State[key]}'
                ss -ant | awk 'NR>=2 {++State[$1]} END {for (key in State) print key,State[key]}'

首先是netstat內容輸出:
[vagrant@localhost ~]$ netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 0.0.0.0:39198               0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:111                 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:25                0.0.0.0:*                   LISTEN
tcp        0      0 10.0.2.15:22                10.0.2.2:58263              ESTABLISHED
tcp        0      0 :::51041                    :::*                        LISTEN
tcp        0      0 :::111                      :::*                        LISTEN
tcp        0      0 :::22                       :::*                        LISTEN
tcp        0      0 ::1:25                      :::*                        LISTEN


命令注釋:netstat -n | awk '/^tcp/ {++state[$NF]} END {for(a in state) print a, state[a]}'

/^tcp/
濾出tcp開頭的記錄,屏蔽udp, socket等無關記錄。

state[]
相當於定義了一個名叫state的數組

NF
The number of fields in the current input record.(表示輸入數據的字段總數,如上所示的記錄,NF等於6)

$NF
表示某個字段的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是TIME_WAIT

state[$NF]
表示數組元素的值,如上所示的記錄,就是state[TIME_WAIT]狀態的連接數

++state[$NF]
表示把某個數加一,如上所示的記錄,就是把state[TIME_WAIT]狀態的連接數加一

END
表示在最后階段要執行的命令

for(key in state)
遍歷數組

print key,"\t",state[key]
打印數組的鍵和值,中間可以用\t制表符分割,美化一下。

NR>=3
The total number of input records seen so far.(NR表示已輸入數據行數目,即表示從第二行開始處理,NR和NF都是內建變量)


同理ss工具下的awk語句應該修改成:ss -ant | awk 'NR>=2 {++State[$1]} END {for (key in State) print key,State[key]}'
[root@localhost ~]# ss -ant
State       Recv-Q Send-Q                         Local Address:Port                                        Peer Address:Port
LISTEN      0      50                                         *:3306                                                   *:*
LISTEN      0      128                                        *:6379                                                   *:*
LISTEN      0      128                                        *:80                                                     *:*
LISTEN      0      128                                        *:22                                                     *:*
LISTEN      0      100                                127.0.0.1:25                                                     *:*
ESTAB       0      0                                  10.0.2.15:22                                              10.0.2.2:58352
ESTAB       0      0                                  10.0.2.15:22                                              10.0.2.2:57127
LISTEN      0      128                                       :::80                                                    :::*
LISTEN      0      32                                        :::21                                                    :::*
LISTEN      0      128                                       :::22                                                    :::*
LISTEN      0      100                                      ::1:25                                                    :::*

三、統計每個IP的連接數

統計每個IP的連接數:netstat -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c| sort -rn
                      ss -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c| sort -rn

---------------------------------------------------(netstat -n in CentOS6)----------------------------------------------------
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 10.0.2.15:22                10.0.2.2:58262              ESTABLISHED
tcp        0      0 10.0.2.15:22                10.0.2.2:58263              ESTABLISHED

---------------------------------------------------(ss -n in CentOS7)---------------------------------------------------------
Netid State      Recv-Q Send-Q                       Local Address:Port                                      Peer Address:Port
tcp   ESTAB      0      0                                10.0.2.15:22                                            10.0.2.2:58352
tcp   ESTAB      0      0                                10.0.2.15:22                                            10.0.2.2:57127


netstat -n                  :以數字形式顯示地址信息
awk '/^tcp/ {print $5}'     :篩選以tcp開頭的行,並打印5th filed.
awk -F: '{print $1}'        :以冒號為字段分隔符,打印第一個字段(-F fs 指定行中分隔數據字段的字段分隔符)
uniq -c                     :去除重復項目,-c 進行計數
sort -rn                    :進行排序,-r 反向排序 -n 使用純數字進行排序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM