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


3n?$U.U6{ v ^ H357760netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
R2RpZm357760
51Testing軟件測試網 O5F1u+CUB.v4]
會得到類似下面的結果,具體數字會有所不同:51Testing軟件測試網4ETTgQu,F{|X;A

9U b B}MP6T*t357760LAST_ACK         1
+N%k0F-K t7h~ M357760SYN_RECV         14
:J u6C6w&V)@-W6}*V357760ESTABLISHED      79
7vBX9J e+WM:E357760FIN_WAIT1        2851Testing軟件測試網6Ulx"r;wY%h
FIN_WAIT2        351Testing軟件測試網4oIDuVX |5y9M
CLOSING          5
+CIyQq357760TIME_WAIT        166951Testing軟件測試網2gU yjU{
51Testing軟件測試網'r_f"q,J L:J5Ej
也就是說,這條命令可以把當前系統的網絡連接狀態分類彙總。
fD-u$qq/W f357760
]&@(gR] [bA357760狀態:描述
$[ J%b"f8Ej c357760CLOSED:無連接是活動的或正在進行
v-\$[2hay357760LISTEN:服務器在等待進入呼叫51Testing軟件測試網@4K(`k v+sd
SYN_RECV:一個連接請求已經到達,等待確認
+Vd x)]7OVV9x&tl357760SYN_SENT:應用已經開始,打開一個連接
E2XN/y$d/Z357760ESTABLISHED:正常數據傳輸狀態51Testing軟件測試網5ad:K.pVZk
FIN_WAIT1:應用說它已經完成51Testing軟件測試網4v;_#F[I
FIN_WAIT2:另一邊已同意釋放51Testing軟件測試網%a7b6S m(CE1WH
ITMED_WAIT:等待所有分組死掉
V3Obew y&k&M/M`357760CLOSING:兩邊同時嘗試關閉
0Q[5u!q%zuG357760TIME_WAIT:另一邊已初始化一個釋放51Testing軟件測試網9`R[c5r;c
LAST_ACK:等待所有分組死掉
;OR"jo5aq(oy357760
3{5i#m*_A3|o357760下面解釋一下爲啥要這樣寫:
U;I7a l&KJ_0{ C!N;Q357760
2l)l{-T/fS$Cw |\n357760一個簡單的管道符連接了netstatawk命令。
p.GJ5BkX'W*dtK A35776051Testing軟件測試網 Xf`a+p6zG
------------------------------------------------------------------
yA)Y*g;I ~HV`357760
0Z3g~!O3`q4{C:@d,I357760先來看看netstat:51Testing軟件測試網[/ian$Xr\v:h O
51Testing軟件測試網Es,[-},q*G Q ^j|9E4y
netstat -n
%^ S#u(O'^:N#P"gk357760
tGE.P)or1ub LH(R357760Active Internet connections (w/o servers)51Testing軟件測試網L,GN?,_8KU
Proto Recv-Q Send-Q Local Address           Foreign Address         State51Testing軟件測試網-^0W1t5yz@'R-m
tcp        0      0 123.123.123.123:80      234.234.234.234:12345   TIME_WAIT51Testing軟件測試網2ET4q"ti0DR)z Ig

?&R0x,nQ357760你實際執行這條命令的時候,可能會得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。
!Dqvt;d$@(n357760
8d3p9Q}3KNoo357760------------------------------------------------------------------51Testing軟件測試網4SPP1cqW*LwEZ

tG W`q357760再來看看awk:
iu8b7S J&j%AzI|357760
+F%H0Kx%k-T!E U357760/^tcp/51Testing軟件測試網;F3^?S6whp^
濾出tcp開頭的記錄,屏蔽udp, socket等無關記錄。51Testing軟件測試網W!ztF^pE

2d}+bL ^8wo357760state[]相當於定義了一個名叫state的數組51Testing軟件測試網@P9QIj;f8r/Y]$C}

,w5K7q#N%bb;l)b357760NF
h-m_y N,?o1V357760表示記錄的字段數,如上所示的記錄,NF等於651Testing軟件測試網ur:d FpO(m+X
51Testing軟件測試網u3W.ei1X
$NF51Testing軟件測試網 o%C&pNu~
表示某個字段的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是TIME_WAIT
X CtD x9Ay_357760
,ozht o_.l?+l357760state[$NF]表示數組元素的值,如上所示的記錄,就是state[TIME_WAIT]狀態的連接數
#MM&v9\$_35776051Testing軟件測試網/f7e;J#P/i2@
++state[$NF]表示把某個數加一,如上所示的記錄,就是把state[TIME_WAIT]狀態的連接數加一
#kB'z9x8x)Y$g357760
g/Llyh~mYm357760END51Testing軟件測試網W6~5JP d7~Og2g
表示在最後階段要執行的命令51Testing軟件測試網;o\gT'O&B He8_

L v R$a-u+PZ^357760for(key in state)
2n` N:L}q U XS357760遍歷數組
2O1S @5y%J0AuA%Z357760
~Uy Z+Wq9Qrn3I357760print key,"\t",state[key]打印數組的鍵和值,中間用\t製表符分割,美化一下。 51Testing軟件測試網$Jw*v5Ba utv{4\
51Testing軟件測試網;Au p?'` hM[
51Testing軟件測試網)@s%w;K^_+M
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'51Testing軟件測試網-Z I8A E'G3n*LH
51Testing軟件測試網 B?Z~w-U9sL
狀態:描述
NDZ i"vA:Q;P#Ae+@{357760CLOSED:無連接是活動的或正在進行51Testing軟件測試網"Jx/oaXZ"Q
LISTEN:服務器在等待進入呼叫51Testing軟件測試網em J0{]
SYN_RECV:一個連接請求已經到達,等待確認
&Y7P.qMK?357760SYN_SENT:應用已經開始,打開一個連接51Testing軟件測試網"[2R)J7gHG q
ESTABLISHED:正常數據傳輸狀態51Testing軟件測試網&V1x0A5DkBpX
FIN_WAIT1:應用說它已經完成51Testing軟件測試網3H,g#OH$Y jc
FIN_WAIT2:另一邊已同意釋放
6J0O F3\5b357760ITMED_WAIT:等待所有分組死掉
\;Lm:jm^o357760CLOSING:兩邊同時嘗試關閉51Testing軟件測試網NFQ8\rXN/]7oH
TIME_WAIT:另一邊已初始化一個釋放
m T2?1`o(a'rE zpj t357760LAST_ACK:等待所有分組死掉51Testing軟件測試網2f-AdUF[({"{S
51Testing軟件測試網[2n U4\ W

dO6h5VIhF357760如發現系統存在大量TIME_WAIT狀態的連接,通過調整內核參數解決,51Testing軟件測試網L4^5X6k5F0mox,R `
vim /etc/sysctl.conf
|A+M&M0t V\k xg357760編輯文件,加入以下內容:
TX%db?4WTgV357760net.ipv4.tcp_syncookies = 151Testing軟件測試網 ml!y\A7L%t"gt
net.ipv4.tcp_tw_reuse = 1
6B{ A6@i|Xy357760net.ipv4.tcp_tw_recycle = 1
V?f2Vq^357760net.ipv4.tcp_fin_timeout = 3051Testing軟件測試網]0u9WC!SJ6N
然後執行 /sbin/sysctl -p 讓參數生效。51Testing軟件測試網:_ [\jn:GH&{/S"z2f
51Testing軟件測試網V+O-^i%[ qY
net.ipv4.tcp_syncookies = 1 表示開啓SYN cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少量SYN***,默認爲0,表示關閉;51Testing軟件測試網sW p Q3DIt+q&N
net.ipv4.tcp_tw_reuse = 1 表示開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉;
IzI:?)F(T(N R'U O357760net.ipv4.tcp_tw_recycle = 1 表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。
\;O4Cc@.{ }&LT8L357760net.ipv4.tcp_fin_timeout 修改系統默認的 TIMEOUT 時間51Testing軟件測試網3|;]"_Q\[

@ E/[ qt/L357760下面附上TIME_WAIT狀態的意義:
aGd!e8u P*B-`&CG35776051Testing軟件測試網X&dLhqO {3k1[
客戶端與服務器端建立TCP/IP連接後關閉SOCKET後,服務器端連接的端口
Wa-D&H4D357760狀態爲TIME_WAIT51Testing軟件測試網`2rU7q#Ie+h`1L

'W Ys:q qbE a n357760是不是所有執行主動關閉的socket都會進入TIME_WAIT狀態呢?
#FD5dO"`#B357760有沒有什麼情況使主動關閉的socket直接進入CLOSED狀態呢?51Testing軟件測試網j\j]J0urd
51Testing軟件測試網Uc'y ](V ~-zO
主動關閉的一方在發送最後一個 ack 後51Testing軟件測試網)pakmf.|}*o
就會進入 TIME_WAIT 狀態 停留2MSL(max segment lifetime)時間
'P t|vCN357760這個是TCP/IP必不可少的,也就是“解決”不了的。51Testing軟件測試網d)Woa-y:Gxu

-^*s.|M5Oy357760也就是TCP/IP設計者本來是這麼設計的
$Y`bIm3]5Bf#Q357760主要有兩個原因51Testing軟件測試網-XFb q#A"G5G_7y
1。防止上一次連接中的包,迷路後重新出現,影響新連接
4z;X!K8k:A|n;? e357760(經過2MSL,上一次連接中所有的重複包都會消失)51Testing軟件測試網-QL2w r2t-P(V3^"_
2。可靠的關閉TCP連接
8z p ^(PAtCr,I7_B357760在主動關閉方發送的最後一個 ack(fin) ,有可能丟失,這時被動方會重新發51Testing軟件測試網mxXz4B(Q j1s
fin, 如果這時主動方處於 CLOSED 狀態 ,就會響應 rst 而不是 ack。所以51Testing軟件測試網_&r J.s W4WN"R
主動方要處於 TIME_WAIT 狀態,而不能是 CLOSED 。51Testing軟件測試網1\)dG CWv)C-CNk

.sa d1t*T&s357760TIME_WAIT 並不會佔用很大資源的,除非受到***。
At#\,et:^-p5]357760
q Lj])|-MU-LfB357760還有,如果一方 send 或 recv 超時,就會直接進入 CLOSED 狀態

來源:http://www.51testing.com/?uid-116228-action-viewspace-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_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]}'
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 10
awk
'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],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 -10
cat 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
更多的請參考:

http://bbs.linuxtone.org/forum-14-1.html

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