Zabbix 3.1:Zabbix 监控 TCP 连接状态(详解)

3.1:Zabbix 监控 TCP 连接状态

对服务器的TCP连接状态的监控,关系到端口资源利用情况、是否遭到攻击等,为安全防范、系统调优等提供先决判断。

TCP连接状态是否正常,主要是从服务器各TCP连接状态的数量来进行判断的,而要了解各TCP连接状态,要先从TCP会话建立和断开流程开始。

3.1.1:TCP 基础

3.1.1.1:TCP “三次握手”

首先是角色定义,TCP“三次握手”是建立TCP连接的过程,在这个过程中有两个角色:

  • 连接建立的发起方:一般为C/S架构中的客户端,以下简称Client;
  • 连接建立的接受方:一般为C/S架构中的服务端, 以下简称Server。

建立TCP连接时,Client需要进行两次“握手”,第一次和第三次;Server端是收到第一次“握手”后发起第二次“握手”。

以下将三次“握手”分别称为H1、H2、H3(H取自Handshake的首字母)。

相应的,四次“挥手分别称为W1、W2、W3、W4(W取自Wave的首字母)。

在这里插入图片描述

连接状态角色状态时段说明
CLOSEDALL连接默认都是关闭状态。
LISTENServer^:服务开启
$:服务关闭
当Server服务程序开启,并监听在一个端口,此时端口连接状态为LISTEN。
处于LISTEN状态的端口,是相对固定的。
SYN_SENTClient^:发送H1之后
$:收到H2之前
SYN_SENT表示Client已经向Server发送了连接建立请求(H1),但还没有收到Server的确认报文(H2)。
处于SYN_SENT状态的端口,是Client端随机分配的。
SYN_RCVDServer^:收到H1并发送H2之后
$:收到H3之前
Server收到Client的连接建立请求(H1)后,就将端口下相应连接的状态置为SYNC_RCVD。
SYNC_RCVD状态的持续时间很短暂。
ESTABLISHEDClient^:收到H2之后
$:发送W1之前
Client收到Server对H1的确认报文(H2)后,就将端口的连接状态置为ESTABLISHED。
ESTABLISHEDServer^:收到H3之后
$:收到W1之前
Server收到Client对H2的确认报文(H3)后,就将端口的连接状态置为ESTABLISHED。
3.1.1.2:TCP “四次挥手”

TCP “四次挥手”是断开TCP连接的过程,这个过程中同样是两个角色:

  • 连接断开的发起方:一般为C/S架构中的客户端,以下简称Client;
  • 连接断开的接受方:一般为C/S架构中的服务端,以下简称Server。

断开TCP连接的过程中,Client端发送两次“挥手”,第一次和第四次,即连接断开的发起方负责开始和结尾,善始善终;Server也发送两次“挥手”,第二次和第三次。

在这里插入图片描述

连接状态角色状态时段说明
ESTABLISHEDALLTCP连接建立后,Client和Server的相应连接都为ESTABLISHED状态。
FIN_WAIT1Client^:发送W1之后
$:收到W2之前
Client发送断开连接的请求(W1)后,端口连接状态就进入FIN_WAIT1状态。
FIN_WAIT1的状态很短,一般连接断开的接受方收到断开请求后,会立即响应确认。
CLOSE_WAITServer^:收到W1并发送W2之后
$:发送W3之前
Server在收到Client发送的断开连接请求(W1)后,就发送连接断开确认(W2),并进入CLOSE_WAIT。
这是一个半关闭的状态,Client已经没有数据传输需要了,Server端可能还有,CLOSE_WAIT状态下Server仍然可以向Client传输数据。
所以Server先给Client发送一个确认,表示收到了断开连接的请求,需要等待应用程序把数据发完。
FIN_WAIT2Client^:收到W2之后
$:收到W3并发送W4之前
Client收到Server的确认(W2)后,就将端口连接状态置为FIN_WAIT2,等待接收Server发送的最后数据,以及之后的连接释放请求(W3)。
LAST_ACKServer^:发送W3之后
$:收到W4之前
当Server端应用程序传输完最后的数据,就向客户端发送连接释放请求(W3),将端口连接状态置为LAST_ACK,表示最后的数据传输完成,可以释放连接了,等待Client的最后确认。
TIME_WAITClient^:收到W3并发送W4之后
$:2MSL结束之前
Client收到Server发送的连接释放请求(W3)后,就立即发送确认(W4),并将端口的连接状态置为TIME_WAIT。
Client之所以要在TIME_WAIT状态上等待2MSL的时间,是要确保Server收到了最后的连接释放确认(W4);如果因网络问题导致Server没有收到W4,Server会重复发送连接释放请求(W3),所以Client需要等待一段时间,随时准备重发W4。
CLOSEDServer^:收到W4之后Server收到Client回复的连接释放确认(W4)后,最终释放连接。
CLOSEDClient^:2MSL结束之后Client在等待了2MSL后,可以确认Server已经收到了W4,最终释放连接。

