通过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服务域名(它们都是可靠的)。例如:
| 线路编号 | 域名 |
|---|---|
| 线路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前端创建监控项
为每一条线路创建一个监控项,使用上述外部检查脚本。
- 登录Zabbix Web界面,进入 配置 → 主机,选择你的Zabbix服务器主机(或专门用于监控的代理主机)。
- 点击 监控项 → 创建监控项。
- 填写以下内容(以线路1为例):
- 名称:线路1 出口IP
- 类型:外部检查
- 键值 :
get_ip_by_domain.sh["ifconfig.me"]
(注意参数用双引号,因为域名可能有点号) - 信息类型:文本
- 更新间隔 :根据需求设置,例如
30m(30分钟) - 历史数据保留期:90d
- 趋势数据保留期:365d
- 应用:可新建应用"出口IP监控"
- 点击 添加。
重复上述步骤14次,分别使用对应的域名作为参数。
第四步:创建触发器,与预设IP比较
假设你为每条线路预设的出口IP如下(请替换为实际IP):
| 线路 | 预设IP |
|---|---|
| 1 | 203.0.113.10 |
| 2 | 203.0.113.20 |
| 3 | 203.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-xxxxxxxxxxxx
5.2 在Zabbix中配置媒介类型
-
进入 管理 → 媒介类型 → 创建媒介类型。
-
名称:飞书机器人
-
类型:Webhook
-
参数 (可留空,直接在脚本中构造)或使用如下:
- 添加参数
{ALERT.SUBJECT}和{ALERT.MESSAGE}
- 添加参数
-
脚本 (JavaScript):用于构造飞书消息格式。
javascriptvar 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) }; -
点击 更新。
5.3 创建用户与媒介
- 进入 管理 → 用户,选择一个已有用户(如 Admin)或创建新用户。
- 在 媒介 标签页,点击 添加 :
- 类型:飞书机器人
- 收件人:任意字符串,这里填写群名称或标识(不直接影响发送,但必须填写)
- 其他选项默认。
- 点击 更新。
5.4 创建动作
- 进入 配置 → 动作 ,选择 触发器动作 ,点击 创建动作。
- 名称:出口IP异常告警
- 条件 标签页:添加条件,使该动作仅针对我们创建的触发器。例如:
- 触发器名称 包含 "出口IP异常"
- 操作 标签页:
- 默认接收人:选择刚才配置了飞书媒介的用户。
- 仅送到:选择 "飞书机器人"。
- 操作细节中,可以自定义消息主题和内容,例如:
-
主题:出口IP异常告警
-
消息 :
告警主机:{HOST.NAME} 线路:{TRIGGER.NAME} 当前IP:{ITEM.LASTVALUE} 期望IP:{ITEM.LASTVALUE} ?期望值未直接提供,可在触发器描述中写明。由于触发器条件直接包含了期望IP,你可以将期望IP写在触发器描述中,然后在消息中引用
{TRIGGER.DESCRIPTION}。
-
- 点击 添加。
第六步:测试与验证
-
手动执行脚本测试:
bash/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查询服务和防火墙策略,无需额外硬件,简单高效。