详解Linux使用ss命令结合zabbix对socket做监控

前言

这里我们使用zabbix对其进行监控,使用的是ss命令,不使用netstat命令,因为ss的速度快很多,不信的话可以去测一下哈,一台机器的socket越多,对比越明显。而且ss命令能显示更多的内容,其实我对这两个命令不是特别的熟悉,通过man ss可以看到:

一、ss命令

ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix domain sockets等等统计. 它比其他工具展示等多tcp和state信息. 它是一个非常实用、快速、有效的跟踪IP连接和sockets的新工具.SS命令可以提供如下信息:

  • 所有的TCP sockets
  • 所有的UDP sockets
  • 所有ssh/ftp/ttp/https持久连接
  • 所有连接到Xserver的本地进程
  • 使用state(例如:connected, synchronized, SYN-RECV, SYN-SENT,TIME-WAIT)、地址、端口过滤
  • 所有的state FIN-WAIT-1 tcpsocket连接以及更多

很多流行的Linux发行版都支持ss以及很多监控工具使用ss命令.熟悉这个工具有助于您更好的发现与解决系统性能问题.本人强烈建议使用ss命令替代netstat部分命令,例如netsat -ant/lnt等

直接ss命令

对上面解释一波:

Netid #socket类型,在上面的例子中,有 TCP、u_str(unix流)等套接字
State #套接字处于什么状态,下面是TCP套接字的所有状态及说明, 实际上就是TCP的三次握手和四次挥手的所有状态
Recv-Q #在 ESTAB 状态下,表示内核中还有多少字节的数据没有被上层应用读取,如果这里数值很大,应用程序可能发生了阻塞
Send-Q #在 ESTAB 状态下,表示内核发送队列中还有多少字节的数据没有收到确认的ACK,如果这个数值很大,表明接收端的接收以及处理需要加强
Local Address:Port #本地地址和端口
Peer Address:Port #远程地址和端口

然后我们接着看上面的state有哪些呢,如果特别熟悉网络的人应该很懂,至少我现在是不是特别熟悉,三次握手和四次挥手的状态:

LISTEN #服务端侦听套接字等待客户端的连接
SYN-SENT #客户端已发送套接字连接请求报文,等待连接被服务器接收
SYN-RECEIVED #服务器端接收连接请求报文后,等待客户端的确认连接的回复报文
ESTABLISHED #服务端和客户端之间成功建立了一条有效的连接,可以互相传输数据
FIN-WAIT-1 #服务器或客户端调用close函数主动向对方发出终止连接的请求报文,同时等待对方确认终止连接的回复报文
FIN-WAIT-2 #主动关闭连接端收到对方确认终止连接的回复报文,同时等待对方连接终止的请求报文,这时的状态是TCP连接的半关闭状态,可以接受数据,但是不能发送数据
CLOSE-WAIT #被动关闭端收到主动关闭端终止连接的请求报文后,向主动关闭端发送确认终止连接的回复报文,同时被动关闭端等待本地用户终止连接,这时被动关闭端的状态是TCP连接的半关闭状态,可以发送数据,但是不能接收数据
CLOSING #服务器和客户端同时向对方发送终止连接(调用close函数)请求报文,并且双方都是在收到对方发送的终止连接回复报文之前收到了对方的发送的终止连接请求报文,这个时候双方都进入了CLOSING状态,进入CLOSING状态之后,只要收到了对方对自己终止连接的回复报文,就会进入TIME-WAIT状态,所以CLOSING状态的持续时间会特别短,一般很难捕获到
LAST-ACK #被动关闭端发送完全部数据之后,向主动关闭端发送终止连接的请求报文,等待主动关闭端发送终止连接的回复报文
TIME-WAIT #主动关闭端收到被动关闭端终止连接的请求报文后,给被动关闭端发送终止连接的回复报文,等待足够时间以确保被动关闭端收到了主动关闭段发送的终止连接的回复报文
CLOSED #完全没有连接,套接字连接已经终止了