MSL(Maximum Segment Lifetime):报文最大生存时间:

  • Windows : MSL = 2 min
  • linux(Ubuntu, CentOs) : MSL = 60s
  • Unix : MSL = 30s

3.1.2:TCP 连接状态监测脚本

3.1.2.1:netstat 打印所有 TCP 连接

这里基于netstat命令输出的TCP连接信息,来统计各连接状态的数量。

主要使用的命令为netstat -tan,涉及三个选项:

  • -t,显示TCP连接。
    对应的是-u,显示UDP连接。
  • -a,Show both listening and non-listening sockets.
    连接状态总的分为两大类,listening和non-listening,即监听/非监听,也就是连接状态为LISTEN/非LISTEN。
    -a就是显示所有状态的连接。
    对应的-l,仅显示LISTEN状态的连接。
  • -n,Show numerical addresses instead of trying to determine symbolic host, port or user names.
    关闭名称解析,以数字方式显示IP和端口。
    这个在这次统计过程中作用不大,但一般都习惯性地加上。

命令的完整显示信息:

root@zabbix-server:~# netstat -tan

在这里插入图片描述

也可以使用ss命令,但在ss的命令执行结果中,连接状态的表示方式和通常的不太一样,比如ESTABLISHED是使用ESTAB表示的,在后边为脚本传递参数时,取ESTABLISHED连接状态数量时,需要传递的是ESTAB,容易造成一些不便。

3.1.2.2:awk 格式化输出统计结果

从netstat命令中可以看出,我们需要取的是第6列的State,但忽略第一行,将各State各自循环+1,得到各种状态的连接数量。

根据需求,得到格式化输出命令:

netstat -tan | awk 'NR>1 {++v[$6]} END {for(k in v) print k,v[k]}'

在这里插入图片描述

这样就得到了全面的基础数据,接下来通过grep来匹配连接状态,取到对应的行,经过剪切就能取到对应连接状态的数量了。

root@zabbix-server:~# netstat -tan | awk 'NR>1 {++v[$6]} END {for(k in v) print k,v[k]}' | grep ESTABLISHED | cut -d' ' -f2
43
3.1.2.3:编写脚本
#!/bin/bash
# Description: 统计并获取TCP连接状态
# Author: yqc

# Define variables
Tcp_State=$1

# Define function "Tcp_State_Statistic"
Tcp_State_Statistic(){
	State_Num=$(netstat -tan | awk 'NR>1 {++v[$6]} END {for(k in v) print k,v[k]}' | grep ${Tcp_State} | cut -d' ' -f2)
	if [[ -z $State_Num ]]; then
		State_Num=0
	fi
	echo $State_Num
}

