使用netstat和awk命令來統計網絡連接數

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\\t",state[key]}'
會得到類似下面的結果,具體數字會有所不同:

LAST_ACK         1
SYN_RECV         14
ESTABLISHED      79
FIN_WAIT1        28
FIN_WAIT2        3
CLOSING          5
TIME_WAIT        1669

也就是說,這條命令可以把當前系統的網絡連接狀態分類彙總。

狀態:描述
CLOSED:無連接是活動的或正在進行
LISTEN:服務器在等待進入呼叫
SYN_RECV:一個連接請求已經到達,等待確認
SYN_SENT:應用已經開始,打開一個連接
ESTABLISHED:正常數據傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉

下面解釋一下爲啥要這樣寫:

一個簡單的管道符連接了netstatawk命令。

------------------------------------------------------------------

先來看看netstat:

netstat -n

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 123.123.123.123:80      234.234.234.234:12345   TIME_WAIT

你實際執行這條命令的時候,可能會得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。

------------------------------------------------------------------

再來看看awk:

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

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

NF
表示記錄的字段數,如上所示的記錄,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製表符分割,美化一下。


netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\\t",state[key]}'

狀態:描述
CLOSED:無連接是活動的或正在進行
LISTEN:服務器在等待進入呼叫
SYN_RECV:一個連接請求已經到達,等待確認
SYN_SENT:應用已經開始,打開一個連接
ESTABLISHED:正常數據傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉


如發現系統存在大量TIME_WAIT狀態的連接,通過調整內核參數解決,
vim /etc/sysctl.conf
編輯文件,加入以下內容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然後執行 /sbin/sysctl -p 讓參數生效。

net.ipv4.tcp_syncookies = 1 表示開啓SYN cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少量SYN***,默認爲0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 表示開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。
net.ipv4.tcp_fin_timeout 修改系默認的 TIMEOUT 時間

下面附上TIME_WAIT狀態的意義:

客戶端與服務器端建立TCP/IP連接後關閉SOCKET後,服務器端連接的端口
狀態爲TIME_WAIT

是不是所有執行主動關閉的socket都會進入TIME_WAIT狀態呢?
有沒有什麼情況使主動關閉的socket直接進入CLOSED狀態呢?

主動關閉的一方在發送最後一個 ack 後
就會進入 TIME_WAIT 狀態 停留2MSL(max segment lifetime)時間
這個是TCP/IP必不可少的,也就是“解決”不了的。

也就是TCP/IP設計者本來是這麼設計的
主要有兩個原因
1。防止上一次連接中的包,迷路後重新出現,影響新連接
(經過2MSL,上一次連接中所有的重複包都會消失)
2。可靠的關閉TCP連接
在主動關閉方發送的最後一個 ack(fin) ,有可能丟失,這時被動方會重新發
fin, 如果這時主動方處於 CLOSED 狀態 ,就會響應 rst 而不是 ack。所以
主動方要處於 TIME_WAIT 狀態,而不能是 CLOSED 。

TIME_WAIT 並不會佔用很大資源的,除非受到***。

還有,如果一方 send 或 recv 超時,就會直接進入 CLOSED 狀態
來源:http://www.51testing.com/?uid-11 ... space-itemid-219725

系統連接狀態篇:
1.查看TCP連接狀態
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
netstat -n |awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
netstat -n |
awk '/^tcp/ {++state[$NF]} END {for(key in state) print
/^tcp/
濾出tcp開頭的記錄,屏蔽udp,
socket等無關記錄。state[]
相當於定義了一個名叫state的數組NF
表示記錄的字段數,如上所示的記錄,NF等於6$NF
表示某個字段的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是TIME_WAITstate[$NF]
表示數組元素的值,如上所示的記錄,就是state[TIME_WAIT]狀態的連接數++state[$NF]
表示把某個數加一,如上所示的記錄,就是把state[TIME_WAIT]狀態的連接數加一END
表示在最後階段要執行的命令for(key in
state)
遍歷數組print
key,"\\t",state[key]
打印數組的鍵和值,中間用\\t製表符分割,美化一下。netstat -n |awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\\t",state[key]}'netstat -n |awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\\t",arr[k]}'netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
netstat -ant |awk '{print $NF}'|grep -v '[a-z]'|sort |uniq -c
netstat -ant|awk '/ip:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}'|sort -n
netstat -ant|awk '/:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}'|sort -rn|head -n 10awk'BEGIN{printf ("http_code\\tcount_num\\n")}{COUNT[$10]++}END{for (a in COUNT) printf a"\\t\\t"COUNT[a]"\\n"}'

