【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息

目錄:
(一)netstat簡介
(二)netstat語法指南
(三)實戰演練
(四)netstat小結


(一)netstat簡介
(1.1)在Internet的RFC標準中,netstat的定義是:netstat是在內核中訪問網絡連接狀態及相關信息的程序,它能提供TCP連接、在TCP和UDP監聽、進程內存管理的相關報告。netstat是控制檯命令,是一個監控TCP/IP網絡的非常有用的工具,它可以顯示路由表、實際的網絡連接以及每一個網絡接口設備的狀態信息。netstat用於顯示IP、TCP、UDP和ICMP協議相關的統計數據,一般用於檢驗本機各端口的網路連接情況。如果你的計算機有時候接收到的數據包導致出錯數據或故障,你不必感到奇怪,TCP/IP可以容許這些類型的錯誤,並能夠自動重發數據包。但如果累積的出錯情況數目佔到所接收的IP數據報相當大的百分比,或者它的數目正迅速增加,那麼你就應該使用netstat查一查爲什麼會出現這些情況了。netstat命令的功能是顯示網路連接、路由表和網絡接口信息,可以讓用戶得知有哪些網絡連接正在運作。使用時如果不帶參數,netstat顯示活動的TCP連接。
(1.2)我們的服務器經常會搭建網站同時會對外提供服務,很多時候我們想要監控服務器的TCP連接信息、UDP連接信息、或者查詢有多少個用戶連接到我們的服務器等,每個用戶建立了多少個連接,因此對我們來說不管是對服務器的流量統計,對服務器的性能優化,或者對服務器的性能統計,那麼此時我們可以使用netstat命令對我們的服務器進行專門的信息統計,並且統計的網絡信息也是非常全面的。
(1.3)我們輸入netstat命令,在系統中顯示了兩列的內容,其中第一列默認列出了當前互聯網的連接信息,第二列表示的是當前UNIX的sockets的一個連接。
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息


