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

通过Zabbix监控14条不同线路的出口IP,并与预设值对比,不一致时通过飞书告警------我们可以设计一个清晰、自动化的方案。


核心思路

在边界防火墙上已经配置了策略:不同的域名走不同的外网线路 。因此,我们只需要让Zabbix定期访问这些域名,并获取返回的出口IP(即访问这些域名时,从哪条线路出去),然后将该IP与预先设定的标准IP进行比较。

注意 :这里"获取IP"不是获取域名解析的目标IP,而是通过访问一个"IP查询服务"(如 ifconfig.me),该服务会返回请求者的源IP,也就是你那条线路的公网出口IP。


方案组件

  1. 14个IP查询服务域名:用于触发不同的出口线路。
  2. Zabbix监控项:每个域名对应一个监控项,定期获取出口IP。
  3. Zabbix触发器:将获取到的IP与预设值比较,不匹配则触发告警。
  4. 飞书告警:通过Zabbix的媒介(Media)和动作(Action)发送消息到飞书群机器人。

第一步:准备14个IP查询域名

我们可以使用你之前列出的14个纯文本IP服务域名(它们都是可靠的)。例如:

线路编号 域名
线路1 ifconfig.me
线路2 icanhazip.com
线路3 api.ipify.org
线路4 checkip.amazonaws.com
线路5 ipecho.net/plain
线路6 whatismyip.akamai.com
线路7 ip.seeip.org
线路8 ident.me
线路9 tnx.nl/ip
线路10 wgetip.com
线路11 ip.anysrc.net
线路12 curlmyip.com
线路13 ip.sb
线路14 ip.eth0.me

确保你的防火墙策略:将上述域名分别绑定到对应的出口线路。例如:

  • 访问 ifconfig.me → 走线路1
  • 访问 icanhazip.com → 走线路2
  • ......

这需要在你防火墙上配置基于域名的策略路由(或DNS策略)。如果防火墙不支持域名策略,你可以为每个线路分配一个独立的IP查询服务IP,然后基于目标IP做策略,但域名方式更直观。


第二步:编写Zabbix外部检查脚本

创建一个脚本,接收一个域名作为参数,返回通过该域名获取的出口IP。脚本需要具备超时控制和错误处理。

将以下脚本保存为 /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh,并赋予执行权限:

bash 复制代码
#!/bin/bash
# 通过指定的域名获取公网出口IP
# 用法:get_ip_by_domain.sh <域名>

DOMAIN="$1"
TIMEOUT=5   # 超时时间(秒)

if [ -z "$DOMAIN" ]; then
    echo "ERROR: No domain provided"
    exit 1
fi

# 使用curl访问域名,提取IPv4地址
IP=$(curl -s -m $TIMEOUT "http://$DOMAIN" 2>/dev/null | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -1)

if [ -n "$IP" ]; then
    echo "$IP"
    exit 0
else
    echo "ERROR: Failed to get IP from $DOMAIN"
    exit 1
fi

注意 :这里使用HTTP(而非HTTPS)是为了避免证书验证问题,且IP查询服务通常支持HTTP。如果你更倾向HTTPS,可以在脚本中添加 -k 忽略证书,或者使用HTTPS URL。


第三步:在Zabbix前端创建监控项

为每一条线路创建一个监控项,使用上述外部检查脚本。

  1. 登录Zabbix Web界面,进入 配置 → 主机,选择你的Zabbix服务器主机(或专门用于监控的代理主机)。
  2. 点击 监控项创建监控项
  3. 填写以下内容(以线路1为例):
    • 名称:线路1 出口IP
    • 类型:外部检查
    • 键值get_ip_by_domain.sh["ifconfig.me"]
      (注意参数用双引号,因为域名可能有点号)
    • 信息类型:文本
    • 更新间隔 :根据需求设置,例如 30m(30分钟)
    • 历史数据保留期:90d
    • 趋势数据保留期:365d
    • 应用:可新建应用"出口IP监控"
  4. 点击 添加

重复上述步骤14次,分别使用对应的域名作为参数。


第四步:创建触发器,与预设IP比较

假设你为每条线路预设的出口IP如下(请替换为实际IP):

线路 预设IP
1 203.0.113.10
2 203.0.113.20
3 203.0.113.30
...... ......

创建触发器,当监控项的值不等于预设IP时触发告警。

  1. 进入 配置 → 主机 → 选择主机 → 触发器创建触发器
  2. 填写(以线路1为例):
    • 名称:线路1 出口IP异常

    • 严重性:警告(或其他)

    • 表达式

      复制代码
      {主机名:get_ip_by_domain.sh["ifconfig.me"].last()}<>"203.0.113.10"

      注意:将 主机名 替换为实际主机名称,IP用双引号包围。

  3. 点击 添加