那么这些状态ss命令又怎么对应呢?(后面的是ss命令显示的状态信息)

[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",

江到这里其实就可以去做下面的监控了,继续往下看ss命令的使用。

Usage: ss [ OPTIONS ]

       ss [ OPTIONS ] [ FILTER ]

-h, --help 帮助信息
-V, --version 程序版本信息
-n, --numeric 不解析服务名称
-r, --resolve 解析主机名
-a, --all 显示所有套接字(sockets)
-l, --listening 显示监听状态的套接字(sockets)
-o, --options 显示计时器信息
-e, --extended 显示详细的套接字(sockets)信息
-m, --memory 显示套接字(socket)的内存使用情况
-p, --processes 显示使用套接字(socket)的进程
-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类型的套接字(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 从文件中都去过滤器信息
FILTER := [ state TCP-STATE ] [ EXPRESSION ]

重点在下面的监控

二、zabbix监控机器总体的socket情况

做这个监控前可以熟悉下awk命令

这是使用的监控系统为zabbix,我们这里会结合zabbix的模板(这里选择模板是为了后期拓展),和自定义脚本的方式进行监控。

2.1、写脚本

二话不多说上脚本先:

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

2.2、配置zabbix agent的配置文件

vim  zabbix_agent.conf
##############添加如下内容#################
UnsafeUserParameters=1   #这个参数是自定义脚本需要配置的
UserParameter=tcp.status[*],sh /home/zabbix/tcp_status.sh $1  #这里就是用来指定刚刚写的脚本,后面传一个参数

配置好了以后记得重启zabbix agent

2.3、配置zabbix的模板

往其中添加item,trigger,graph

新增模板,然后往其中添加item,如下图所示

上图中key中的tcp.status指的是刚刚在第二步中的配置UserParameter=tcp.status[*],sh /home/zabbix/tcp_status.sh \$1

然后中括号里面的内容就是\$1进行传参的参数,具体的参数就是[UNCONN]里面的UNCONN,这些值对应第一步监控脚本中的case中的每一种情况,到这里基本上完成了,不,还是画个图吧,在模板中添加graph,如下图所示:

还有最重要的一步就是把配置好监控脚本的(第一步)的主机添加到该模板,到此为止这个监控就做完了,看个结果图吧

三、zabbix监控机器来源于各个机器的请求数

这个监控的目的就是看看到底是哪些机器访问目标机器比较频繁。

这个监控采用自发现的监控,比上面那个会难一点哈,为啥要选择自发现的监控呢,因为item不是确定的,这里选择:原地址ip和目的ip地址作为item,我们在目的ip地址进行监控,这个是不变的,所以原地址ip值会发生变化,所以这里采用的是自动生成item的方式进行监控,自动添加和删除item,其实挺好用的,只要学会了,超级简单

这里也是分为三步,写脚本,配置zabbix_agent.conf文件,配置Discovery

3.1、写脚本

这里需要两个脚本,一个用来做自发现(需要输出json格式),一个用来做item的)

vim tcp_monitory.sh
##################tcp_monitor.sh##################
#!/bin/bash
#获取数据输出到data.txt文件中,格式为:原地址ip:count:目标地址ip
#并且过滤掉count小于200的数据,这里没有分socket的状态,眉毛胡子一把抓了,个人可以根据具体的需求改进
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] //这个是可以不要的
            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)

##############分割线:上面的是自发现的脚本###############
##############分割线:下面的是item相关脚本###############
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

两个脚本都搞定了,就可以进行zabbix_agent.conf的配置了

3.2、配置zabbix_agent.conf文件

在配置文件中新增如下内容:

UnsafeUserParameters=1 #如果已经配置就不需要配置了

UserParameter=discovery.tcp_monitor[*],sh /home/zabbix/tcp_monitor.sh #自发现
UserParameter=alert.tcp_count[*],sh /home/zabbix/tcp_item.sh $1 $2 #item,其中$1,$2为item中的传递参数,用来区别item的不同

