目錄:
(一)netstat簡介
(二)netstat語法指南
(三)實戰演練
(四)netstat小結php
(一)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的一個鏈接。
web
(二)netstat語法指南
(2.1)若是咱們須要顯示全部TCP鏈接的信息,咱們可使用「-at」參數,其中a參數表示全部信息,t參數表示tcp的鏈接,顯示出來咱們全部TCP監聽的端口,包括咱們所鏈接的TCP信息。若是咱們使用「-au」參數,表示顯示全部的UDP鏈接的信息,且咱們知道UDP鏈接的信息是無狀態的。
# netstat -at
# netstat -au
(2.2)若是咱們但願列出當前服務器中全部TCP和UDP正在監聽的端口,此時咱們可使用「-l」參數,表示列出相關符合要求的信息。好比咱們如今搭建了一個web服務,咱們但願如今查看一下服務運行的是否正常,咱們可使用「-lt」參數查看一下當前系統的80端口是否有監聽的狀態。
# netstat -ltu
(2.3)若是咱們須要監控咱們系統實時更新的鏈接狀態,咱們可使用「-c」參數。
# netstat -c---查看咱們的系統實時更新的鏈接狀態
(2.4)若是咱們須要查看系統中TCP鏈接的狀況,而且查詢的時候不須要逆向解析,此時咱們可使用「-tn」參數(圖1-6),若是咱們須要查詢當前系統全部鏈接的數量,可使用「wc -l」進行統計。
# netstat -tn
# netstat -tn | wc -l
(2.5)若是咱們須要查詢當前系統全部訪問咱們服務器22端口的鏈接的統計,這樣即可以很是精確的顯示到端口的統計信息了。
# netstat -tn | grep 192.168.26.101:22 | wc -l
(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
(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的鏈接狀態
(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
# netstat -n | awk '/^tcp/{++state[$NF]}END{for(key in state)print key,"\t",state[key]}'---此時咱們發現netstat -n第一列的ESTABLISHED的值爲1
# netstat -n | awk '/^tcp/{++arr[$NF]}END {for(k in arr)print k,"\t",arr[k]}'---此時咱們發現netstat -n第一列的ESTABLISHED的值爲1
# netstat -n | awk '/^tcp/{print $NF}' | sort| uniq -c | sort -rn---統計ESTABLISHED出現的次數
# netstat -ant | awk '{print $NF}'| grep -v '[a-z]'| sort | uniq -c---統計全部狀態出現的次數
(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
(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}'
(3.9)訪問次數最多的文件或頁面,取前20
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log | awk '{print $11}' | sort | uniq -c| sort -rn | head -20
(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
(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
(3.14)列出傳輸時間超過30秒的文件
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20
(3.15)統計網站流量
# cd /etc/httpd/logs/---進入到web服務日誌存放的位置
# cat access_log |awk '{sum+=$10} END {print sum/1024/1024/1024}'
(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]}'
(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'
(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的統計信息
(4.4)顯示PID和進程名稱
# netstat -p
# netstat -pt
(4.5)顯示核心路由信息
# netstat -r---顯示核心路由信息
# netstat -rn---顯示數字格式,不查詢主機名稱
(4.6)查看端口和服務
# netstat -antp | grep ssh---查看服務
# netstat -antp | grep 22---查看端口
(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
# netstat -ie---顯示詳細信息,像是ifconfig列表信息
(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
(4.12)顯示TCP各類狀態列表
# netstat -ant | awk '{print $6}'| sort | uniq -c | sort -rn
性能優化
—————— 本文至此結束,感謝閱讀 ——————服務器