为每条线路创建对应的触发器。

进阶:如果你希望排除因脚本错误(返回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 创建飞书群机器人

  1. 在飞书群中,点击 设置 → 群机器人 → 添加机器人 → 自定义机器人

  2. 填写机器人名称,获取 Webhook 地址,例如:

    复制代码
    https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

5.2 在Zabbix中配置媒介类型

  1. 进入 管理 → 媒介类型 → 创建媒介类型

  2. 名称:飞书机器人

  3. 类型:Webhook

  4. 参数 (可留空,直接在脚本中构造)或使用如下:

    • 添加参数 {ALERT.SUBJECT}{ALERT.MESSAGE}
  5. 脚本 (JavaScript):用于构造飞书消息格式。

    javascript 复制代码
    var webhook_url = 'https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
    var message = {
        "msg_type": "text",
        "content": {
            "text": value.params.subject + "\n" + value.params.message
        }
    };
    return {
        'URL': webhook_url,
        'METHOD': 'POST',
        'HEADERS': {'Content-Type': 'application/json'},
        'BODY': JSON.stringify(message)
    };
  6. 点击 更新

5.3 创建用户与媒介

  1. 进入 管理 → 用户,选择一个已有用户(如 Admin)或创建新用户。
  2. 媒介 标签页,点击 添加
    • 类型:飞书机器人
    • 收件人:任意字符串,这里填写群名称或标识(不直接影响发送,但必须填写)
    • 其他选项默认
  3. 点击 更新

5.4 创建动作

  1. 进入 配置 → 动作 ,选择 触发器动作 ,点击 创建动作
  2. 名称:出口IP异常告警
  3. 条件 标签页:添加条件,使该动作仅针对我们创建的触发器。例如:
    • 触发器名称 包含 "出口IP异常"
  4. 操作 标签页:
    • 默认接收人:选择刚才配置了飞书媒介的用户。
    • 仅送到:选择 "飞书机器人"。
    • 操作细节中,可以自定义消息主题和内容,例如:
      • 主题:出口IP异常告警

      • 消息

        复制代码
        告警主机:{HOST.NAME}
        线路:{TRIGGER.NAME}
        当前IP:{ITEM.LASTVALUE}
        期望IP:{ITEM.LASTVALUE} ?期望值未直接提供,可在触发器描述中写明。

        由于触发器条件直接包含了期望IP,你可以将期望IP写在触发器描述中,然后在消息中引用 {TRIGGER.DESCRIPTION}

  5. 点击 添加

第六步:测试与验证

  1. 手动执行脚本测试:

    bash 复制代码
    /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh ifconfig.me

    应返回一个IP地址。

  2. 在Zabbix前端查看监控项最新数据,确认是否正常采集。

  3. 临时修改防火墙策略,使某个域名走不同线路,观察触发器是否变为"问题"状态,并检查飞书是否收到告警。


注意事项

  • 防火墙策略确保 :Zabbix服务器(或Proxy)访问不同域名时,确实经由你配置的对应线路出去。可以在Zabbix服务器上使用 curl --interfacetraceroute 等方式验证。
  • 域名解析: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查询服务和防火墙策略,无需额外硬件,简单高效。

相关推荐
跨境海王哥2 小时前
怎么检查一个IP是否干净?IP质量分数检测及如何判断风险?
网络·网络协议·tcp/ip
nainaire2 小时前
仿muduo库的Tcp服务器以及其应用层Http协议支持
服务器·网络·c++·tcp/ip·http
m0_555762902 小时前
STM32H743 USB FS 内部 IP DMA 问题分析
stm32·嵌入式硬件·tcp/ip
老兵发新帖2 小时前
查看fail2ban停止的IP和历史记录
chrome·网络协议·tcp/ip
慵懒的猫mi3 小时前
deepin UOS AI 助手接入飞书(Feishu)配置指南
linux·人工智能·ai·gpt-3·飞书·文心一言·deepin
White-Legend3 小时前
我用GTP5.4写了一个飞书编辑器
人工智能·gpt·编辑器·飞书·ai编程
jaysee-sjc3 小时前
十六、Java 网络编程全解析:UDP/TCP 通信 + BS/CS 架构
java·开发语言·网络·tcp/ip·算法·架构·udp
supersolon4 小时前
OpenClaw接入飞书(channel)
ai·llm·飞书·openclaw·龙虾
KindSuper_liu4 小时前
OpenClaw接入飞书配置问题
人工智能·飞书