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 创建监控脚本
脚本路径
/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.sh
脚本内容
#!/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 "$@"
设置权限
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 配置文件
配置文件路径
/etc/zabbix/zabbix_agent2.d/tcp_conn_stats.conf
配置文件内容
# 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
设置权限
chown zabbix:zabbix /etc/zabbix/zabbix_agent2.d/tcp_conn_stats.conf
2.3 重启 Zabbix Agent
systemctl restart zabbix-agent2
systemctl status zabbix-agent2
三、验证 Agent 端
3.1 测试脚本
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
# 测试各个监控项
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 端或本机)
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 创建模板组
路径:数据采集 → 模板组 → 创建模板组
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 |
添加监控项:
TCP总连接数 (tcp.total) - 黑色
TCP ESTABLISHED连接数 (tcp.established) - 绿色
TCP TIME_WAIT连接数 (tcp.timewait) - 蓝色
TCP LISTEN连接数 (tcp.listen) - 橙色
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.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 端测试命令
# 查看所有状态
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 测试
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 端)
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
systemctl restart zabbix-agent2
systemctl status zabbix-agent2
tail -f /var/log/zabbix/zabbix_agent2.log
八、常见问题排查
8.1 监控项不显示数据
# 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 自动发现不生效
# 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 个监控项 │
│ └── 查看图形和最新数据 │
│ │
└─────────────────────────────────────────────────────────────┘