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