這里我們使用zabbix對其進(jìn)行監控,使用的是ss命令,不使用netstat命令,因為ss的速度快很多,不信的話(huà)可以去測一下哈,一臺機器的socket越多,對比越明顯。而且ss命令能顯示更多的內容,其實(shí)我對這兩個(gè)命令不是特別的熟悉,通過(guò)man ss可以看到:
ss命令用于顯示socket狀態(tài). 他可以顯示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix domain sockets等等統計. 它比其他工具展示等多tcp和state信息. 它是一個(gè)非常實(shí)用、快速、有效的跟蹤IP連接和sockets的新工具.SS命令可以提供如下信息:
很多流行的Linux發(fā)行版都支持ss以及很多監控工具使用ss命令.熟悉這個(gè)工具有助于您更好的發(fā)現與解決系統性能問(wèn)題.本人強烈建議使用ss命令替代netstat部分命令,例如netsat -ant/lnt等
直接ss命令
對上面解釋一波:
Netid #socket類(lèi)型,在上面的例子中,有 TCP、u_str(unix流)等套接字 State #套接字處于什么狀態(tài),下面是TCP套接字的所有狀態(tài)及說(shuō)明, 實(shí)際上就是TCP的三次握手和四次揮手的所有狀態(tài) Recv-Q #在 ESTAB 狀態(tài)下,表示內核中還有多少字節的數據沒(méi)有被上層應用讀取,如果這里數值很大,應用程序可能發(fā)生了阻塞 Send-Q #在 ESTAB 狀態(tài)下,表示內核發(fā)送隊列中還有多少字節的數據沒(méi)有收到確認的ACK,如果這個(gè)數值很大,表明接收端的接收以及處理需要加強 Local Address:Port #本地地址和端口 Peer Address:Port #遠程地址和端口
然后我們接著(zhù)看上面的state有哪些呢,如果特別熟悉網(wǎng)絡(luò )的人應該很懂,至少我現在是不是特別熟悉,三次握手和四次揮手的狀態(tài):
LISTEN #服務(wù)端偵聽(tīng)套接字等待客戶(hù)端的連接 SYN-SENT #客戶(hù)端已發(fā)送套接字連接請求報文,等待連接被服務(wù)器接收 SYN-RECEIVED #服務(wù)器端接收連接請求報文后,等待客戶(hù)端的確認連接的回復報文 ESTABLISHED #服務(wù)端和客戶(hù)端之間成功建立了一條有效的連接,可以互相傳輸數據 FIN-WAIT-1 #服務(wù)器或客戶(hù)端調用close函數主動(dòng)向對方發(fā)出終止連接的請求報文,同時(shí)等待對方確認終止連接的回復報文 FIN-WAIT-2 #主動(dòng)關(guān)閉連接端收到對方確認終止連接的回復報文,同時(shí)等待對方連接終止的請求報文,這時(shí)的狀態(tài)是TCP連接的半關(guān)閉狀態(tài),可以接受數據,但是不能發(fā)送數據 CLOSE-WAIT #被動(dòng)關(guān)閉端收到主動(dòng)關(guān)閉端終止連接的請求報文后,向主動(dòng)關(guān)閉端發(fā)送確認終止連接的回復報文,同時(shí)被動(dòng)關(guān)閉端等待本地用戶(hù)終止連接,這時(shí)被動(dòng)關(guān)閉端的狀態(tài)是TCP連接的半關(guān)閉狀態(tài),可以發(fā)送數據,但是不能接收數據 CLOSING #服務(wù)器和客戶(hù)端同時(shí)向對方發(fā)送終止連接(調用close函數)請求報文,并且雙方都是在收到對方發(fā)送的終止連接回復報文之前收到了對方的發(fā)送的終止連接請求報文,這個(gè)時(shí)候雙方都進(jìn)入了CLOSING狀態(tài),進(jìn)入CLOSING狀態(tài)之后,只要收到了對方對自己終止連接的回復報文,就會(huì )進(jìn)入TIME-WAIT狀態(tài),所以CLOSING狀態(tài)的持續時(shí)間會(huì )特別短,一般很難捕獲到 LAST-ACK #被動(dòng)關(guān)閉端發(fā)送完全部數據之后,向主動(dòng)關(guān)閉端發(fā)送終止連接的請求報文,等待主動(dòng)關(guān)閉端發(fā)送終止連接的回復報文 TIME-WAIT #主動(dòng)關(guān)閉端收到被動(dòng)關(guān)閉端終止連接的請求報文后,給被動(dòng)關(guān)閉端發(fā)送終止連接的回復報文,等待足夠時(shí)間以確保被動(dòng)關(guān)閉端收到了主動(dòng)關(guān)閉段發(fā)送的終止連接的回復報文 CLOSED #完全沒(méi)有連接,套接字連接已經(jīng)終止了
那么這些狀態(tài)ss命令又怎么對應呢?(后面的是ss命令顯示的狀態(tài)信息)
[TCP_ESTABLISHED] = "ESTAB", [TCP_SYN_SENT] = "SYN-SENT", [TCP_SYN_RECV] = "SYN-RECV", [TCP_FIN_WAIT1] = "FIN-WAIT-1", [TCP_FIN_WAIT2] = "FIN-WAIT-2", [TCP_TIME_WAIT] = "TIME-WAIT", [TCP_CLOSE] = "UNCONN", [TCP_CLOSE_WAIT] = "CLOSE-WAIT", [TCP_LAST_ACK] = "LAST-ACK", [TCP_LISTEN] = "LISTEN", [TCP_CLOSING] = "CLOSING",
江到這里其實(shí)就可以去做下面的監控了,繼續往下看ss命令的使用。
Usage: ss [ OPTIONS ]
ss [ OPTIONS ] [ FILTER ]
-h, --help 幫助信息 -V, --version 程序版本信息 -n, --numeric 不解析服務(wù)名稱(chēng) -r, --resolve 解析主機名 -a, --all 顯示所有套接字(sockets) -l, --listening 顯示監聽(tīng)狀態(tài)的套接字(sockets) -o, --options 顯示計時(shí)器信息 -e, --extended 顯示詳細的套接字(sockets)信息 -m, --memory 顯示套接字(socket)的內存使用情況 -p, --processes 顯示使用套接字(socket)的進(jìn)程 -i, --info 顯示 TCP內部信息 -s, --summary 顯示套接字(socket)使用概況 -4, --ipv4 僅顯示IPv4的套接字(sockets) -6, --ipv6 僅顯示IPv6的套接字(sockets) -0, --packet 顯示 PACKET 套接字(socket) -t, --tcp 僅顯示 TCP套接字(sockets) -u, --udp 僅顯示 UCP套接字(sockets) -d, --dccp 僅顯示 DCCP套接字(sockets) -w, --raw 僅顯示 RAW套接字(sockets) -x, --unix 僅顯示 Unix套接字(sockets) -f, --family=FAMILY 顯示 FAMILY類(lèi)型的套接字(sockets),FAMILY可選,支持 unix, inet, inet6, link, netlink -A, --query=QUERY, --socket=QUERY QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY] -D, --diag=FILE 將原始TCP套接字(sockets)信息轉儲到文件 -F, --filter=FILE 從文件中都去過(guò)濾器信息 FILTER := [ state TCP-STATE ] [ EXPRESSION ]
重點(diǎn)在下面的監控
做這個(gè)監控前可以熟悉下awk命令
這是使用的監控系統為zabbix,我們這里會(huì )結合zabbix的模板(這里選擇模板是為了后期拓展),和自定義腳本的方式進(jìn)行監控。
二話(huà)不多說(shuō)上腳本先:
vim tcp_status.sh #################腳本內容################# #!/bin/bash if [ $# -ne 1 ];then echo "Follow the script name with an argument " fi case $1 in LISTEN) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/LISTEN/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; ESTAB) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/ESTAB/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; CLOSE-WAIT) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/CLOSE-WAIT/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; TIME-WAIT) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/TIME-WAIT/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; SYN-SENT) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/SYN-SENT/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; SYN-RECV) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/SYN-RECV/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; FIN-WAIT-1) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/FIN-WAIT-1/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; FIN-WAIT-2) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/FIN-WAIT-2/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; UNCONN) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/UNCONN/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; LAST-ACK) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/LAST-ACK/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; CLOSING) result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | awk '/CLOSING/{print $2}'` if [ "$result" == "" ];then echo 0 else echo $result fi ;; esac
vim zabbix_agent.conf ##############添加如下內容################# UnsafeUserParameters=1 #這個(gè)參數是自定義腳本需要配置的 UserParameter=tcp.status[*],sh /home/zabbix/tcp_status.sh $1 #這里就是用來(lái)指定剛剛寫(xiě)的腳本,后面傳一個(gè)參數
配置好了以后記得重啟zabbix agent
往其中添加item,trigger,graph
新增模板,然后往其中添加item,如下圖所示
上圖中key中的tcp.status指的是剛剛在第二步中的配置UserParameter=tcp.status[*],sh /home/zabbix/tcp_status.sh \$1
然后中括號里面的內容就是\$1進(jìn)行傳參的參數,具體的參數就是[UNCONN]里面的UNCONN,這些值對應第一步監控腳本中的case中的每一種情況,到這里基本上完成了,不,還是畫(huà)個(gè)圖吧,在模板中添加graph,如下圖所示:
還有最重要的一步就是把配置好監控腳本的(第一步)的主機添加到該模板,到此為止這個(gè)監控就做完了,看個(gè)結果圖吧
這個(gè)監控的目的就是看看到底是哪些機器訪(fǎng)問(wèn)目標機器比較頻繁。
這個(gè)監控采用自發(fā)現的監控,比上面那個(gè)會(huì )難一點(diǎn)哈,為啥要選擇自發(fā)現的監控呢,因為item不是確定的,這里選擇:原地址ip和目的ip地址作為item,我們在目的ip地址進(jìn)行監控,這個(gè)是不變的,所以原地址ip值會(huì )發(fā)生變化,所以這里采用的是自動(dòng)生成item的方式進(jìn)行監控,自動(dòng)添加和刪除item,其實(shí)挺好用的,只要學(xué)會(huì )了,超級簡(jiǎn)單
這里也是分為三步,寫(xiě)腳本,配置zabbix_agent.conf文件,配置Discovery
這里需要兩個(gè)腳本,一個(gè)用來(lái)做自發(fā)現(需要輸出json格式),一個(gè)用來(lái)做item的)
vim tcp_monitory.sh ##################tcp_monitor.sh################## #!/bin/bash #獲取數據輸出到data.txt文件中,格式為:原地址ip:count:目標地址ip #并且過(guò)濾掉count小于200的數據,這里沒(méi)有分socket的狀態(tài),眉毛胡子一把抓了,個(gè)人可以根據具體的需求改進(jìn) ip_addr=`ip addr | grep -w inet | grep -v "127.0.0.1" | awk '{print $2}'| awk -F "/" '{print $1}'` ss -ant | awk '{ print $5}'|grep -Ev '127.0.0.1' | cut -d ':' -f4 | awk -v ip_addr=$ip_addr 'NR>1 {++s[$1]} END {for(k in s)if(s[k]>=200){print k,s[k],ip_addr}}' | grep -E "^([0-9]{1,3}\.){3}[0-9]" > /home/zabbix/data.txt #執行Python腳本,這是為了輸出json格式, python /home/zabbix/get_json.py ##################################### #如下是get_json.py的內容 ##############get_json.py################ #!/usr/bin/env python #coding=utf-8 import json def create_json(path): json_list = [] with open(path) as f: for line in f.readlines(): dict = {} split = line.split(" ") dict["{#DES_IP}"] = split[0] //dict["{#LINK_COUNT}"] = split[1] //這個(gè)是可以不要的 dict["{#SOU_IP}"] = split[2][:-1] json_list.append(dict) sum = {} sum["data"] = json_list sum = json.dumps(sum) print sum if __name__ == '__main__': path = "/home/zabbix/data.txt" create_json(path) ##############分割線(xiàn):上面的是自發(fā)現的腳本############### ##############分割線(xiàn):下面的是item相關(guān)腳本############### vim tcp_item.sh ##################tcp_item.sh#################### #!/bin/bash export LANG="en_US.UTF-8" path=/home/zabbix/data.txt count=`cat $path | grep $1 | grep $2 | awk '{print $2}'` [ 1"$count" -eq 1 ] && echo 0 || echo $count
兩個(gè)腳本都搞定了,就可以進(jìn)行zabbix_agent.conf的配置了
在配置文件中新增如下內容:
UnsafeUserParameters=1 #如果已經(jīng)配置就不需要配置了 UserParameter=discovery.tcp_monitor[*],sh /home/zabbix/tcp_monitor.sh #自發(fā)現 UserParameter=alert.tcp_count[*],sh /home/zabbix/tcp_item.sh $1 $2 #item,其中$1,$2為item中的傳遞參數,用來(lái)區別item的不同
這里還是選擇在zabbix的模板上進(jìn)行配置,現在新增一個(gè)Discovery
然后在Discovery上配置item,trigger,graph
配置item:
上面的DES_IP,SOU_IP來(lái)源于自發(fā)現腳本中的Python腳本,用于輸出的格式。alter.tcp_count是UserParameter=alert.tcp_count[*],sh /home/zabbix/tcp_item.sh \$1 \$2,后面的\$1,\$2與DES_IP,SOU_IP相對應生成唯一確定的item。
item配置完畢后就可以配置trigger了:
接下來(lái)繼續配置graph了
最后把模板添加到機器,然后看結果
以上就是詳解Linux使用ss命令結合zabbix對socket做監控的詳細內容,更多關(guān)于Linux ss命令 zabbix socket監控的資料請關(guān)注腳本之家其它相關(guān)文章!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站