(二)netstat語法指南
(2.1)如果我們需要顯示所有TCP連接的信息,我們可以使用“-at”參數,其中a參數表示所有信息,t參數表示tcp的連接,顯示出來我們所有TCP監聽的端口,包括我們所連接的TCP信息。如果我們使用“-au”參數,表示顯示所有的UDP連接的信息,且我們知道UDP連接的信息是無狀態的。
# netstat -at
# netstat -au
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(2.2)如果我們希望列出當前服務器中所有TCP和UDP正在監聽的端口,此時我們可以使用“-l”參數,表示列出相關符合要求的信息。比如我們現在搭建了一個web服務,我們希望現在查看一下服務運行的是否正常,我們可以使用“-lt”參數查看一下當前系統的80端口是否有監聽的狀態。
# netstat -ltu
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(2.3)如果我們需要監控我們系統實時更新的連接狀態,我們可以使用“-c”參數。
# netstat -c---查看我們的系統實時更新的連接狀態
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(2.4)如果我們需要查看系統中TCP連接的情況,並且查詢的時候不需要逆向解析,此時我們可以使用“-tn”參數(圖1-6),如果我們需要查詢當前系統所有連接的數量,可以使用“wc -l”進行統計。
# netstat -tn
# netstat -tn | wc -l
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(2.5)如果我們需要查詢當前系統所有訪問我們服務器22端口的連接的統計,這樣便可以非常精確的顯示到端口的統計信息了。
# netstat -tn | grep 192.168.26.101:22 | wc -l
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(2.6)如果我們希望對顯示的數據進行排序統計,我們使用“-tunl”其中t代表的TCP、u代表的是UDP、n代表的是直接使用IP地址不ton過域名服務器、l表示的是顯示監控中的服務器socket、p代表的是顯示正在使用socket的程序識別碼和程序名稱,此時我們可以先使用“grep :123”獲取所有爲123端口的列表項,然後使用“awk '{print $4}'”獲取第四列的信息包括IP地址與端口號,接着使用“awk -F":" '{print $1}'”獲取IP地址信息,然後使用“sort”命令進行排序,使用“uniq -c”命令進行去重,最後使用“sort -r -n”其中-n表示按照數字進行排序,-r表示逆向進行排序。
注意:sort -u命令和sort | uniq -c意義相同
# netstat -tunl | grep :123 | awk '{print $4}'| awk -F":" '{print $1}'| sort | uniq -c | sort -r -n
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(2.7)利用netstat指令可以讓你知道整個Linux系統的網絡狀況
參數:
-a:顯示所有連線中的socket
-A:<網絡類型>列出該網絡類型連線中的相關地址
-c或-continuous:持續列出網絡狀態
-C或-cache:顯示路由器配置的快取信息
-e或-extend:顯示網絡其他相關信息
-F或-fib:顯示FIB
-g或-groups:顯示多重廣播功能羣組組員名單
-h或-help:在線幫助
-i或-interfaces:顯示網絡界面信息表單
-l或-listening:顯示監控中的服務器的socket
-M或-masquerade:顯示僞裝的網絡連線
-n或-numeric:直接使用IP地址,而不通過域名服務器
-N或-netlink或-symbolic:顯示網絡硬件外圍設備的符號連接名稱
-o或-timers:顯示計時器
-P或-programs:顯示正在使用socket的程序識別碼和程序名稱
-r或-route:顯示Routing Table
-s或-statistice:顯示網絡工作信息統計表
-t或-tcp:顯示TCP傳輸協議的連線狀況
-u或-udp:顯示UDP傳輸協議的連線狀況
-v或-verbose:顯示指令執行過程
-V或-version:顯示版本信息
-w或-raw:顯示RAW傳輸協議的連線狀況
-x或-unix:此參數的效果和指定“-A unix”參數相同
-ip或-inet:此參數的效果和指定“-A inet”參數相同
(2.8)網絡連接狀態詳解
共有12種可能的狀態,前面11種是按照TCP連接建立的三次握手和TCP連接斷開的四次握手過程來描述的。
(2.8.1)LISTEN:首先服務端需要打開一個socket進行監聽,狀態爲LISTEN。(The socket is listening for incoming connections.)偵聽來自遠端TCP端口的連接請求。
(2.8.2)SYN_SENT:客戶端通過應用程序調用connect進行active open,於是客戶端tco發送一個SYN以請求建立一個連接,之後狀態置爲SYN_SENT。(The socket is actively attempting to establish a connection.)在發送連接請求後等待匹配的連接請求。
(2.8.3)SYN_RECV:服務端應發出ACK確認客戶端的SYN,同時自己向客戶端發送一個SYN,之後狀態置爲SYN_RECV。(A connection request has been received from the network.)在收到和發送一個連接請求後等待對連接請求的確認。
(2.8.4)ESTABLISHED:代表一個打開的連接,雙方可以進行或已經在數據交互了。(The socket has an established connection.)代表一個打開的連接,數據可以傳遞給用戶。
(2.8.5)FIN_WAIT1:主動關閉(active close)端應用程序調用close,於是其TCP發出FIN請求主動關閉連接,之後進入FIN_WAIT1狀態。(The socket is closed,and the connection is shutting down,waiting for the socket to close.)等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認。
(2.8.6)CLOSE_WAIT:被動關閉(passive close)端TCP接到FIN後,就發出ACK以迴應FIN請求(它的接收也作爲文件結束符傳遞給上層應用程序),並進入CLOSE_WAIT,(The remote end has shut down,waiting for teh socket to close.)等待從本地用戶發來的連接中斷請求。
(2.8.7)FIN_WAIT2:主動關閉端接收到ACK後,就進入了FIN-WAIT-2。(Connection is closed,and the socket is waiting for a shutdown from the remote end.)從遠程TCP等待連接中斷請求。
(2.8.8)LAST_ACK:被動關閉一段時間後,接收到文件結束符的應用程序將調用CLOSE關閉連接。這導致它的TCP也發送一個FIN,等待對方的ACK,就進入了LAST-ACK。(The remote end has shut down,and the socket is closed,waiting for acknowledgement.)等待原來發向遠程TCP的連接中斷請求的確認。
(2.8.9)TIME_WAIT:在主動關閉接收到FIN後,TCP就發送ACK包,並進入到TIME-WAIT狀態。(The socket is waiting after close to handle packets still in the network.)等待足夠的時間以確保遠端TCP接收到連接中斷請求的確認。
(2.8.10)CLOSING:比較少見。(Both sockets are shut down but we still don’t have all our data sent.)等待遠程TCP對連接中斷的確認。
(2.8.11)CLOSED:被動關閉端在接收到ACK包後,就進入了closed的狀態,連接結束。(The socket is not being used.)沒有任何連接狀態
(2.8.12)UNKNOWN:未知的socket狀態。(The state of the socket is unknown.)
(2.9)SYN:(同步序列編號,Synchronize Sequence Numbers)該標誌僅在三次握手建立TCP連接時有效。表示一個新的TCP連接請求。
ACK:(確認編號,Acknowledgement Number)是對TCP請求的確認標誌,同時提示對端系統已經成功接收所有數據。
FIN:(結束標誌,Finish)用來結束一個TCP會話,但對應端口仍處於開放狀態,準備接收後續數據。


