Linux shell 脚本实战案例:监控网络连接状态

部署在Linux服务器上的业务一般都是支持高并发连接的服务,如HTTP、FTP、DNS等服务器都可以提供成百上千的并发连接数。虽然日志文件可以为我们提供历史数据,但是如果想了解服务器实时的网络连接状态呢?应该什么做?Centos7系统中默认包含了ss这个工具,它可以实现类似netstat的功能,比netstat更高效,也可以显示更多有关网络连接状态的信息。但是想监控网络连接状态,熟悉TCP和UDP是必要的条件。如果不知道TCP可以参考这篇文章《网络编程-从TCP三次握手说起》和《网络编程-TCP的四次挥手

使用ss命令实时查看网络连接状态

对于服务器的维护人员来说,监控这些服务的实时状态、统计实时并发量、分析客户端IP都是非常重要的且必须完成的任务。使用ss命令可以实时查看网络连接状态,借助于awk我们还可以非常轻松的过滤并分析这些数据。如果不知道如何使用awk可以参考这篇《linux shell脚本之awk利器

显示所有TCP连接状态

ss -at
在这里插入图片描述

输出结果包含4列。分别对应连接状态、接收和发送的队列长度(对于ESTAB而言是未复制和未得到客户端确认的数据字节数)、服务本地监听的IP与端口信息及最后输出的远程主机IP与端口信息。

从输出结果中可以看出,有些服务器仅处于LISTEN监听的状态,并没有任何客户端连接该服务(如mysql等),而有些服务处于ESTAB状态,表示有客户端已经与服务器建立完成了TCP握手连接(如ssh服务)。上面的输出信息说明本机ssh服务正在监听所有网卡的22端口,等待用户的连接。

以数字格式显示

ss -atn

在这里插入图片描述显示对应的进程信息

ss -atnp

在这里插入图片描述
显示所有UDP连接

ss -anup
在这里插入图片描述
显示所有TCP和UDP连接

ss -antu

在这里插入图片描述

不显示标题行

ss -antuH

在这里插入图片描述
仅显示正在Listen的信息

ss -antul
在这里插入图片描述
显示所有连接信息

ss -an

在这里插入图片描述
显示数据汇总信息

ss -s

在这里插入图片描述
对于ss命令的输出结果,我们还需要使用awk等工具进行过滤和统计分析工作,下面我们来写一个监控网络连接的脚本。

#!/bin/bash

#功能:监控网络连接状态脚本

TCP_Total=$(ss -s | awk '$1=="TCP"{print $2}') #所有TCP连接个数
UDP_Total=$(ss -s | awk '$1=="UDP"{print $2}') #所有UDP连接个数
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端口个数
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连接个数
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连接个数
TCP_TIME_WAIT2_Total=$(ss -antpH | awk 'BEGIN{count=0} /^TIME-WAIT2/{count++} END{print count}') #所有处于TIME-WAIT2状态的TCP连接个数
TCP_Remote_Count=$(ss -antH | awk '$1!~/LISTEN/{IP[$5]++} END{ for(i in IP) {print IP[i],i} }' | sort -nr) #所有远程主机TCP连接次数
TCP_Port_Count=$(ss -antH | sed -r 's/ +/ /g' | awk -F"[ :]" '$1!~/LISTEN/{port[$5]++} END{for(i in port) {print port[i],i}}' | sort -nr) #每个端口被访问次数

#定义输出颜色

SUCCESS="echo -en \\033[1;32m"  #绿色
NORMAL="echo -en \\033[0;39m" #黑色

#显示TCP连接总数
tcp_total(){

	echo -n "TCP连接总数: "
	$SUCCESS
	echo "$TCP_Total"
	$NORMAL
}

#显示处于LISTEN状态的TCP端口个数

tcp_listen(){
	echo -n "处于LISTEN状态的TCP端口个数"
	$SUCCESS
	echo "$TCP_Listen_Total"
	$NORMAL
}

#显示处于ESTABLISHED状态的TCP连接个数
tcp_estab(){
	echo -n "处于ESTAB状态的TCP连接个数:"
	$SUCCESS
	echo "TCP_Estab_Total"
	$NORMAL
}

#显示处于SYN-RECV状态的TCP连接个数

tcp_syn_recv(){
	echo -n "处于SYN-RECV状态的TCP连接个数:"
	$SUCCESS
	echo "TCP_SYN_RECV_Total"
	$NORMAL
}

#显示处于TIME-WAIT状态的TCP连接个数

tcp_time_wait(){
	echo -n "处于TIME-WAIT状态的TCP连接个数:"
	$SUCCESS
	echo "$TCP_TIME_WAIT_Total"
	$NORMAL
}

#显示处于TIME-WAIT1状态的TCP连接个数
tcp_time_wait1(){
	echo -n "处于TIME-WAIT1状态的TCP连接个数:"
	$SUCCESS
	echo "$TCP_TIME_WAIT1_Total"
	$NoRMAL
}

#显示处于TIME-WAIT2状态的TCP连接个数
tcp_time_wait2(){
	echo -n "处于TIME-WAIT2状态的TCP连接个数:"
	$SUCCESS
	echo "$TCP_TIME_WAIT2_Total"
	$NORMAL
}

#显示UDP连接总数

udp_total(){
	echo -n "UDP连接总数:"
	$SUCCESS
	echo "$UDP_Total"
	$NORMAL
}

#显示UNIX sockets连接总数

unix_total(){
	echo -n "Unix sockets 连接总数:"
	$SUCCESS
	echo "$Unix_sockets_Total"
	$NORMAL
}

#显示每个远程主机的访问次数
remote_count(){
	echo -n "每个远程主机与本机的并发连接数:"
	$SUCCESS
	echo "$TCP_Remote_Count"
	$NORMAL
}

#显示每个端口的并发连接数

port_count(){
	echo -n "每个端口的并发连接数:"
	$SUCCESS
	echo "$TCP_Port_Count"
	$NORMAL
}

print_info(){
	echo -e "================================================================="
	$1
}

print_info tcp_total
print_info tcp_listen
print_info tcp_estab
print_info tcp_syn_recv
print_info tcp_time_wait
print_info tcp_time_wait1
print_info tcp_time_wait2
print_info udp_total
print_info unix_total
print_info remote_count
print_info port_count

echo -e "================================================================="

在这里插入图片描述
总结

本文介绍了ss命令一些实用的用法。还有写一个监控网络连接状态脚本。可以显示连接个数和访问个数。如果你想使用ss命令快速检查有关套接字的各种信息,建议你查阅ss的相关帮助手册。

在这里插入图片描述
欢迎关注公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:

在这里插入图片描述

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