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),回覆:領取學習資料。或者回復:進入技術交流羣。網盤資料有如下:

在這裏插入圖片描述

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