3.3、配置Discovery,配置item,trigger,graph

这里还是选择在zabbix的模板上进行配置,现在新增一个Discovery

然后在Discovery上配置item,trigger,graph

配置item:

上面的DES_IP,SOU_IP来源于自发现脚本中的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了:

接下来继续配置graph了

最后把模板添加到机器,然后看结果

以上就是详解Linux使用ss命令结合zabbix对socket做监控的详细内容,更多关于Linux ss命令 zabbix socket监控的资料请关注我们其它相关文章!

时间: 2021-06-10

Zabbix监控Linux主机设置方法

说明: Zabbix监控服务端已经配置完成,现在要使用Zabbix对Linux主机进行监控. 具体操作: 以下操作在被监控的Linux主机进行,这里以CentOS 6.x系统为例. 一.配置防火墙,开启10050.10051的TCP和UDP端口 vi /etc/sysconfig/iptables #编辑防火墙配置文件 -A INPUT -s 192.168.21.127 -m state --state NEW -m tcp -p tcp --dport 10050:10051 -j ACCE

Linux进程间通信方式之socket使用实例

套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行. 套接字的特性有三个属性确定,它们是:域(domain),类型(type),和协议(protocol).套接字还用地址作为它的名字.地址的格式随域(又被称为协议族,protocol family)的不同而不同.每个协议族又可以使用一个或多个地址族定义地址格式. 1.套接字的域 域指定套接字通信中使用的网络介质.最常见的套接字域是AF_INET,它是指Internet网络,许多Linux局域网使

Linux运维之如何使用ss命令代替netstat

前言 在运维和管理 Linux 服务器的时候,我们最常用的一个命令就是 netstat,我常用这个命令来查看当前服务器上有哪些进程正在侦听端口,主要用来诊断网络服务的工作状态. 不过,最近有一次安装好一个 Ubuntu 发型版,发现默认没有安装 netstat,觉得非常奇怪,自己手动安装后,发现 man pages 提示,netstat 命令已经是 deprecated 了,建议使用 ss 命令代替. This program is mostly obsolete. Replacement fo

Linux UDP socket 设置为的非阻塞模式与阻塞模式区别