# Notification or Use function "Tcp_State_Statistic"
if [[ $# != 1 ]]; then
	echo "Usage: bash $0 <LISTEN|SYN_SENT|SYN_RCVD|ESTABLISHED|FIN_WAIT1|CLOSE_WAIT|FIN_WAIT2|LAST_ACK|TIME_WAIT>"
else
	Tcp_State_Statistic $1
fi

3.1.3:Zabbix Agent 添加 UserParameter

本次监控Zabbix的MySQL服务器的TCP连接状态。

3.1.3.1:安装/配置/启动 Zabbix Agent

为MySQL服务器安装zabbix-agent:

root@zabbix-mysql:~# wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-3+bionic_all.deb
root@zabbix-mysql:~# dpkg -i zabbix-release_4.0-3+bionic_all.deb                        
root@zabbix-mysql:~# sed -i 's@repo.zabbix.com/zabbix/4.0@mirrors.aliyun.com/zabbix/zabbix/4.0@g' /etc/apt/sources.list.d/zabbix.list
root@zabbix-mysql:~# apt update
root@zabbix-mysql:~# apt install zabbix-agent

配置:

root@zabbix-mysql:~# grep '^[a-Z]' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
EnableRemoteCommands=1
Server=192.168.1.101
ListenPort=10050
ServerActive=192.168.1.101
Hostname=192.168.1.100
Include=/etc/zabbix/zabbix_agentd.d/*.conf

启动:

root@zabbix-mysql:~# systemctl enable zabbix-agent && systemctl restart zabbix-agent

验证:

root@zabbix-mysql:~# ss -tnlp | grep 10050
3.1.3.2:添加自定义监控项

/etc/zabbix/zabbix_agentd.d/目录下新建配置文件来添加自定义监控项,配置文件模块化有利于后期维护。

root@zabbix-mysql:~# vim /etc/zabbix/zabbix_agentd.d/tcp_state_statistic.conf
UserParameter=tcp_state_statistic[*],/etc/zabbix/zabbix_agentd.d/Tcp_State_Statistic.sh "$1"

拷贝脚本,添加执行权限,并测试脚本:

root@zabbix-mysql:~# cp /root/Tcp_State_Statistic.sh /etc/zabbix/zabbix_agentd.d/
root@zabbix-mysql:~# chmod +x /etc/zabbix/zabbix_agentd.d/Tcp_State_Statistic.sh

root@zabbix-mysql:~# /etc/zabbix/zabbix_agentd.d/Tcp_State_Statistic.sh LISTEN
18

重启zabbix-agent:

root@zabbix-mysql:~# systemctl restart zabbix-agent
3.1.3.3:Zabbix Server 测试手动获取监控项数据

使用zabbix_get手动获取监控项数据。

安装zabbix-get:

root@zabbix-server:~# apt install zabbix-get

手动获取监控数据:

root@zabbix-server:~# zabbix_get -s 192.168.1.100 -p 10050 -k "tcp_state_statistic["LISTEN"]"
18
root@zabbix-server:~# zabbix_get -s 192.168.1.100 -p 10050 -k "tcp_state_statistic["ESTABLISHED"]"
44

至此,说明自定义监控项的添加是OK的,就可以基于此为Zabbix Server添加监控项、制作模板了。

3.1.4:Zabbix Server 制作 TCP 连接状态监测模板

3.1.4.1:创建模板

配置-模板-创建模板:

在这里插入图片描述

填写模板信息:

在这里插入图片描述

3.1.4.2:创建应用集

找到对应模板,点击应用集

在这里插入图片描述

创建应用集:

在这里插入图片描述

在这里插入图片描述

3.1.4.3:创建监控项

找到相应模板,点击监控项

在这里插入图片描述

创建监控项:

在这里插入图片描述

填写ESTABLISHED状态监控项信息:

在这里插入图片描述

依次克隆并修改,将TCP连接各状态的监控项都创建好。

在这里插入图片描述

可以根据需要继续创建图形、触发器等,这里的目的是为了熟悉了解TCP连接状态,以及如何通过Zabbix来监测到数据,不做过多个性化的操作。

3.1.5:Zabbix Server 添加主机并关联模板

3.1.5.1:创建主机

将MySQL服务器(192.168.1.100)添加到Zabbix中:

在这里插入图片描述

3.1.5.2:关联模板

在这里插入图片描述

3.1.5.3:验证监控数据

最新数据:

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值