Zabbix监控TCP连接状态

本文介绍如何使用Zabbix监控TCP连接状态,包括编写shell脚本监控特定状态的TCP连接数,配置Zabbix代理以获取这些值,并在Zabbix服务端进行测试。还解释了不同TCP连接状态的含义。

Zabbix监控TCP连接状态


获取tcp连接数的两种方法:

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,state[key]}'
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}'

netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多。

规范脚本存放目录:

mkdir /etc/zabbix/scripts

1.编写监控tcp连接数的shell脚本,并添加执行权限

# cat /etc/zabbix/scripts/tcp_status.sh 
#!/bin/bash
#
[ $# -ne 1 ] && echo "Usage:CLOSE-WAIT|CLOSED|CLOSING|ESTAB|FIN-WAIT-1|FIN-WAIT-2|LAST-ACK|LISTEN|SYN-RECV SYN-SENT|TIME-WAIT" && exit 1
tcp_status_fun(){
        TCP_STAT=$1
        #netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,state[key]}' > /tmp/netstat.tmp
        ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/ss.tmp
        TCP_STAT_VALUE=$(grep "$TCP_STAT" /tmp/ss.tmp | cut -d ' ' -f2)
        if [ -z $TCP_STAT_VALUE ];then
                TCP_STAT_VALUE=0
        fi
        echo $TCP_STAT_VALUE
}
tcp_status_fun $1

添加执行权限:
chmod +x tcp_status.sh

2.创建一个自定义的key:

# cat /etc/zabbix/zabbix_agentd.d/tcp.conf 
UserParameter=tcp_status[*],/bin/bash /etc/zabbix/scripts/tcp_status.sh "$1"

3.重启zabbix-agent,修改配置文件必须重启

systemctl restart  zabbix-agent

4.服务端使用Zabbix_get测试是否能正常获取值

zabbix_get -s 127.0.0.1 -k tcp_status[ESTAB]

5.web界面,导入tcp模板,创建主机并关联tcp模板
这里写图片描述
这里写图片描述

LISTEN:等待从任何远端TCP 和端口的连接请求。
SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
FIN_WAIT_2:等待远端TCP 的连接终止请求。
CLOSE_WAIT:等待本地用户的连接终止请求。
CLOSING:等待远端TCP 的连接终止请求确认。

LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
TIME_WAIT 两个存在的理由:
1.可靠的实现tcp全双工连接的终止;
2.允许老的重复分节在网络中消逝。
CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)

好的,这是一个比较复杂的任务,需要使用Shell脚本编写。以下是一个简单的实现,你可以根据实际情况进行修改和完善。 1. Zabbix监控TCP连接状态收集 首先,我们可以使用netstat命令来获取TCP连接状态信息。然后,我们可以编写一个脚本,将该信息转换为Zabbix可接受的格式,并将其发送到Zabbix Server上。 ``` #!/bin/bash HOSTNAME=$(hostname) # 获取TCP连接状态信息 TCP_STATUS=$(netstat -nat | awk '{print $6}' | sort | uniq -c | awk '{print $2,$1}') # 将信息转换为Zabbix可接受的格式 ITEMS="" for status in $TCP_STATUS do key="tcp.status[$status]" value=$(echo $TCP_STATUS | awk -v status="$status" '{if ($1 == status) print $2}') ITEMS="$ITEMS -z $ZABBIX_SERVER -s $HOSTNAME -k $key -o $value" done # 将信息发送到Zabbix Server上 zabbix_sender $ITEMS ``` 2. Zabbix监控MySQL状态信息收集 接下来,我们可以使用MySQL命令行工具来获取MySQL状态信息。然后,我们可以编写一个脚本,将该信息转换为Zabbix可接受的格式,并将其发送到Zabbix Server上。 ``` #!/bin/bash HOSTNAME=$(hostname) # 获取MySQL状态信息 MYSQL_STATUS=$(mysqladmin -u root -pYOUR_PASSWORD status) # 将信息转换为Zabbix可接受的格式 ITEMS="" IFS="|" for status in $MYSQL_STATUS do key=$(echo $status | awk '{print $1}') value=$(echo $status | awk '{print $2}') ITEMS="$ITEMS -z $ZABBIX_SERVER -s $HOSTNAME -k mysql.status[$key] -o $value" done # 将信息发送到Zabbix Server上 zabbix_sender $ITEMS ``` 3. Zabbix监控内存信息收集 最后,我们可以使用free命令来获取内存信息。然后,我们可以编写一个脚本,将该信息转换为Zabbix可接受的格式,并将其发送到Zabbix Server上。 ``` #!/bin/bash HOSTNAME=$(hostname) # 获取内存信息 MEMORY=$(free | awk 'NR==2{print $2,$3,$4}') # 将信息转换为Zabbix可接受的格式 ITEMS="-z $ZABBIX_SERVER -s $HOSTNAME -k memory.total -o $(echo $MEMORY | awk '{print $1}')" ITEMS="$ITEMS -z $ZABBIX_SERVER -s $HOSTNAME -k memory.used -o $(echo $MEMORY | awk '{print $2}')" ITEMS="$ITEMS -z $ZABBIX_SERVER -s $HOSTNAME -k memory.free -o $(echo $MEMORY | awk '{print $3}')" # 将信息发送到Zabbix Server上 zabbix_sender $ITEMS ``` 注意,上述脚本中的ZABBIX_SERVER和YOUR_PASSWORD需要替换为实际的值。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值