Linux UDP socket 设置为的非阻塞模式与阻塞模式区别 UDP socket 设置为的非阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct sockaddr *)&SockAddr,&ScokAddrLen); UDP socket 设置为的阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), 0, (

linux ss命令详解

ss 是 Socket Statistics 的缩写.ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似.但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netstat 更快.当服务器的 socket 连接数量变得非常大时,无论是使用 netstat 命令还是直接 cat /proc/net/tcp,执行速度都会很慢.ss 命令利用到了 TCP 协议栈中 tcp_diag.tcp_diag 是一个用于分析统计的模块,可以获得 L

Zabbix基于snmp实现监控linux主机

前言: linux主机的话还是比较好处理的,无论是安装agent代理程序还是使用snmp,都是比较方便的,本文旨在介绍通过snmp使client与server进行连接. 环境: server:192.168.249.142 client:192.168.249.145 基础配置:关闭selinux,关闭防火墙或者打开161端口. 一.client端snmp的基础配置: 1.安装snmp(使用阿里yum源): [root@cinder snmp]# yum install net-snmp 2.根

zabbix监控Linux系统服务的流程

Zabbix自动发现规则监控Linux系统的service units 项目要求:通过systemctl命令查看Linux系统的service units: 监控前提:zabbix环境已搭建好: 监控原理:通过shell脚本把systemctl命令返回的结果以json格式发送到zabbix: 1. 在scripts目录编写脚本,脚本内容如下: 2. 在/etc/zabbix_agentd.conf.d目录编写配置文件,内容如下: vim service_status.conf UserParam

Linux网络编程之socket文件传输示例

本文所述示例程序是基于Linux平台的socket网络编程,实现文件传输功能.该示例是基于TCP流协议实现的socket网络文件传输程序.采用C语言编写.最终能够实现传输任何格式文件的文件传输程序. 具体实现代码如下: Server端代码如下: /************************************************************************* > File Name: Server.c > Author: SongLee ***********

详解Linux监控重要进程的实现方法

不管后台服务程序写的多么健壮,还是可能会出现core dump等程序异常退出的情况,但是一般情况下需要在无 人为干预情况下,能够自动重新启动,保证服务进程能够服务用户.这时就需要一个监控程序来实现能够让服务进程自动重新启动.查阅相关资料及尝试一些方法之后,总结linux系统监控重要进程的实现方法:脚本检测和子进程替换. 1.脚本检测 (1) 基本思路: 通过shell命令(ps -e | grep "$1" | grep -v "grep" | wc -l) 获取

Linux网络编程之UDP Socket程序示例

在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送. 相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务.使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可

Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】

本文实例讲述了Python 网络编程之UDP发送接收数据功能.分享给大家供大家参考,具体如下: demo.py(UDP发送数据): import socket # 导入socket模块 def main(): # 创建一个udp套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定本机ip和端口号 (发送数据时,如果不绑定,系统会随机分配端口号.接收数据时,一般需要手动绑定ip和端口) udp_socket.b

python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)

UDP广泛应用于需要相互传输数据的网络应用中,如QQ使用的就是UDP协议.在网络质量不好的情况下,使用UDP协议时丢包现象十分严重,但UDP占用资源少,处理速度快,UDP依然是传输数据时常用的协议. 下面是用python实现UDP服务器的代码: 复制代码 代码如下: #!/usr/bin/env pythonimport socketaddress=('127.0.0.1',10000)s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind

Android网络编程之UDP通信模型实例

什么是Android UDP? UDP是User Datagram Protocol的简称,中文名是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务.它是IETF RFC 768是UDP的正式规范.在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层-传输层,处于IP协议的上一层.UDP有不提供数据报分组.组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的.UDP用来支持那些需要在计算机之间传输数据

Python网络编程之TCP与UDP协议套接字用法示例

本文实例讲述了Python网络编程之TCP与UDP协议套接字用法.分享给大家供大家参考,具体如下: TCP协议 服务器端: #!/usr/bin/env python from socket import * from time import ctime HOST = '' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) ##创建服务器TCP套接字 tcpSerSoc

Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】

本文实例讲述了Python 网络编程之TCP客户端/服务端功能.分享给大家供大家参考,具体如下: demo.py(TCP客户端): import socket def main(): # 1. 创建tcp的套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 链接服务器 # tcp_socket.connect(("192.168.33.11", 7890)) server_ip = input(

Java网络编程之TCP通信完整代码示例

一.概述 Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信.Socket类的方法会建立和销毁连接,设置各种Socket选项. ServerSocket类是Java执行服务器端操作的基础类,该类运行于服务器,监听入站TCP连接,每个socket服务器监听服务器的某个端口,当远程主机的客户端尝试连接此端口时,服务器就被唤醒,并返回一个表示两台主机之间socket的正常Socket对象. 二.什么是TCP? TCP是一种面向连接的.可靠的.

android开发socket编程之udp发送实例分析

本文实例讲述了android开发socket编程之udp发送实现方法.分享给大家供大家参考.具体分析如下: 需要实现的功能:采用udp下的socket编程,当按下确认键,模拟器发送文本框数据,pc机上的网络调试助手接收 一.环境: win7 + eclipse + sdk 二.代码: package test.soket; //import com.test_button.R; import java.io.DataOutputStream; import java.io.IOException

Python网络编程之TCP套接字简单用法示例

本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而java则一知半解,C写起来又麻烦,所以一直都没有真正实现过TCP套接字编程. 最近学习了python,而用它来写套接字又十分方便简单,所以当然要试一试咯. 下面根据代码来介绍一下最简单的tcp程序,由客户端输入数据,发送给服务器,服务器加上时间后返回给客户端 #!/usr/bin/python 'test TCP server' from socke