惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security @ Cisco Blogs
The Last Watchdog
The Last Watchdog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
PCI Perspectives
PCI Perspectives
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LangChain Blog
B
Blog RSS Feed
小众软件
小众软件
N
News | PayPal Newsroom
Attack and Defense Labs
Attack and Defense Labs
Microsoft Azure Blog
Microsoft Azure Blog
V
Vulnerabilities – Threatpost
The Hacker News
The Hacker News
T
Tor Project blog
A
Arctic Wolf
Jina AI
Jina AI
Hacker News: Ask HN
Hacker News: Ask HN
F
Fortinet All Blogs
Cloudbric
Cloudbric
S
Secure Thoughts
L
LINUX DO - 热门话题
博客园 - 司徒正美
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security Affairs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
P
Privacy International News Feed
AWS News Blog
AWS News Blog
S
Securelist
TaoSecurity Blog
TaoSecurity Blog
AI
AI
O
OpenAI News
C
Cyber Attacks, Cyber Crime and Cyber Security
K
Kaspersky official blog
T
The Blog of Author Tim Ferriss
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
T
Tenable Blog
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
S
SegmentFault 最新的问题

lvbibir's Blog

shell | 磁盘空间分析脚本 Linux cat 和 tee 命令写入文件 python | 使用 uv 管理你的 python 环境 Claude Code 完整配置指南 windows | mihomo 内核独立部署指南 linux | 磁盘扩容 wsl | 释放长久运行占用的磁盘空间 mysql | 线程上限问题处理 麒麟 7.6 安装谷歌 OTP 认证模块 suse 12sp5 升级 openssh 及 openssl suse 12sp5 部署 mysql 5.7 《谁的青春不迷茫》 docker | centos7 部署 docker vim | 基础配置和使用 windows | rime 输入法 & 雾凇方案 shell | sshpass 批量传输文件及执行命令 wsl | 原生 linux 方式安装 docker nodejs | fnm + pnpm 开发环境配置 wsl | 安装配置 miniconda 虚拟环境 wsl | 自动更新系统代理 wsl | bashrc 环境变量不正确加载的处理方法 wsl | win10 安装 wsl2 troubleshooting | ssh 成功但是 scp 失败 linux | 常用命令总结 docker 部署 piclist shell | 检测网站存活并自动钉钉告警 Zabbix | 监控端口连通性并自动追踪 TCP 路由 windows | 自定义开机快速启动项 windows | miniconda 配置 python 虚拟环境 shell | centos 初始化 loki (二) 部署 loki (一) 简介 prometheus (六) Alertmanager prometheus (五) 记录规则与告警规则 prometheus (四) 黑盒监控 prometheus (三) 服务发现 prometheus (二) 静态配置 prometheus (一) 简介及部署 traefik (四) TraefikService 服务 traefik (三) Middleware 中间件 traefik (二) ingressRoute 路由 traefik (一) 简介、部署和配置 kubernetes | Gateway API 简介及部署 linux | dns 配置文件中 search 和 options ndots 详解 kubernetes | command args 和 dockerfile 中的 ENTRYPOINT CMD kubernetes | statefulset 控制器详解 docker | dockerfile 最佳实践 docker | dockerfile 指令详解 linux | kill 命令详解以及 linux 中的信号 troubleshooting | elasticsearch 安装插件报错 shell | if 条件判断 docker | 下载外网镜像的几种方式 python | 鬼谷子数学问题 steam挂刀教程 linux | history 命令的格式化输出 shell | 将本地镜像批量推送到 harbor windows | hosts 文件修复 kubernetes | configmap & secret kubernetes | RBAC 鉴权和 NetworkPolicy kubernetes | service & ingress kubernetes | 存储 kubernetes | 滚动升级和自动伸缩 kubernetes | 控制器 kubernetes | 日志 kubernetes | 调度 kubernetes | pod kubernetes | 杂记 linux | set 命令详解 ceph | openeuler 部署 ceph-v16 ceph | ceph-v16 离线安装解决方案 pxe 如何应对复杂的服务器硬件环境 python | 批量修改目录下文件名 《微习惯》 ceph | openeuler (aarch64) 部署 ceph-v16 troubleshooting | glibc 误升级后修复 pxe 安装配置大全 《人间失格》 跑步日常 [置顶] Hello, hugo! shell | 检索某 url 中所有文件的内容 shell | 不同执行方式的区别 shell | 开启 debug 模式 vscode | 常见问题 windows & linux 多网卡时设置默认路由以及添加静态路由 mysql (二) 主从复制原理 GTID 并行复制 mysql (一) 部署 mysql | 杂记 cicd | jenkins 部署 mall-swarm 项目 httpd 源码打包编译成 rpm 包 openssl 源码打包编译成 rpm 包 centos7 | 修改网卡名称 ceph | pool pg_num 配置 docker | 脚本方式批量导出/导入镜像 centos 密码尝试次数过多问题处理 centos7 | 升级内核至 5.10 CVE-1999-0526 ceph | centos7 部署 ceph-v12 python | 修改 pip 源 troubleshooting | 安装 cloud-init 后导致 ssh 连接失败 windows | autohotkey 常用脚本
Zabbix | 监控主机到指定 ip 的流量大小
lvbibir · 2023-08-04 · via lvbibir's Blog