(三)實戰演練
(3.1)查看TCP連接狀態
# netstat -nat | awk '{print $6}'| sort |uniq -c|sort -r -n---以倒序的方式顯示所有TCP的連接狀態
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.2)查看ESTABLISHED的連接狀態。可能你在其它語言見過int a[10];這代表有10個元素的數組,下標爲0,1,2,3...,9。而awk的下標是字符串,說白了,像極了hash,比如a[“hello”]=’world’,只不過我們稱之爲數組,同時,你要明白NF是字段數,number of filed。比如某一行文件爲hello world,那麼NF爲2但是加上$,即$NF就代表第二個字段的內容,那麼$NF爲world,現在回到正文,++S[$NF],就優點類似於,用字典統計文件,比如hello world hello,那麼++S[$NF]的結果就是s[“hello”]=2,s[“world”]=1,/^tcp/表示對每一行進行正則匹配,因爲我們netstat會產生udp的行,所以我們要用正則過濾,最後print a,S[a]就很容易懂了,就是:2 hello,1 world。
# netstat -n | awk '/^tcp/ {++S[$NF]}END {for(a in S) print a,S[a]}'---此時我們發現netstat -n第一列的ESTABLISHED的值爲1
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
# netstat -n | awk '/^tcp/{++state[$NF]}END{for(key in state)print key,"\t",state[key]}'---此時我們發現netstat -n第一列的ESTABLISHED的值爲1
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
# netstat -n | awk '/^tcp/{++arr[$NF]}END {for(k in arr)print k,"\t",arr[k]}'---此時我們發現netstat -n第一列的ESTABLISHED的值爲1
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
# netstat -n | awk '/^tcp/{print $NF}' | sort| uniq -c | sort -rn---統計ESTABLISHED出現的次數
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
# netstat -ant | awk '{print $NF}'| grep -v '[a-z]'| sort | uniq -c---統計所有狀態出現的次數
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.3)查找請求數的前20個IP
# netstat -anlp | grep 80 | grep tcp| awk '{print $5}'| awk -F: '{print $1}'| sort | uniq -c| sort -rn|head -n20---查找請求數的前20個IP
# netstat -ant | awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for (i in A)print A[i],i}'| sort -rn| head -n20---查找請求數的前20個IP
(3.4)用tcpdump嗅探80端口的訪問看看誰最高
# tcpdump -i eno16777728 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}'| sort | uniq -c | sort -nr | head -20
(3.5)查找較多time_wait連接。
# netstat -n | grep TIME_WAIT | awk '{print $5}'| sort|uniq -c| sort -rn | head -n20
(3.6)查詢較多的SYN連接。
# netstat -an | grep SYN| awk '{print $5}'| awk -F: '{print $1}' | sort | uniq -c | sort -rn |more
(3.7)根據端口列進程
# netstat -tnlp | grep 80 | awk '{print $7}'| cut -d/ -f1
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.8)網站日誌分析篇,獲得訪問前10位的IP地址
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat /etc/httpd/logs/access_log---查看web服務日誌存放的位置
# cat access_log | awk '{print $1}'| sort | uniq -c | sort -rn | head -10
# cat access_log | awk '{counts[$(11)]+=1}END{for(url in counts)print counts[url],url}'
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.9)訪問次數最多的文件或頁面,取前20
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log | awk '{print $11}' | sort | uniq -c| sort -rn | head -20
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.10)列出傳輸最大的幾個exe文件(分析下載站的時候常用)
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log |awk '($7~/.exe/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -20
(3.11)列出輸出大於200000byte(約200kb)的exe文件以及對應的文件發生次數
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log | awk '($10 > 200000 && $7~/.exe/){print $7}'| sort -n| uniq -c | sort -rn |head -10
(3.12)如果日誌最後一列記錄的是頁面文件傳輸時間,則列出到客戶端最耗時的頁面
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log |awk '($7~/.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -10
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.13)列出最耗時的頁面(超過60秒)以及對應頁面發生次數。
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log |awk '($NF > 60 && $7~/.php/){print $7}'|sort -n|uniq -c|sort -nr|head -10
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.14)列出傳輸時間超過30秒的文件
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.15)統計網站流量
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log |awk '{sum+=$10} END {print sum/1024/1024/1024}'
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.16)統計404的連接
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# awk '($9~/404/)' access_log | awk '{print $9,$7}' | sort
(3.17)統計http status,http狀態統計
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log-20190825 | awk '{counts[$(9)]+=1}END{for(code in counts)print code,counts[code]}'
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.18)查看哪些蜘蛛在抓取內容
# /usr/sbin/tcpdump -i ens32 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(3.19)按域統計流量
# zcat squid_access.log.tar.gz| awk '{print $10,$7}' |awk 'BEGIN{FS="[ /]"}{trfc[$4]+=$1}END{for(domain in trfc){printf "%s\t%d\n",domain,trfc[domain]}}'
(3.20)查看數據庫執行的SQL
# /usr/sbin/tcpdump -i ens32 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'


