|
部署在Linux服务器上的业务一般都是支持高并发连接的服务,如HTTP、FTP、DNS等服务器都可以提供成百上千的并发连接数。虽然日志文件可以为我们提供历史数据,但是如果想了解服务器实时的网络连接状态呢?应该什么做?Centos7系统中默认包含了ss这个工具,它可以实现类似netstat的功能,比netstat更高效,也可以显示更多有关网络连接状态的信息。但是想监控网络连接状态,熟悉TCP和UDP是必要的条件。如果不知道TCP可以参考这篇文章《网络编程-从TCP三次握手说起》和《网络编程-TCP的四次挥手》。 使用ss命令实时查看网络连接状态对于服务器的维护人员来说,监控这些服务的实时状态、统计实时并发量、分析客户端IP都是非常重要的且必须完成的任务。使用ss命令可以实时查看网络连接状态,借助于awk我们还可以非常轻松的过滤并分析这些数据。如果不知道如何使用awk可以参考这篇《linux shell脚本之awk利器》 显示所有TCP连接状态ss -at
) f$ C& W8 d% Q. ?" n 输出结果包含4列。分别对应连接状态、接收和发送的队列长度(对于ESTAB而言是未复制和未得到客户端确认的数据字节数)、服务本地监听的IP与端口信息及最后输出的远程主机IP与端口信息。 以数字格式显示2 P/ {5 I' p' B 从输出结果中可以看出,有些服务器仅处于LISTEN监听的状态,并没有任何客户端连接该服务(如mysql等),而有些服务处于ESTAB状态,表示有客户端已经与服务器建立完成了TCP握手连接(如ssh服务)。上面的输出信息说明本机ssh服务正在监听所有网卡的22端口,等待用户的连接。 ss -atn
0 Q7 E1 M2 ~4 j9 Y* ], y ss -atnp
ss -anup
ss -antu
ss -antuH
ss -antul
ss -an
ss -s
" r/ @0 Z: x6 n( ]$ ?0 g 对于ss命令的输出结果,我们还需要使用awk等工具进行过滤和统计分析工作,下面我们来写一个监控网络连接的脚本。( E; Q Q8 u, w7 p0 G5 K Q 2 Y) t) l" j4 U " a3 [0 ^* t6 a6 y! K$ o ^ #!/bin/bash1 i8 x. a; }; u; i. _6 l- k, I2 { #功能:监控网络连接状态脚本 TCP_Total=$(ss -s | awk '$1=="TCP"{print $2}') #所有TCP连接个数 UDP_Total=$(ss -s | awk '$1=="UDP"{print $2}') #所有UDP连接个数$ W c p. Q- K2 I! h+ ^9 L& ^- S Unix_sockets_Total=$(ss -ax | awk 'BEGIN{count=0} {count++} END{print count}') #所有UNIX sockets连接个数 TCP_Listen_Total=$(ss -antlpH | awk 'BEGIN{count=0} {count++} END{print count}') #所有处于Listen监听状态的TCP端口个数: L) y- U, z) E0 _% q TCP_Estab_Total=$(ss -antph | awk 'BEGIN{count=0} /^ESTAB/{count++} END{print count}') #所有处于ESTABLISHED状态TCP连接个数 TCP_SYN_RECV_Total=$(ss -antpH | awk 'BEGIN{count=0} /^SYN-RECV/{count++} END{print count}') #所有处于SYN_RECV状态的TCP连接个数) i. Z$ b# E7 y* b' Q( v ? TCP_TIME_WAIT_Total=$(ss -antpH | awk 'BEGIN{count=0} /^TIME-WAIT/{count++} END{print count}') #所有处于TIME-WAIT状态的TCP连接个数 TCP_TIME_WAIT1_Total=$(ss -antpH | awk 'BEGIN{count=0} /^TIME-WAIT1/{count++} END{print count}') #所有处于TIME-WAIT1状态的TCP连接个数& K$ x, O; W- K) o2 j$ J+ u% f TCP_TIME_WAIT2_Total=$(ss -antpH | awk 'BEGIN{count=0} /^TIME-WAIT2/{count++} END{print count}') #所有处于TIME-WAIT2状态的TCP连接个数! F- h0 Z: o: u+ R TCP_Remote_Count=$(ss -antH | awk '$1!~/LISTEN/{IP[$5]++} END{ for(i in IP) {print IP,i} }' | sort -nr) #所有远程主机TCP连接次数6 S0 d4 t$ N5 e) A TCP_Port_Count=$(ss -antH | sed -r 's/ +/ /g' | awk -F"[ :]" '$1!~/LISTEN/{port[$5]++} END{for(i in port) {print port,i}}' | sort -nr) #每个端口被访问次数7 d5 ~2 I* q9 z( D% N #定义输出颜色 r7 Y" E8 o" m( H 7 h ]: i; c1 S3 b' z% A SUCCESS="echo -en \\033[1;32m" #绿色 NORMAL="echo -en \\033[0;39m" #黑色 #显示TCP连接总数 tcp_total(){ echo -n "TCP连接总数: " $SUCCESS echo "$TCP_Total"2 G. m2 @1 z9 z$ X. X* o& ? $NORMAL* |. o5 A: q! U7 t9 B$ j } 8 X$ A3 \# X) q# H; m #显示处于LISTEN状态的TCP端口个数# O! X6 ]) K' y: N: i* L" U! x0 y tcp_listen(){ echo -n "处于LISTEN状态的TCP端口个数": O" C, M5 d1 ^' f $SUCCESS4 Y: I& |* @& O6 ^5 P; i! l! m* H# x echo "$TCP_Listen_Total" $NORMAL } #显示处于ESTABLISHED状态的TCP连接个数 tcp_estab(){ echo -n "处于ESTAB状态的TCP连接个数:"5 U/ a; S2 F7 [! e2 }$ \0 ` $SUCCESS echo "TCP_Estab_Total" $NORMAL" y/ \0 V# F! `/ U/ h, ]! ?1 H }4 w/ \) Z1 }) G1 l #显示处于SYN-RECV状态的TCP连接个数. J- R, W+ \! t( S* d1 U1 j: s tcp_syn_recv(){' k7 z! O, b# U7 Q7 n7 @ echo -n "处于SYN-RECV状态的TCP连接个数:" $SUCCESS echo "TCP_SYN_RECV_Total"0 j) f/ |: J0 ]8 m5 J+ w5 a $NORMAL } #显示处于TIME-WAIT状态的TCP连接个数& \: D' _/ a+ m: e- m tcp_time_wait(){ echo -n "处于TIME-WAIT状态的TCP连接个数:"7 l4 E7 |2 h2 \ m* i# H4 B $SUCCESS5 X" l, b3 M* L* ~5 ^ echo "$TCP_TIME_WAIT_Total" $NORMAL } % Q: [. l; Q$ m% L: P #显示处于TIME-WAIT1状态的TCP连接个数+ b) n& w ]/ h! c1 Y tcp_time_wait1(){- \! q% i3 H+ }% n4 `0 x5 b$ `, w echo -n "处于TIME-WAIT1状态的TCP连接个数:" $SUCCESS echo "$TCP_TIME_WAIT1_Total"9 B2 t4 v) i5 o/ b k $NoRMAL }/ U/ @. T& I* R1 k& A 7 v& \1 v* M6 i* f% f+ U% p #显示处于TIME-WAIT2状态的TCP连接个数 tcp_time_wait2(){; e9 M H& v# O: {( V0 o echo -n "处于TIME-WAIT2状态的TCP连接个数:"" H3 ]# o: n* X" ] $SUCCESS echo "$TCP_TIME_WAIT2_Total" $NORMAL7 [# C: m& ?' C0 R* Y0 B } J e; A* r5 R5 H #显示UDP连接总数 udp_total(){8 ~$ z1 X5 z4 ?7 S+ R" @, u- d6 F4 A echo -n "UDP连接总数:" $SUCCESS echo "$UDP_Total" $NORMAL: y1 D$ \2 t2 F2 E% {( Q }6 S+ n3 q& P+ q2 H - o( X' o0 P) K. ?3 f- d #显示UNIX sockets连接总数6 M; [& r. Z' n0 j7 o unix_total(){# P ^7 E& f: J5 _ echo -n "Unix sockets 连接总数:" $SUCCESS; Q0 M% G( Y4 z7 Q echo "$Unix_sockets_Total" $NORMAL } #显示每个远程主机的访问次数 remote_count(){7 p! O* [+ F \2 r echo -n "每个远程主机与本机的并发连接数:"- h0 q6 ^0 Z( }! b $SUCCESS I* j1 r1 r: u) g$ h1 v2 W echo "$TCP_Remote_Count"3 ]9 y6 b0 u: c- |. }; q, x( q $NORMAL }3 |5 j! @8 N( G( D* G $ `- O' n8 ^7 | #显示每个端口的并发连接数 + I) m3 e+ @7 w( h port_count(){, ]0 ^ d7 i+ ~" y echo -n "每个端口的并发连接数:" $SUCCESS g& T/ m+ r3 C' D7 K% j$ d echo "$TCP_Port_Count"7 v& N9 C! s4 b& r$ A $NORMAL: h* {+ {# ]8 _( d' J; b8 H } print_info(){ echo -e "=================================================================" $1% ~% g6 r) w7 V7 e! i } # w* B, A, `. g print_info tcp_total# v# `1 U/ `$ g1 f2 U9 Y" c. n print_info tcp_listen print_info tcp_estab+ z# s7 ^: K" a print_info tcp_syn_recv5 `, |- Y: L P! t4 b( l print_info tcp_time_wait print_info tcp_time_wait1! `& Q( ?& [3 d( `) @1 s print_info tcp_time_wait2 print_info udp_total1 w; K& w3 W. c) R) ` print_info unix_total print_info remote_count$ m1 l8 h t$ w+ j print_info port_count 5 y# H( u4 M% Q8 A: Q4 J echo -e "=================================================================" & B" U& T r- |) r$ j5 t8 L 编译输出 ; `( X: l9 j, n8 b# Z# m% T
% z+ B' U7 V5 N9 k% Q/ G 总结9 J8 F6 e4 z7 o+ ]4 f4 u 4 ?$ k7 H2 C6 G, n1 K& r( P 本文介绍了ss命令一些实用的用法。还有写一个监控网络连接状态脚本。可以显示连接个数和访问个数。如果你想使用ss命令快速检查有关套接字的各种信息,建议你查阅ss的相关帮助手册。 |
| 谢谢分享 |
微信公众号
手机版