Zabbix TCP连接状态自定义监控完整部署手册

Zabbix TCP连接状态监控完整部署手册


一、概述

1.1 功能说明

监控服务器所有 TCP 连接状态,包括全部 11 种 TCP 状态

  • ESTABLISHED、SYN_SENT、SYN_RECV
  • FIN_WAIT1、FIN_WAIT2、TIME_WAIT
  • CLOSE、CLOSE_WAIT、LAST_ACK
  • LISTEN、CLOSING

1.2 监控方式

  • Zabbix Agent 2 主动/被动模式
  • 使用 netstat 命令采集数据
  • 支持自动发现,自动创建所有状态监控项

二、Agent 端配置

2.1 创建监控脚本

脚本路径
bash 复制代码
/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh
脚本内容
bash 复制代码
#!/bin/bash
# TCP连接状态统计脚本(使用 netstat)
# 路径: /etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh

# 获取指定状态的连接数
get_state_count() {
    local state=$1
    local count=0
    
    case "$state" in
        "LISTEN")
            # LISTEN 使用 -tln 参数(只显示监听端口)
            if command -v netstat &>/dev/null; then
                count=$(netstat -tln 2>/dev/null | awk 'NR>2 {count++} END {print count+0}')
            fi
            ;;
        "ESTABLISHED"|"SYN_SENT"|"SYN_RECV"|"FIN_WAIT1"|"FIN_WAIT2"|"TIME_WAIT"|"CLOSE_WAIT"|"LAST_ACK"|"CLOSING")
            # 其他状态使用 -tan 参数
            if command -v netstat &>/dev/null; then
                count=$(netstat -tan 2>/dev/null | awk -v state="$state" 'NR>2 && $6==state {count++} END {print count+0}')
            fi
            ;;
        "CLOSE")
            # CLOSE 状态通常不会出现
            count=0
            ;;
        *)
            count=0
            ;;
    esac
    
    echo "$count"
}

# 获取所有TCP连接总数(包括LISTEN)
get_total_connections() {
    local total=0
    
    if command -v netstat &>/dev/null; then
        # 统计所有TCP连接(包括LISTEN)
        total=$(netstat -tan 2>/dev/null | awk 'NR>2 {count++} END {print count+0}')
    fi
    
    echo "$total"
}

# 显示所有状态统计
show_all_stats() {
    echo "=== TCP连接状态统计 ==="
    echo "总数: $(get_total_connections)"
    echo "------------------------"
    
    # 获取各状态数量
    local established=$(get_state_count "ESTABLISHED")
    local syn_sent=$(get_state_count "SYN_SENT")
    local syn_recv=$(get_state_count "SYN_RECV")
    local fin_wait1=$(get_state_count "FIN_WAIT1")
    local fin_wait2=$(get_state_count "FIN_WAIT2")
    local time_wait=$(get_state_count "TIME_WAIT")
    local close=$(get_state_count "CLOSE")
    local close_wait=$(get_state_count "CLOSE_WAIT")
    local last_ack=$(get_state_count "LAST_ACK")
    local listen=$(get_state_count "LISTEN")
    local closing=$(get_state_count "CLOSING")
    
    printf "%-12s: %s\n" "ESTABLISHED" "$established"
    printf "%-12s: %s\n" "SYN_SENT" "$syn_sent"
    printf "%-12s: %s\n" "SYN_RECV" "$syn_recv"
    printf "%-12s: %s\n" "FIN_WAIT1" "$fin_wait1"
    printf "%-12s: %s\n" "FIN_WAIT2" "$fin_wait2"
    printf "%-12s: %s\n" "TIME_WAIT" "$time_wait"
    printf "%-12s: %s\n" "CLOSE" "$close"
    printf "%-12s: %s\n" "CLOSE_WAIT" "$close_wait"
    printf "%-12s: %s\n" "LAST_ACK" "$last_ack"
    printf "%-12s: %s\n" "LISTEN" "$listen"
    printf "%-12s: %s\n" "CLOSING" "$closing"
}

# 自动发现所有11种状态
discovery() {
    echo '{"data":['
    local first=1
    for state in ESTABLISHED SYN_SENT SYN_RECV FIN_WAIT1 FIN_WAIT2 TIME_WAIT CLOSE CLOSE_WAIT LAST_ACK LISTEN CLOSING; do
        [ $first -eq 0 ] && echo ','
        echo '{"{#TCP_STATE}":"'$state'"}'
        first=0
    done
    echo ']}'
}