(四)netstat小結
(4.1)列出所有端口情況
# netstat -a---列出所有端口
# netstat -at---列出所有的TCP端口
# netstat -au---列出所有UDP端口
(4.2)列出所有處於監聽狀態的Socket
# netstat -l---只顯示監聽端口
# netstat -lt---顯示監聽TCP端口
# netstat -lu---顯示監聽UDP端口
# netstat -lx---顯示所有Unix端口
(4.3)顯示每個協議的統計信息
# netstat -s---顯示所有端口的統計信息
# netstat -st---顯示所有TCP的統計信息
# netstat -su---顯示所有UDP的統計信息
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(4.4)顯示PID和進程名稱
# netstat -p
# netstat -pt
(4.5)顯示核心路由信息
# netstat -r---顯示核心路由信息
# netstat -rn---顯示數字格式,不查詢主機名稱
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(4.6)查看端口和服務
# netstat -antp | grep ssh---查看服務
# netstat -antp | grep 22---查看端口
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(4.7)在netstat輸出中不顯示主機,端口和用戶名(host, port or user)
# netstat -an
如果只是不想讓這三個名稱中的一個被顯示,使用以下命令
# netstat -a --numeric-ports
# netstat -a --numeric-hosts
# netstat -a --numeric-users
(4.8)持續輸出netstat信息
# netstat -c---將每隔1秒輸出網絡信息
(4.9)顯示系統不支持的地址族
# netstat --verbose
(4.10)顯示網路接口列表
# netstat -i
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
# netstat -ie---顯示詳細信息,像是ifconfig列表信息
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(4.11)查看鏈接某服務端口最多的IP地址
# netstat -ant | grep "192.168.26.50:22" | awk '{print $5}'| awk -F: '{print $1}'|sort | uniq -c| sort -rn| head -10
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息
(4.12)顯示TCP各種狀態列表
# netstat -ant | awk '{print $6}'| sort | uniq -c | sort -rn
【我的Linux,我做主!】實戰--使用netstat監控網絡連接信息

—————— 本文至此結束,感謝閱讀 ——————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章