0 前言

分享一下如何监控某个主机上的网卡到指定 ip 的流量大小, 测试环境已安装 tcpdump 并配置了 zabbix_agent

被检测端 ip 为 1.1.1.11, 要检测到 1.1.1.12-17 这些 ip 的出口流量

大致流程为:

  • 创建一个监控脚本, 分析 1 分钟内指定网卡发送到指定 ip 的数据包大小并输出到日志文件
  • 将该脚本放到 crontab 中, 每分钟执行一次
  • 配置 zabbix-agent
    • 创建数据采集脚本, 提取日志文件中的内容
    • 添加自定义配置, 创建采集的键值
  • 配置 zabbix-server
    • 添加监控项
    • 添加触发器
    • 添加仪表盘

1 监控脚本

添加 /opt/traffic_monitor.sh

#!/bin/bash

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

set -e

# 检查是否安装了tcpdump命令
if which tcpdump >/dev/null 2>&1; then
    # 如果已安装,则不进行任何提示
    :
else
    echo "系统中未安装 tcpdump 命令,请先安装 tcpdump。"
    exit 1
fi

# 检查是否有 tcpdump 残留进程
existing_tcpdump_pids=$(pgrep -f "tcpdump -i ens32 -nn dst") || true

# 检查 tcpdump 进程数量
tcpdump_count=$(echo "${existing_tcpdump_pids}" | wc -w)
if [ "$tcpdump_count" -gt 6 ]; then
    # 如果数量大于 6 视为之前的进程未正确关闭, 杀死所有 tcpdump 进程
    kill -9 ${existing_tcpdump_pids}
fi

IPLIST=("1.1.1.12" "1.1.1.13" "1.1.1.14" "1.1.1.15" "1.1.1.16" "1.1.1.17")

LOG_DIRECTORY=/var/log/traffic_monitor
LOG_FILE=${LOG_DIRECTORY}/traffic_monitor.log
[ -d "${LOG_DIRECTORY}" ] || mkdir -p "${LOG_DIRECTORY}"
[ -f "${LOG_FILE}" ] || touch "${LOG_FILE}"

# 获取文件大小(以字节为单位)
log_file_size=$(du -b "$LOG_FILE" | cut -f1)

# 设置100M对应的字节数
limit_size=$((100 * 1024 * 1024))

# 检查文件大小是否大于100M
if [ "$log_file_size" -gt "$limit_size" ]; then
    # 清空文件
    echo "" > "$LOG_FILE"
fi


start_time=$(date +"%Y%m%d-%H%M%S")

for ip in "${IPLIST[@]}"; do
    (
        # 开始 tcpdump 抓包
        output_file=/tmp/monitor-${ip}-${start_time}.output
        nohup tcpdump -i ens32 -nn dst ${ip} and not icmp 2>/dev/null > ${output_file} &

        # 等待 60 秒后关闭 tcpdump
        tcpdump_pid=$!
        sleep 60 && kill ${tcpdump_pid}
        stop_time=$(date +"%Y%m%d-%H%M%S")

        # 分析流量大小, 以 KB 为单位
        traffic_size=$(cat ${output_file} | awk -F'length ' '{print $2}' | awk '{sum+=$1} END {printf "%.2f", sum / 1024}')

        # 删除 tcpdump 的输出文件
        rm -f ${output_file}
        echo "${ip} ==== ${start_time} ----> ${stop_time} ===== (KB) ${traffic_size}" >> ${LOG_FILE}
    ) &
done

# 等待所有后台任务完成
wait