# 主函数
main() {
    case "$1" in
        "discovery")
            discovery
            ;;
        "total")
            get_total_connections
            ;;
        "")
            show_all_stats
            ;;
        *)
            local state_upper=$(echo "$1" | tr '[:lower:]' '[:upper:]')
            # 验证状态是否有效
            case "$state_upper" in
                "ESTABLISHED"|"SYN_SENT"|"SYN_RECV"|"FIN_WAIT1"|"FIN_WAIT2"|"TIME_WAIT"|"CLOSE"|"CLOSE_WAIT"|"LAST_ACK"|"LISTEN"|"CLOSING")
                    get_state_count "$state_upper"
                    ;;
                *)
                    echo "错误: 无效的TCP状态 '$1'"
                    echo "支持的状态: ESTABLISHED, SYN_SENT, SYN_RECV, FIN_WAIT1, FIN_WAIT2, TIME_WAIT, CLOSE, CLOSE_WAIT, LAST_ACK, LISTEN, CLOSING"
                    exit 1
                    ;;
            esac
            ;;
    esac
}

main "$@"
设置权限
bash 复制代码
chmod +x /etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh
chown zabbix:zabbix /etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh

2.2 创建 Zabbix Agent 配置文件

配置文件路径
bash 复制代码
/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.conf
配置文件内容
bash 复制代码
# TCP连接状态监控(使用 netstat)

# 自动发现所有TCP状态
UserParameter=tcp.states.discovery,/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh discovery

# 获取指定状态的连接数
UserParameter=tcp.state.count[*],/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh $1

# 获取所有TCP连接总数
UserParameter=tcp.total,/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh total

# 快捷方式(常用状态)
UserParameter=tcp.established,/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh ESTABLISHED
UserParameter=tcp.timewait,/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh TIME_WAIT
UserParameter=tcp.closewait,/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh CLOSE_WAIT
UserParameter=tcp.listen,/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh LISTEN
设置权限
bash 复制代码
chown zabbix:zabbix /etc/zabbix/zabbix_agent2.d/tcp_conn_stats.conf

2.3 重启 Zabbix Agent

bash 复制代码
systemctl restart zabbix-agent2
systemctl status zabbix-agent2

三、验证 Agent 端

3.1 测试脚本

bash 复制代码
cd /etc/zabbix/zabbix_agent2.d

# 显示所有状态
./tcp_conn_stats.sh

# 测试各参数
./tcp_conn_stats.sh total
./tcp_conn_stats.sh LISTEN
./tcp_conn_stats.sh ESTABLISHED
./tcp_conn_stats.sh TIME_WAIT

# 测试自动发现
./tcp_conn_stats.sh discovery

3.2 测试 Zabbix Agent

bash 复制代码
# 测试各个监控项
zabbix_agent2 -t tcp.total -c /etc/zabbix/zabbix_agent2.conf
zabbix_agent2 -t tcp.state.count[LISTEN] -c /etc/zabbix/zabbix_agent2.conf
zabbix_agent2 -t tcp.state.count[ESTABLISHED] -c /etc/zabbix/zabbix_agent2.conf
zabbix_agent2 -t tcp.states.discovery -c /etc/zabbix/zabbix_agent2.conf

3.3 使用 zabbix_get 测试(从 Server 端或本机)

bash 复制代码
zabbix_get -s 127.0.0.1 -p 10050 -k tcp.total
zabbix_get -s 127.0.0.1 -p 10050 -k "tcp.state.count[LISTEN]"
zabbix_get -s 127.0.0.1 -p 10050 -k "tcp.state.count[ESTABLISHED]"
zabbix_get -s 127.0.0.1 -p 10050 -k tcp.states.discovery

四、Zabbix Web 界面配置

4.1 创建模板组

路径:数据采集 → 模板组 → 创建模板组

字段 填写内容
模板组名称 TCP_Status

4.2 创建模板

路径:数据采集 → 模板 → 创建模板

字段 填写内容
模板名称 TCP_Connection_Status
可见的名称 TCP连接状态
模板 留空(不填)
模板组 选择 TCP_Status
描述 TCP连接状态监控模板(包含全部11种状态)

4.3 创建监控项(手动创建 5 个常用监控项)

路径:模板 → TCP连接状态 → 监控项 → 创建监控项

监控项1:TCP总连接数
字段 内容
名称 TCP总连接数
键值 tcp.total
类型 Zabbix客户端
信息类型 数字(无正负)
单位 连接数
更新间隔 60s
历史存储 31d
趋势存储 365d
监控项2:TCP LISTEN连接数
字段 内容
名称 TCP LISTEN连接数
键值 tcp.listen
类型 Zabbix客户端
信息类型 数字(无正负)
单位 连接数
更新间隔 60s
监控项3:TCP ESTABLISHED连接数
字段 内容
名称 TCP ESTABLISHED连接数
键值 tcp.established
类型 Zabbix客户端
信息类型 数字(无正负)
单位 连接数
更新间隔 60s
监控项4:TCP TIME_WAIT连接数
字段 内容
名称 TCP TIME_WAIT连接数
键值 tcp.timewait
类型 Zabbix客户端
信息类型 数字(无正负)
单位 连接数
更新间隔 60s
监控项5:TCP CLOSE_WAIT连接数
字段 内容
名称 TCP CLOSE_WAIT连接数
键值 tcp.closewait
类型 Zabbix客户端
信息类型 数字(无正负)
单位 连接数
更新间隔 60s

