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:等待所有分組死掉
下面解釋一下為啥要這樣寫:
一個簡單的管道符連接配接了netstat和awk指令。
------------------------------------------------------------------
先來看看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制表符分割,美化一下。
如發現系統存在大量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 狀态
系統連接配接狀态篇:
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開頭的記錄,屏蔽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
本文轉自 天樂 51CTO部落格,原文連結:http://blog.51cto.com/tianlegg/1576355,如需轉載請自行聯系原作者