exit 0

放到 crontab 中

* * * * * /bin/bash /opt/traffic_monitor.sh >/dev/null 2>&1

日志文件应有类似如下输出

$ tail -12 /var/log/traffic_monitor/traffic_monitor.log
1.1.1.14 ==== 20230804-154601 ----> 20230804-154701 ===== (KB) 1964.99
1.1.1.12 ==== 20230804-154601 ----> 20230804-154701 ===== (KB) 0.23
1.1.1.17 ==== 20230804-154601 ----> 20230804-154701 ===== (KB) 1029.35
1.1.1.16 ==== 20230804-154601 ----> 20230804-154701 ===== (KB) 1029.35
1.1.1.15 ==== 20230804-154601 ----> 20230804-154701 ===== (KB) 1029.35
1.1.1.13 ==== 20230804-154601 ----> 20230804-154701 ===== (KB) 1029.35
1.1.1.12 ==== 20230804-154701 ----> 20230804-154801 ===== (KB) 1029.49
1.1.1.14 ==== 20230804-154701 ----> 20230804-154801 ===== (KB) 0.00
1.1.1.15 ==== 20230804-154701 ----> 20230804-154801 ===== (KB) 0.00
1.1.1.16 ==== 20230804-154701 ----> 20230804-154801 ===== (KB) 1029.35
1.1.1.13 ==== 20230804-154701 ----> 20230804-154801 ===== (KB) 0.00
1.1.1.17 ==== 20230804-154701 ----> 20230804-154801 ===== (KB) 3086.44

2 配置 zabbix-agent

添加 /opt/zabbix_traffic_monitor.sh, 根据 ip 筛选最后一个匹配项的数值

#!/bin/bash

LOG_DIRECTORY=/var/log/traffic_monitor
LOG_FILE=${LOG_DIRECTORY}/traffic_monitor.log

grep "$1" "${LOG_FILE}" | awk '{last_column=$NF} END {print last_column}'

添加 /etc/zabbix/zabbix_agentd.d/get_traffic_monitor.conf 配置文件

UserParameter=get_traffic_monitor[*],/opt/zabbix_traffic_monitor.sh $1

重启 zabbix-agent

systemctl restart zabbix-agent

3 配置 zabbix-server

创建监控项, 有几个 ip 创建几个监控项

image-20230804155344575

监控项测试, 此处应有值

image-20230804155732762

创建触发器, 同样的, 有几个 ip 创建几个

image-20230804155851395

仪表盘添加图形

image-20230804160014573

4 测试

找一台服务器配置多 ip

IPADDR=1.1.1.12
NETMASK=255.255.255.0
GATEWAY=1.1.1.254
DNS1=8.8.8.8
DNS2=114.114.114.114

IPADDR1=1.1.1.13
NETMASK1=255.255.255.0
IPADDR2=1.1.1.14
NETMASK2=255.255.255.0
IPADDR3=1.1.1.15
NETMASK3=255.255.255.0
IPADDR4=1.1.1.16
NETMASK4=255.255.255.0
IPADDR5=1.1.1.17
NETMASK5=255.255.255.0

重启 network

image-20230804160238120

配置 1.1.1.11 到 1.1.1.12-17 的免密登录

ssh-keygen
ssh-copy-id root@1.1.1.12

# 每个 ip 都 ssh 一下, 添加一下 hotkey
ssh root@1.1.1.13
ssh root@1.1.1.14
ssh root@1.1.1.15
ssh root@1.1.1.16
ssh root@1.1.1.17

运行一个脚本模拟网络流量

#!/bin/bash

# 设置目标IP地址列表
ip_list=("1.1.1.12" "1.1.1.13" "1.1.1.14" "1.1.1.15" "1.1.1.16" "1.1.1.17")

dd if=/dev/zero of=/tmp/test bs=1M count=1

while true; do
    # 生成一个随机数,范围为 0 到 5
    random_index=$((RANDOM % 6))
    
    # 随机选择一个IP
    target_ip="${ip_list[random_index]}"
    
    echo ${target_ip}
    /usr/bin/scp /tmp/test root@${target_ip}:/tmp/
    
    # 等待10秒
    sleep 10
done

运行脚本, 应有如下输出

image-20230804160852278

过段时间后查看仪表盘, 能看到流量数据

image-20230804161027483

触发器也应正常工作

image-20230804161124280

以上

wechat_pay

微信

alipay

支付宝