4.4 创建自动发现规则

路径:模板 → TCP连接状态 → 自动发现 → 创建发现规则

字段 填写内容
名称 TCP连接状态发现
类型 Zabbix客户端
键值 tcp.states.discovery
更新间隔 1h
保留丢失的资源周期 30d
描述 自动发现所有TCP连接状态

4.5 创建监控项原型

路径:点击刚创建的自动发现规则 → 监控项原型 → 创建监控项原型

字段 填写内容
名称 TCP连接状态 {#TCP_STATE}
类型 Zabbix客户端
键值 tcp.state.count[{#TCP_STATE}]
信息类型 数字(无正负)
单位 连接数
更新间隔 60s
历史存储 31d
趋势存储 365d

4.6 创建图形(可选)

路径:模板 → TCP连接状态 → 图形 → 创建图形

字段 填写内容
名称 TCP连接状态统计
800
300

添加监控项

  1. TCP总连接数 (tcp.total) - 黑色
  2. TCP ESTABLISHED连接数 (tcp.established) - 绿色
  3. TCP TIME_WAIT连接数 (tcp.timewait) - 蓝色
  4. TCP LISTEN连接数 (tcp.listen) - 橙色
  5. TCP CLOSE_WAIT连接数 (tcp.closewait) - 红色

4.7 创建触发器(可选)

路径:模板 → TCP连接状态 → 触发器 → 创建触发器

触发器1:ESTABLISHED 异常下降
字段 内容
名称 TCP ESTABLISHED连接数异常下降
表达式 last(/TCP_Connection_Status/tcp.established) < (avg(/TCP_Connection_Status/tcp.established,5m) * 0.3)
严重性 警告
触发器2:TIME_WAIT 过多
字段 内容
名称 TCP TIME_WAIT连接数过多
表达式 last(/TCP_Connection_Status/tcp.timewait) > 1000
严重性 信息
触发器3:CLOSE_WAIT 过多(连接泄漏)
字段 内容
名称 TCP CLOSE_WAIT连接数过多,可能存在连接泄漏
表达式 last(/TCP_Connection_Status/tcp.closewait) > 100
严重性 严重
触发器4:LISTEN 为0(服务异常)
字段 内容
名称 TCP LISTEN端口数为0,服务可能未启动
表达式 last(/TCP_Connection_Status/tcp.listen) = 0
严重性 灾难

4.8 将模板链接到主机

路径:数据采集 → 主机 → 选择主机 → 模板

操作 说明
链接新模板 输入 TCP连接状态 并选择
点击 更新

五、验证监控数据

5.1 查看监控项

路径:数据采集 → 主机 → 选择主机 → 监控项

应该看到 16 个监控项

  • 5 个手动创建的
  • 11 个自动发现生成的

5.2 查看最新数据

路径 :数据采集 → 最新数据 → 选择主机 → 搜索 tcp

5.3 查看图形

路径:数据采集 → 主机 → 选择主机 → 图形 → TCP连接状态统计


六、监控项清单

6.1 手动创建的监控项

序号 名称 键值 说明
1 TCP总连接数 tcp.total 所有TCP连接总数
2 TCP LISTEN连接数 tcp.listen 监听状态连接数
3 TCP ESTABLISHED连接数 tcp.established 已建立连接数
4 TCP TIME_WAIT连接数 tcp.timewait 等待关闭连接数
5 TCP CLOSE_WAIT连接数 tcp.closewait 被动关闭等待数

6.2 自动发现生成的监控项

序号 名称 键值
1 TCP连接状态 ESTABLISHED tcp.state.count[ESTABLISHED]
2 TCP连接状态 SYN_SENT tcp.state.count[SYN_SENT]
3 TCP连接状态 SYN_RECV tcp.state.count[SYN_RECV]
4 TCP连接状态 FIN_WAIT1 tcp.state.count[FIN_WAIT1]
5 TCP连接状态 FIN_WAIT2 tcp.state.count[FIN_WAIT2]
6 TCP连接状态 TIME_WAIT tcp.state.count[TIME_WAIT]
7 TCP连接状态 CLOSE tcp.state.count[CLOSE]
8 TCP连接状态 CLOSE_WAIT tcp.state.count[CLOSE_WAIT]
9 TCP连接状态 LAST_ACK tcp.state.count[LAST_ACK]
10 TCP连接状态 LISTEN tcp.state.count[LISTEN]
11 TCP连接状态 CLOSING tcp.state.count[CLOSING]

七、常用命令

7.1 Agent 端测试命令

bash 复制代码
# 查看所有状态
cd /etc/zabbix/zabbix_agent2.d
./tcp_conn_stats.sh

# 查看总连接数
./tcp_conn_stats.sh total

# 查看特定状态
./tcp_conn_stats.sh LISTEN
./tcp_conn_stats.sh ESTABLISHED
./tcp_conn_stats.sh TIME_WAIT

# 自动发现
./tcp_conn_stats.sh discovery

7.2 Zabbix Agent 测试

bash 复制代码
zabbix_agent2 -t tcp.total -c /etc/zabbix/zabbix_agent2.conf
zabbix_agent2 -t tcp.state.count[LISTEN] -c /etc/zabbix/zabbix_agent2.conf
zabbix_agent2 -t tcp.states.discovery -c /etc/zabbix/zabbix_agent2.conf

7.3 zabbix_get 测试(从 Server 端)

bash 复制代码
zabbix_get -s <agent_ip> -p 10050 -k tcp.total
zabbix_get -s <agent_ip> -p 10050 -k "tcp.state.count[LISTEN]"
zabbix_get -s <agent_ip> -p 10050 -k tcp.states.discovery

7.4 重启 Agent

bash 复制代码
systemctl restart zabbix-agent2
systemctl status zabbix-agent2
tail -f /var/log/zabbix/zabbix_agent2.log

八、常见问题排查

8.1 监控项不显示数据

bash 复制代码
# 1. 检查 Agent 是否运行
systemctl status zabbix-agent2

# 2. 检查脚本执行权限
ls -la /etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh

# 3. 手动执行脚本测试
sudo -u zabbix /etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh LISTEN

# 4. 查看 Agent 日志
tail -50 /var/log/zabbix/zabbix_agent2.log

8.2 自动发现不生效

bash 复制代码
# 1. 检查自动发现规则是否启用
# Web: 模板 → TCP连接状态 → 自动发现

# 2. 检查监控项原型是否正确
# 键值必须为: tcp.state.count[{#TCP_STATE}]

# 3. 等待 1-2 分钟,自动发现需要时间

8.3 测试失败 - Character "{" is not allowed

在测试时, 字段要填具体状态值(如 ESTABLISHED),而不是 {#TCP_STATE}


九、文件清单

文件路径 说明
/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh 监控脚本
/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.conf Agent 配置文件

十、完整部署流程图

复制代码
┌─────────────────────────────────────────────────────────────┐
│                    部署流程                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. Agent 端配置                                            │
│     ├── 创建监控脚本 tcp_conn_stats.sh                      │
│     ├── 创建 Agent 配置 tcp_conn_stats.conf                │
│     └── 重启 Zabbix Agent                                  │
│                                                             │
│  2. 验证 Agent 端                                           │
│     ├── 测试脚本                                           │
│     └── 测试 Zabbix Agent 调用                             │
│                                                             │
│  3. Zabbix Web 界面配置                                     │
│     ├── 创建模板组 TCP_Status                              │
│     ├── 创建模板 TCP_Connection_Status                     │
│     ├── 创建 5 个手动监控项                                │
│     ├── 创建自动发现规则                                    │
│     └── 创建监控项原型                                      │
│                                                             │
│  4. 应用到主机                                               │
│     └── 将模板链接到主机                                    │
│                                                             │
│  5. 验证监控数据                                             │
│     ├── 查看 16 个监控项                                    │
│     └── 查看图形和最新数据                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

相关推荐
学着改变2751 小时前
手持式超声波流量计为何首选行澳科技?便携巡检与外夹计量的性能标杆
大数据·网络·人工智能·科技·产品运营·量子计算
2501_915921432 小时前
抓包鹰 Traceeagle 解除证书绑定,SSL Pinning 解除
网络·网络协议·网络安全·ios·adb·https·ssl
Lucky_Turtle3 小时前
【SSL】letsencrypt域名证书申请,Cloudflare域名
网络·网络协议·ssl
路由侠内网穿透3 小时前
本地部署企业级快速开发平台芋道管理后台并实现外部访问
运维·服务器·网络·网络协议
basketball6163 小时前
软考中级网络工程师 第4章 无线通信网 备考总结
linux·服务器·网络·网络工程师·软考
睡一觉就好了。5 小时前
Linux 信号机制
linux·运维·网络
A_humble_scholar8 小时前
Linux(二) C++ TCP/UDP网络编程
linux·网络·c++
nnerddboy8 小时前
Rust教程05:结构体,枚举与模式匹配
开发语言·网络·rust
xiaoxiangsiyan9 小时前
企业园区局域网交换技术完整版手册主打华为设备
运维·网络·学习·华为·路由·交换机·企业网