2.查找請求數請20個IP(常用於查找攻來源):
netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F:'{print $1}'|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A,i}'|sort -rn|head -n20
3.用tcpdump嗅探80端口的訪問看看誰最高
tcpdump -i eth0 -tnn dst port 80-c 1000|awk -F"."'{print $1"."$2"."$3"."$4}'|sort |uniq -c |sort -nr |head -20
4.查找較多time_wait連接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
5.找查較多的SYN連接
netstat -an |grep SYN |awk '{print $5}'|awk -F:'{print $1}'|sort |uniq -c |sort -nr |more
6.根據端口列進程
netstat -ntlp |grep 80|awk '{print $7}'|cut -d/-f1
網站日誌分析篇1(Apache)
1.獲得訪問前10位的ip地址
cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}
2.訪問次數最多的文件或頁面,取前20
cat access.log|awk '{print $11}'|sort|uniq -c|sort -nr|head -20
3.列出傳輸最大的幾個exe文件(分析下載站的時候常用)
cat access.log |awk '($7~/\\.exe/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -20
4.列出輸出大於200000byte(約200kb)的exe文件以及對應文件發生次數
cat access.log |awk '($10 > 200000 && $7~/\\.exe/){print $7}'|sort -n|uniq -c|sort -nr|head -100
5.如果日誌最後一列記錄的是頁面文件傳輸時間,則有列出到客戶端最耗時的頁面
cat access.log |awk '($7~/\\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100
6.列出最最耗時的頁面(超過60秒的)的以及對應頁面發生次數
cat access.log |awk '($NF > 60 && $7~/\\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
7.列出傳輸時間超過 30 秒的文件
cat access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20
8.統計網站流量(G)
cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'
9.統計404的連接
awk '($9 ~/404/)'access.log |awk '{print $9,$7}'|sort
10. 統計http status.
cat access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'cat access.log|awk '{print $9}'|sort|uniq -c|sort -rn
11.每秒併發:
awk '{if($9~/200|30|404/)COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}'|sort -k 2-nr|head -n10
12.帶寬統計
cat apache.log |awk '{if($7~/GET/) count++}END{print "client_request="count}'cat apache.log |awk'{BYTE+=$11}END{print "client_kbyte_out="BYTE/1024"KB"}'
13.統計對象數量及對象平均大小
cat access.log |awk '{byte+=$10}END{ print byte/NR/1024,NR}'cat access.log |awk'{if($9~/200|30/)COUNT[$NF]++}END{for( a in COUNT) print a,COUNT
[a],NR,COUNT[a]/NR*100"%"}
14.取5分鐘日誌
if[$DATE_MINUTE !=$DATE_END_MINUTE ];then#則判斷開始時間戳與結束時間戳是否相等START_LINE=`sed -n "/$DATE_MINUTE/=" $APACHE_LOG|head -n1`#如果不相等,則取出開始時間戳的行號,與結束時間戳的行號#END_LINE=`sed -n "/$DATE_END_MINUTE/=" $APACHE_LOG|tail -n1`END_LINE=`sed -n "/$DATE_END_MINUTE/=" $APACHE_LOG|head -n1`sed -n "${START_LINE},${END_LINE}p"$APACHE_LOG>$MINUTE_LOG ##通過行號,取出5分鐘內的日誌內容 存放到 臨時文件中GET_START_TIME=`sed -n "${START_LINE}p" $APACHE_LOG|awk -F '[' '{print $2}' |awk '{print $1}'|
sed 's#/# #g'|sed 's#:# #'`#通過行號獲取取出開始時間戳GET_END_TIME=`sed -n "${END_LINE}p" $APACHE_LOG|awk -F '[' '{print $2}' |awk '{print $1}'|sed
's#/# #g'|sed 's#:# #'`#通過行號獲取結束時間戳
10.蜘蛛分析
查看是哪些蜘蛛在抓取內容。
/usr/sbin/tcpdump -i eth0 -l -s 0-w -dst port 80|strings |grep -i user-agent |grep -i -E'bot|crawler|slurp|spider'
網站日分析2(Squid篇)
2.按域統計流量
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]}}'效率更高的perl版本請到此下載:http://docs.linuxtone.org/soft/tools/tr.pl
數據庫篇
1.查看數據庫執行的sql
/usr/sbin/tcpdump -i eth0 -s 0-l -w -dst port 3306|strings |egrep -i'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'
系統Debug分析篇
1.調試命令
strace -p pid
2.跟蹤指定進程的PID
gdb -p pid
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章