尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

通过Zabbix监控14条不同线路的出口IP,并与预设值对比,不一致时通过飞书告警

通过Zabbix监控14条不同线路的出口IP,并与预设值对比,不一致时通过飞书告警 通过Zabbix监控14条不同线路的出口IP并与预设值对比不一致时通过飞书告警——我们可以设计一个清晰、自动化的方案。核心思路在边界防火墙上已经配置了策略不同的域名走不同的外网线路。因此我们只需要让Zabbix定期访问这些域名并获取返回的出口IP即访问这些域名时从哪条线路出去然后将该IP与预先设定的标准IP进行比较。注意这里“获取IP”不是获取域名解析的目标IP而是通过访问一个“IP查询服务”如 ifconfig.me该服务会返回请求者的源IP也就是你那条线路的公网出口IP。方案组件14个IP查询服务域名用于触发不同的出口线路。Zabbix监控项每个域名对应一个监控项定期获取出口IP。Zabbix触发器将获取到的IP与预设值比较不匹配则触发告警。飞书告警通过Zabbix的媒介Media和动作Action发送消息到飞书群机器人。第一步准备14个IP查询域名我们可以使用你之前列出的14个纯文本IP服务域名它们都是可靠的。例如线路编号域名线路1ifconfig.me线路2icanhazip.com线路3api.ipify.org线路4checkip.amazonaws.com线路5ipecho.net/plain线路6whatismyip.akamai.com线路7ip.seeip.org线路8ident.me线路9tnx.nl/ip线路10wgetip.com线路11ip.anysrc.net线路12curlmyip.com线路13ip.sb线路14ip.eth0.me确保你的防火墙策略将上述域名分别绑定到对应的出口线路。例如访问ifconfig.me→ 走线路1访问icanhazip.com→ 走线路2……这需要在你防火墙上配置基于域名的策略路由或DNS策略。如果防火墙不支持域名策略你可以为每个线路分配一个独立的IP查询服务IP然后基于目标IP做策略但域名方式更直观。第二步编写Zabbix外部检查脚本创建一个脚本接收一个域名作为参数返回通过该域名获取的出口IP。脚本需要具备超时控制和错误处理。将以下脚本保存为/usr/lib/zabbix/externalscripts/get_ip_by_domain.sh并赋予执行权限#!/bin/bash# 通过指定的域名获取公网出口IP# 用法get_ip_by_domain.sh 域名DOMAIN$1TIMEOUT5# 超时时间秒if[-z$DOMAIN];thenechoERROR: No domain providedexit1fi# 使用curl访问域名提取IPv4地址IP$(curl-s-m$TIMEOUThttp://$DOMAIN2/dev/null|grep-Eo([0-9]{1,3}\.){3}[0-9]{1,3}|head-1)if[-n$IP];thenecho$IPexit0elseechoERROR: Failed to get IP from$DOMAINexit1fi注意这里使用HTTP而非HTTPS是为了避免证书验证问题且IP查询服务通常支持HTTP。如果你更倾向HTTPS可以在脚本中添加-k忽略证书或者使用HTTPS URL。第三步在Zabbix前端创建监控项为每一条线路创建一个监控项使用上述外部检查脚本。登录Zabbix Web界面进入配置 → 主机选择你的Zabbix服务器主机或专门用于监控的代理主机。点击监控项→创建监控项。填写以下内容以线路1为例名称线路1 出口IP类型外部检查键值get_ip_by_domain.sh[ifconfig.me]注意参数用双引号因为域名可能有点号信息类型文本更新间隔根据需求设置例如30m30分钟历史数据保留期90d趋势数据保留期365d应用可新建应用“出口IP监控”点击添加。重复上述步骤14次分别使用对应的域名作为参数。第四步创建触发器与预设IP比较假设你为每条线路预设的出口IP如下请替换为实际IP线路预设IP1203.0.113.102203.0.113.203203.0.113.30…………创建触发器当监控项的值不等于预设IP时触发告警。进入配置 → 主机→ 选择主机 →触发器→创建触发器。填写以线路1为例名称线路1 出口IP异常严重性警告或其他表达式{主机名:get_ip_by_domain.sh[ifconfig.me].last()}203.0.113.10注意将主机名替换为实际主机名称IP用双引号包围。点击添加。为每条线路创建对应的触发器。进阶如果你希望排除因脚本错误返回ERROR导致的误报可以修改表达式为{主机名:get_ip_by_domain.sh[ifconfig.me].last()}203.0.113.10 and {主机名:get_ip_by_domain.sh[ifconfig.me].str(ERROR)}0第五步配置飞书告警5.1 创建飞书群机器人在飞书群中点击设置 → 群机器人 → 添加机器人 → 自定义机器人。填写机器人名称获取 Webhook 地址例如https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx5.2 在Zabbix中配置媒介类型进入管理 → 媒介类型 → 创建媒介类型。名称飞书机器人类型Webhook参数可留空直接在脚本中构造或使用如下添加参数{ALERT.SUBJECT}和{ALERT.MESSAGE}脚本JavaScript用于构造飞书消息格式。varwebhook_urlhttps://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;varmessage{msg_type:text,content:{text:value.params.subject\nvalue.params.message}};return{URL:webhook_url,METHOD:POST,HEADERS:{Content-Type:application/json},BODY:JSON.stringify(message)};点击更新。5.3 创建用户与媒介进入管理 → 用户选择一个已有用户如 Admin或创建新用户。在媒介标签页点击添加类型飞书机器人收件人任意字符串这里填写群名称或标识不直接影响发送但必须填写其他选项默认。点击更新。5.4 创建动作进入配置 → 动作选择触发器动作点击创建动作。名称出口IP异常告警条件标签页添加条件使该动作仅针对我们创建的触发器。例如触发器名称 包含 “出口IP异常”操作标签页默认接收人选择刚才配置了飞书媒介的用户。仅送到选择 “飞书机器人”。操作细节中可以自定义消息主题和内容例如主题出口IP异常告警消息告警主机{HOST.NAME} 线路{TRIGGER.NAME} 当前IP{ITEM.LASTVALUE} 期望IP{ITEM.LASTVALUE} 期望值未直接提供可在触发器描述中写明。由于触发器条件直接包含了期望IP你可以将期望IP写在触发器描述中然后在消息中引用{TRIGGER.DESCRIPTION}。点击添加。第六步测试与验证手动执行脚本测试/usr/lib/zabbix/externalscripts/get_ip_by_domain.sh ifconfig.me应返回一个IP地址。在Zabbix前端查看监控项最新数据确认是否正常采集。临时修改防火墙策略使某个域名走不同线路观察触发器是否变为“问题”状态并检查飞书是否收到告警。注意事项防火墙策略确保Zabbix服务器或Proxy访问不同域名时确实经由你配置的对应线路出去。可以在Zabbix服务器上使用curl --interface或traceroute等方式验证。域名解析Zabbix服务器必须能正常解析这些域名且DNS解析不受防火墙策略干扰。如果DNS流量也受策略影响请确保DNS请求走默认路由或使用公共DNS如8.8.8.8。HTTPS vs HTTP脚本中使用HTTP可能更简单但有些服务可能强制HTTPS。如果服务返回重定向可添加-L参数让curl跟随重定向或直接使用HTTPS URL。超时与重试脚本中已设置5秒超时如果网络抖动偶尔失败可能导致告警。可以考虑在Zabbix监控项设置“重试次数”或“允许的失败次数”来减少误报。飞书消息格式飞书Webhook支持更多格式如富文本、卡片可以根据需要修改媒介脚本。通过以上配置Zabbix将定时检查14条线路的出口IP一旦与预设值不符立即通过飞书向你告警。这种方案利用了现有的IP查询服务和防火墙策略无需额外硬件简单高效。
返回列表