ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Zabbix Ping监控实战指南:从ICMP探测到告警通知

Zabbix Ping监控实战指南:从ICMP探测到告警通知 做监控这么多年如果让我从一堆监控项里选一个最值得先做起来的我一定会选zabbix的ping监控。CPU、内存、磁盘这些东西当然重要但所有监控的前提是那台设备得“活着”。zabbix的ping监控就是干这个的——通过ICMP探测目标主机是否在线、响应快不快、丢包严不严重。它解决的问题非常朴素服务器宕机、网络设备掉线、虚拟机失联这些故障一旦发生你要在第一时间知道而不是等业务侧反馈。这篇文章适合刚装好zabbix想给第一台主机加监控的运维也适合手里捏着几十上百台服务器、交换机、路由器想快速做一轮存活摸底的人。1. 方案选型为什么是zabbix做ping监控1.1 ping监控到底在监控什么很多人一听到“ping监控”觉得不就是发几个ICMP包嘛。但放到zabbix里它其实是在持续、自动地做三件事探测目标主机是否可达、统计丢包率、记录响应时间。这三件事分别对应三个监控项模板里的key分别是icmpping、icmppingloss、icmppingsec。主机存活状态icmpping返回1表示ICMP探测成功返回0表示超时或不可达。丢包率icmppingloss单位是百分比比如5.0表示有5%的包丢了。这个值对网络质量评估特别重要像跨机房链路抖动的时候往往主机还没完全断但丢包率已经很难看了。响应时间icmppingsec单位是秒表示平均往返延迟。0.015就是15ms如果这个值长期飙到一两百毫秒就要小心网络链路是不是出了状况。这三个指标其实是递进关系先看通不通再看丢不丢包最后看快不快。zabbix之所以用这三个维度而不是只用一个ping结果是因为“能ping通”并不等于“网络质量好”。我见过不少案例主机能通但丢包率已经到30%了业务那边已经在抱怨卡顿监控里却只有ICMP ping正常这一个结论。所以把丢包率和响应时间一起接进来才算完整的存活监控。另外要搞清楚一个概念zabbix的ping监控走的是ICMP协议不是TCP端口探测。有些人搜“ping端口”搜到这里发现实现不了那是因为方向不对。ICMP ping本身不带端口概念如果你想探测某台机器的80端口通不通zabbix里应该用net.tcp.port或者net.tcp.service监控项那是另一套逻辑后面排查部分我会再详细说。1.2 模板选择直接用ICMP Ping模板还是自己造轮子zabbix最厚道的地方在于官方已经把常见监控场景封装成了模板。只要你装完zabbix默认模板库里就有“Template Module ICMP Ping”不用自己写监控项也不用自己写触发器链接模板就完事。这个模板里自带刚才说的三个监控项ICMP ping、丢包率、响应时间同时还有几个触发器比如主机无响应、丢包率过高、响应时间过长以及对应的图形展示。那什么时候需要自己造轮子两种情况。第一种你觉得官方模板的监控频率或者阈值不合适。比如官方默认的丢包率告警阈值是40%但你们内网质量要求高丢包5%就得报警那你可以复制一份模板把触发器里的{$ICMP_LOSS_WARN}宏改成5或者你想让ping探测更密集官方默认60秒一次你可以把监控项的更新间隔改成30秒但要注意这会增加fping和server端的压力。第二种你不想用官方模板想用zabbix agent的UserParameter直接调用系统ping命令。这种方式跟官方模板的实现原理完全不同。官方模板走的是zabbix server内置的simple check它会在server端调用fping来做探测不依赖被监控主机上的agent。而UserParameter是让agent去执行系统自带的ping命令然后把结果传回来。我个人的建议是能用官方模板就别自己写simple check的方案性能更好尤其当你监控几百台设备的时候fping的并行效率是系统ping命令没法比的。1.3 与其他监控方案的取舍热词里出现了prometheus、smokeping这些名字我顺便说说zabbix在这件事上的定位。prometheus确实很火但它强在指标采集、PromQL查询、跟Kubernetes生态的整合如果你要做的是大规模容器平台的监控prometheus是更对味的选择。但如果你要监控的是机房里的物理服务器、网络交换机、路由器或者你想用一套系统同时管服务器和网络设备zabbix的上手成本和维护成本反而更低。smokeping则是一个专注做网络质量可视化的小工具它的图表做得非常漂亮很适合长期展示丢包率和延迟趋势。但它有两个短板一是告警能力弱二是数据孤岛问题它不会跟你的主机CPU、磁盘空间、业务进程关联起来。zabbix做ping监控强大之处在于ping只是入口一旦设备被纳入监控体系你随时可以给它追加agent监控、SNMP监控、端口探测、自定义脚本所有数据都汇聚在一个平台上。所以我的结论是轻量可视化选smokeping云原生指标选prometheus但要做“设备存活故障告警关联其他监控”这种综合性需求zabbix是综合成本最低的答案。2. 环境准备从零搭建zabbixfping这步最容易翻车2.1 Server端部署参数与数据库初始化要跑起zabbix你得先有一台zabbix server这里说的不是agent是服务端。新部署的话建议直接选当前LTS版本比如zabbix 7.0 LTS功能完善而且支持周期长如果是老环境6.0、5.0的存量也很多。安装步骤官方文档写得很清楚我这边只挑关键点说。以Rocky Linux / CentOS系为例先装zabbix的官方软件源然后安装server、web前端、agent这几个包。数据库方面zabbix官方最常用的组合是MySQL/MariaDB或者PostgreSQL我这边用MySQL举例。数据库创建和授权是很多人第一次卡住的地方特别是热词里出现的“access denied for user replace_userlocalhost”我在后面排查章节会专门讲这里先把命令摆出来CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER zabbixlocalhost IDENTIFIED BY 你的密码; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; FLUSH PRIVILEGES;数据库建好之后要导入zabbix自带的初始数据。注意不同版本导入路径不太一样7.0一般在这个位置zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p你的密码 zabbixdatabase schema导入完成之后修改/etc/zabbix/zabbix_server.conf里面的DBPassword然后启动服务。这一步其实和ping监控不算直接相关但你如果不把它踩平后面web界面上永远会挂着一个“zabbix server is not running”的警告干什么都别扭。2.2 fping依赖zabbix能ping背后的关键这是zabbix做ping监控最核心、也最容易翻车的一步。很多人打开web界面把主机加好了模板链接了但监控项一直显示“不支持”或者“无数据”翻日志一看全是fping相关报错。原因很简单zabbix server的ICMP simple check不是自己实现ICMP协议的它在底层调用了fping这个工具。fping跟系统自带的ping不一样它天生就是为了批量探测设计的可以同时给多个目标发ICMP包而且可以直接把结果输出成zabbix能解析的格式。这也是为什么zabbix官方模板选择fping而不是/bin/ping。但问题来了fping默认是用普通权限运行的而zabbix server进程运行在zabbix这个用户下。zabbix用户没有权限创建原始套接字也就发不出ICMP包。解决方案是给fping加上setuid权限dnf install -y fping chmod us /usr/sbin/fping然后检查zabbix_server.conf里的FpingLocation是不是指向了正确的路径默认一般是/usr/sbin/fping如果有出入手动改一下sed -i s|^# FpingLocation.*|FpingLocation/usr/sbin/fping| /etc/zabbix/zabbix_server.conf systemctl restart zabbix-server改完之后怎么验证是否成功不要急先切到zabbix用户下跑一次fpingsudo -u zabbix /usr/sbin/fping 127.0.0.1如果正常输出127.0.0.1 is alive说明路径和权限都没问题。如果出现“Operation not permitted”说明setuid没生效或者fping的路径不对。这一步我强调这么细是因为它真的太容易被忽视了。你花半小时排查网络、排查防火墙最后发现只是少了一行chmod那种感觉太难受了。另一种更安全的替代方案是给fping设置Linux能力位这样就不需要setuid对所有人开放权限setcap cap_net_rawep /usr/sbin/fping效果类似安全粒度更细。不过传统文档里写setuid的更多你按照自己的安全规范来选就行。2.3 监控前的网络连通性检查在进入web界面之前还有一个笨方法但特别管用先在zabbix server上手动ping一下你要监控的目标确认这条网络路径本身是通的。别觉得这步多余我遇到太多“监控项一直无数据”的案例最后发现server跟目标主机之间根本不通。这里有个容易忽略的点是DNS。有人直接在zabbix里填了个主机名然后监控项不工作日志里报的却是解析不了域名。如果你遇到“ping: www.baidu.com: name or service not known”这类提示先别急着怀疑zabbix这是DNS解析问题。检查一下server上的/etc/resolv.conf或者干脆在zabbix主机配置里用IP地址问题立刻解决。防火墙也是个老生常谈但绕不开的坑。zabbix server发出的ICMP echo request目标主机的防火墙必须放行echo-request。Linux这边如果启用了iptables或者firewalld记得放行ICMPWindows主机则在“高级安全Windows Defender防火墙”里启用“文件和打印机共享(回显请求 - ICMPv4-In)”规则或者开放对应的入站ICMP规则。很多Windows机器默认允许ICMP回显但有些安全策略会禁掉这时候你在server上ping别的主机是通的ping这台Windows就是超时那这台主机在zabbix里必定是红的。虚拟机场景也经常出问题。像VirtualBox或者VMware里的虚拟机如果网络模式配置不对从宿主机或者其他机器没法ping通桥接地址。热词里“虚拟机ping不通百度”就是这个道理——先确认虚拟机本身能上网再确认宿主机到虚拟机通不通最后再上zabbix。虚拟机跟物理机在网络这块没有本质区别ICMP包不会因为对方是虚拟机就特殊优待。3. Web端操作添加主机、链接模板、验证数据3.1 主机群组与被监控对象怎么归类环境准备好之后进入zabbix的web界面。很多人加主机很随意群组直接扔“Discovered hosts”或者默认的“Zabbix servers”其实这一步值得多花一分钟。主机群组不只是用来分类的还关联着权限控制。比如以后来了新同事你只想让他看网络设备的状态不想让他看数据库服务器的信息那就要靠主机群组来划分权限粒度。我建议按业务类型或者监控类型来建组比如“Router-Switch”、“Linux-Server”、“VM-Servers”然后把对应主机拉进去。添加主机的时候有几个字段要注意。“主机名称”建议填实际的主机名或者FQDN这样跟agent配置能对上“可见名称”是给人看的名字可以写得友好一点比如“支付网关-主节点”“模板”先不急着选把模板留到链接那一步再说关键是“接口”这一栏。如果你只做ping监控理论上可以不填agent接口因为官方Template Module ICMP Ping里的监控项全是ICMP类型的不依赖agent。但我的习惯是同时把agent接口也填上端口默认10050因为今天只加ping监控不代表以后不想加CPU、内存监控接口先占住后面链接Agent模板就能直接出数据。3.2 链接ICMP Ping模板并调整宏主机保存之后进入模板配置页面搜索“ICMP”会看到“Template Module ICMP Ping”。链接这个模板保存。这时候不用做任何额外操作zabbix就会自动创建三个监控项、几个触发器和两张图形。如果你点进去看模板内容会发现模板里已经预设好了两个宏{$ICMP_LOSS_WARN}和{$ICMP_RESPONSE_TIME_WARN}。宏的作用是让阈值可配置化。默认情况下丢包率超过40%触发警告响应时间超过0.2秒200毫秒触发警告。这两个默认值偏宽松适合广域网或者链路质量一般的场景。如果你监控的是内网核心交换机200毫秒肯定不能忍一般内网响应时间在1毫秒到几毫秒之间超过20毫秒都算异常。修改阈值有两个位置在模板上改宏会影响所有使用这个模板的主机在主机的“宏”Tab里改只对当前主机生效。我的建议是模板宏保持默认主机级别按需覆盖。比如某个跨地域专线的延迟本身就高你在那个主机的宏定义里把{$ICMP_RESPONSE_TIME_WARN}改成0.5就不会三天两头误报。同理有些业务对链路质量敏感丢包率5%就要报警就在对应主机的宏里把{$ICMP_LOSS_WARN}改成5。这种按主机覆盖宏的方式既灵活又不会污染公共模板。3.3 数据验证从“无数据”到看到1和0配置完成之后别急着走人要做数据验证。默认监控项更新间隔是60秒所以等一分钟左右进入“监测 - 最新数据”筛选刚才添加的主机应该能看到三个监控项的数据。icmpping正常显示值为1如果目标不可达会变成0。icmppingloss正常显示0或0.0偶尔有丢包会显示数值。icmppingsec正常显示零点几几秒比如0.001就是1毫秒。这几个值尤其是icmppingleoss和icmppingsec是个非常实用的“网络质量试纸”。我之前接一期监控的时候用zabbix扫了一批主机发现其中两台服务器的icmpping都是1但icmppingsec一个显示0.002一个显示0.189差距肉眼可见。同事本来没当回事我让他仔细检查了一下那台延迟高的机器结果发现它跑了几个异常进程负载很高网络栈被拖垮磁盘IO也在报警边缘。如果没有这组响应时间数据这种隐患很难被注意到。如果等了一两分钟最新数据还是空的先别慌。看两个地方一是zabbix server的日志/var/log/zabbix/zabbix_server.log有没有fping相关的报错二是“监测 - 主机”页面里这个主机的“可用性”标签是否显示“已支持”。如果显示“不支持”点进去看错误信息多半能定位到问题。数据验证这件事一定要做扎实我在生产环境见过太多“配了监控就再也不看”的情况结果模板链接错了、宏没生效监控等于白配故障来了照样没人知道。4. 告警触发让ping不通的消息主动找上门4.1 触发器表达式怎么判定“真的挂了”监控数据有了接下来就是把“异常”变成“通知”。zabbix里判断是否异常靠的是触发器。官方ICMP模板自带的触发器“No response from host”用的是last(/host/icmpping)0这个表达式意思是只要最近一次探测结果为0就触发告警。但说实话这种单次判断在真实环境里误报率不低。网络抖动、目标主机短时CPU峰值、防火墙临时丢一个包都可能造成单次探测失败。我的习惯是把触发器的判断窗口拉长一点改成连续多次失败或者一段时间内全部失败才告警。比如下面这个表达式表示过去2分钟内的所有探测结果都是0才判定主机不可达min(/目标主机/icmpping,2m)0还有一种思路是利用nodata()函数如果监控项在某个时间窗口内没有数据就告警nodata(/目标主机/icmpping,3m)1nodata在这里的意思是如果连续3分钟没有收到新的ICMP探测数据就认为主机失联。这种判断方式比last()更稳因为网络抖动可能让某一次探测丢了但不会让连续3分钟的所有探测都丢了。链接官方模板时你也可以复制一份模板把触发器表达式改成这两个版本之一然后给目标主机重新链接。丢包率和响应时间也都有自己的触发器阈值就是之前说的两个宏。丢包率触发器的表达式大致是last(/目标主机/icmppingloss){$ICMP_LOSS_WARN}响应时间的触发器表达式是last(/目标主机/icmppingsec){$ICMP_RESPONSE_TIME_WARN}理解触发器表达式背后的逻辑比记住表达式本身更重要。zabbix的触发器表达式本质上是对历史数据和时间窗口做运算你不需要一次记住所有函数但要知道last()看最新值、min()看窗口内的最小值、nodata()看有没有数据。这几个函数组合使用能覆盖绝大多数存活监控场景。4.2 告警媒介邮件和钉钉webhook的接法触发器状态变了最终要通过媒介Media Type把消息送出去。zabbix最常见的告警媒介是邮件配置思路是在“管理 - 报警媒介类型 - Email”里配置SMTP服务器、端口、发件人邮箱和认证信息然后在用户的“报警媒介”Tab里添加收件邮箱并设置通知条件。邮件这块配置本身不难容易踩坑的是很多公司服务器不开放25端口或者SMTP要求SSL/TLS加密。我建议直接用465或587端口加SSL的方案别跟25端口杠既慢又容易被运营商拦。除了邮件现在国内团队用得更多是钉钉。热词里提到“zabbix 7.0联动钉钉”这个其实有现代和传统两种做法。传统做法是在zabbix server的AlertScriptsPath目录一般在/usr/lib/zabbix/alertscripts或者/etc/zabbix/alertscripts下放一个脚本脚本里通过钉钉机器人Webhook发送消息。脚本用Python写很省事#!/usr/bin/env python3 import json import sys import urllib.request webhook_url https://oapi.dingtalk.com/robot/send?access_token你的token text sys.argv[1] data { msgtype: text, text: { content: text } } req urllib.request.Request(webhook_url, datajson.dumps(data).encode(utf-8), headers{Content-Type: application/json}) urllib.request.urlopen(req)写完之后记得给脚本执行权限然后在zabbix“报警媒介类型”里新建一个“钉钉”类型脚本参数里填消息内容。7.0版本里其实可以直接用Webhook媒介类型不需要脚本文件但用脚本依然是当前存量环境里兼容性最好的办法。4.3 动作配置谁在什么时候收到什么消息媒介配好了还得有“动作”去触发它。动作的作用是把触发器的报警事件关联到具体的用户和媒介上相当于自动化规则。在“配置 - 动作 - Triggers”里新建一个动作源模板可以限定为“Template Module ICMP Ping”这样只有挂了这个模板的主机报警时才触发。动作里最重要两块。第一块是条件比如默认条件就是触发器严重级别不低于“警告”第二块是操作在操作里添加“发送消息”步骤选择用户和媒介然后用zabbix内置宏拼消息内容。我常用的消息模板长这样主机 {HOST.NAME} 不可达 IP地址: {HOST.IP} 发生时间: {EVENT.DATE} {EVENT.TIME} 当前状态: {TRIGGER.STATUS} 严重级别: {TRIGGER.SEVERITY}同时要配置“恢复操作”把通知发给同一批人不然主机恢复了没人说群里就永远留着一个悬空的告警。恢复消息可以用“{TRIGGER.STATUS}”来区分问题状态和恢复状态。这个细节很多新手会漏。动作里的另一类操作是远程命令比如ping不通之后自动尝试重启某个服务或者自动触发一套自愈脚本。远程命令的坑比较多需要zabbix agent或者server端有执行权限配置不当容易变成安全隐患。我的建议是前期先把通知做好远程命令等熟练了再引入。5. 高频问题排查与避坑总结5.1 zabbix server is not running 的常见解热词里有一条“zabbix server is not running: the information displayed may not be current.”这大概是zabbix新手最熟悉的红字警告。看到这个提示第一反应不是去改代码而是先确认zabbix-server服务本身是否活着systemctl status zabbix-server如果服务没起来去看日志/var/log/zabbix/zabbix_server.log大部分原因集中在数据库连接失败、数据库密码不对、磁盘空间满、缓存配置太小这几类。特别是数据库密码很多人装完zabbix后只改了web前端的配置忘了zabbix_server.conf里还有一份DBPassword也要同步改服务自然起不来。改完密码记得重启服务。如果说服务起来了web前端还是提示not running那多半是时区或PHP配置的问题。检查一下/etc/php-fpm.d/zabbix.conf里的date.timezone是否设置成了Asia/Shanghai然后重启php-fpm和httpd。5.2 access denied for user replace_user 的处理安装zabbix的web界面时如果数据库配置填写不正确很容易看到“access denied for user replace_userlocalhost”这个报错。这里的replace_user其实就是一个占位符告诉你数据库用户或密码有问题。有人照着网上教程复制粘贴把YourPassword这种示例字符也粘进去了结果连库当然失败。正确的做法是回到数据库层面重新核对三件事第一个MySQL里是否真的创建了zabbix用户并给了权限第二个密码里有没有特殊字符导致配置解析异常第三个zabbix_server.conf里的DBUser和DBPassword是否和数据库实际用户一致。排查命令就是上面建库那几条SQL不要嫌麻烦数据库这种问题越早确认越省时间。5.3 有监控项但无数据事件日志和fping权限排查主机加了、模板链了、宏也调了但“最新数据”页面一直空空如也。这是我遇到最多的问题没有之一。优先级最高的怀疑对象就是fping权限问题。如果你在/var/log/zabbix/zabbix_server.log里看到类似“fping: socket: Operation not permitted”的语句说明fping没有setuid权限或者FpingLocation指向的路径不对。按我前面说的执行chmod us /usr/sbin/fping重启zabbix-server然后马上用sudo -u zabbix /usr/sbin/fping 127.0.0.1验证。如果还不行检查一下zabbix_server.conf里的FpingLocation是不是指定的/usr/sbin/fping有些发行版fping安装位置不同比如Debian系可能在/usr/bin/fping。另一个容易忽略的点是主机的“可用性”状态。如果“监测 - 主机”里该主机的“Zabbix agent”标签是红色但你的监控项全是从ICMP模板来的那红色可能只是提示agent没配不影响ping监控数据。真正看ICMP监控项是否走通要看“最新数据”里那三个指标的数值有没有出现。5.4 误报与漏报调整阈值和触发次数的经验误报比漏报好处理但也很烦。最常见的是无线网络设备或者跨公网链路的主机响应时间和丢包率波动很大官方模板默认的严格阈值很容易触发告警。解释一下为什么模板里丢包率默认值是40%如果你监控的是一条本来就丢包率在10%-20%波动的海外链路那么一切正常但如果你的监控目标是内网服务器丢包率超过1%都说明网络有严重问题。我的建议是内网核心设备把{$ICMP_LOSS_WARN}改到5左右把{$ICMP_RESPONSE_TIME_WARN}改到0.05左右外网或专线设备则相应放宽。同时把触发器从单次判断改成连续判断用min()或nodata()来过滤瞬时抖动。这个思路放在任何监控系统里都适用宁可多花5分钟调阈值也不要半夜被一堆无效告警轰炸到麻木。5.5 被监控主机禁ping时的处理思路很多公司出于安全考虑会在防火墙上禁掉ICMP服务器不接受任何ping请求。这时候你再怎么在zabbix里配ICMP监控数据都只能是0。解决方案有两种。第一种申请放行ICMP。跟安全团队沟通时可以解释监控需要ICMP探测在线状态由zabbix server这个固定IP发起不会造成安全风险。大多数情况下只要IP白名单明确安全团队都愿意放行。第二种如果实在放行不了就用“非ICMP”的存活探测方式。具体做法在zabbix里用net.tcp.port监控项探测关键TCP端口比如22、443、3306或者直接部署zabbix agent用agent的心跳数据来确认主机活着。这两种方式本质上也是在回答“这台机器还在不在”的问题只不过绕开了ICMP限制。顺便说一句很多人搜索“ping端口”其实就是想要这个效果zabbix里对应的监控项是net.tcp.port[,80]这种形式这里的80就是你要探测的端口号。5.6 多机房跨网段场景下的误报排查如果你用一套zabbix server同时监控多个机房的设备偶尔会出现“某个机房所有主机全部告警”的情况。这时候先别急着冲向某个机房先看一眼是不是zabbix server到那个机房的专线断了。如果是所有主机的ping告警会同时爆发这就是典型的网络路径问题不是设备问题。要规避这种情况大规模分布式环境下可以引入zabbix proxy。在每个机房放一个proxy由proxy负责本机房的ICMP探测再统一上报给中心server。这样ping监控的目标范围就缩小到了proxy到本机房设备这段链路能显著减少误报。当然小规模环境不需要这么复杂但人心里要清楚ICMP探测结果依赖于网络路径的稳定性网络路径本身就是监控系统的一部分。做ping监控这一路我感触最深的一点是它看起来简单但牵扯的细节一点都不少。从fping的权限到触发器的判断逻辑到告警消息的模板每一环掉链子都会让监控失去意义。我个人习惯的做法是每接一批新的被监控设备先在server上用fping批量扫一遍确认网络路径是通的再进web界面配置。这个习惯帮我少踩了太多坑也推荐给你。等你把基础的ping监控跑稳了再往上看agent监控、SNMP监控、端口监控整个体系就能像滚雪球一样搭起来了。
返回列表