Zabbix 監(jiān)控多線路出口IP并通過飛書告警完整教程
一、方案概述
1.1 監(jiān)控原理
- 通過防火墻策略,讓不同域名走不同的出口線路
- Zabbix 定期訪問這些域名,獲取訪問時的出口IP
- 將獲取的IP與預設值比較,不一致時通過飛書發(fā)送告警
1.2 線路與域名對應關系示例
| 線路編號 | 域名 | 預設IP | 出口接口 |
|---|---|---|---|
| 線路1 | ifconfig.me | 203.0.113.10 | port2 |
| 線路2 | api.ipify.org | 203.0.113.20 | port3 |
| 線路3 | icanhazip.com | 203.0.113.30 | port4 |
| … | … | … | … |
二、環(huán)境準備
2.1 前提條件
- Zabbix Server 7.4 已部署(Docker或物理機)
- 已獲取飛書機器人 Webhook 地址
- Zabbix Server 能訪問外網(wǎng)(IP查詢服務)
2.2 確認Zabbix容器名稱
docker ps | grep zabbix
記錄Zabbix Server容器名稱(如 zabbix-server)
三、部署外部檢查腳本
3.1 進入Zabbix Server容器
docker exec -it zabbix-server sh
3.2 創(chuàng)建腳本目錄并編寫腳本
# 創(chuàng)建目錄
mkdir -p /usr/lib/zabbix/externalscripts
# 創(chuàng)建腳本文件
cat > /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh << 'EOF'
#!/bin/bash
# 通過指定的域名獲取公網(wǎng)出口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 -L -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
EOF
# 賦予執(zhí)行權限
chmod +x /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh
# 修改屬主
chown zabbix:zabbix /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh
# 安裝curl(Alpine系統(tǒng))
apk add curl3.3 測試腳本
su -s /bin/sh -c "/usr/lib/zabbix/externalscripts/get_ip_by_domain.sh api.ipify.org" zabbix
應返回一個公網(wǎng)IP地址。
3.4 退出容器
exit
四、創(chuàng)建監(jiān)控項
4.1 登錄Zabbix Web
訪問 http://你的Zabbix服務器IP:8080,使用 Admin/zabbix 登錄。
4.2 創(chuàng)建監(jiān)控項
- 進入 配置 → 主機,選擇目標主機(如
hwipmonitor) - 點擊 監(jiān)控項 → 創(chuàng)建監(jiān)控項
4.3 填寫監(jiān)控項信息
| 字段 | 填寫內容 |
|---|---|
| 名稱 | WAN01 Exit IP (via api.ipify.org) |
| 類型 | 外部檢查 |
| 鍵值 | get_ip_by_domain.sh["api.ipify.org"] |
| 信息類型 | 文本 |
| 更新間隔 | 60m |
| 歷史記錄保留期 | 3d |
4.4 保存
點擊 添加 完成創(chuàng)建。
4.5 驗證監(jiān)控項
- 進入 監(jiān)控 → 最新數(shù)據(jù)
- 篩選主機,查看監(jiān)控項是否有數(shù)據(jù)
- 狀態(tài)應為 已啟用,且有IP值
五、創(chuàng)建觸發(fā)器
5.1 進入觸發(fā)器創(chuàng)建
- 配置 → 主機 → 選擇主機 → 觸發(fā)器 → 創(chuàng)建觸發(fā)器
5.2 填寫觸發(fā)器信息
| 字段 | 填寫內容 |
|---|---|
| 名稱 | WAN01 出口IP異常 (api.ipify.org) |
| 嚴重性 | 警告 |
| 描述 | 期望IP:103.248.229.101(填寫實際預設IP) |
| 表達式 | {hwipmonitor:get_ip_by_domain.sh["api.ipify.org"].last()}<>"103.248.229.101" |
5.3 表達式說明
{主機名:監(jiān)控項鍵值.last()}:獲取監(jiān)控項最新值<>"預設IP":不等于預設IP- 如需排除腳本錯誤,可添加
and {監(jiān)控項.str(ERROR)}=0
5.4 保存
點擊 添加 完成創(chuàng)建。
六、配置飛書媒介
6.1 進入媒介類型配置
管理 → 報警媒介類型 → 創(chuàng)建媒介類型
6.2 填寫基本信息
| 字段 | 填寫內容 |
|---|---|
| 名稱 | feishu |
| 類型 | Webhook |
6.3 添加參數(shù)
點擊 參數(shù) 標簽頁,添加以下參數(shù):
| 名稱 | 值 |
|---|---|
Subject | {ALERT.SUBJECT} |
Message | {ALERT.MESSAGE} |
6.4 編寫腳本
在 腳本 框中輸入以下內容(將Webhook地址替換為實際地址):
try {
var params = JSON.parse(value),
req = new HttpRequest(),
webhook_url = 'https://open.feishu.cn/open-apis/bot/v2/hook/你的完整Webhook地址',
msg = {
msg_type: "text",
content: {
text: params.Subject + "\n" + params.Message
}
},
resp;
req.addHeader("Content-Type: application/json");
resp = req.post(webhook_url, JSON.stringify(msg));
if (req.getStatus() != 200) {
throw "Response code: " + req.getStatus();
}
resp = JSON.parse(resp);
return JSON.stringify(resp);
} catch (error) {
throw "Failed with error: " + error;
}6.5 測試媒介
- 點擊 測試 按鈕
- 填寫測試內容:
- Subject:
測試告警 - Message:
這是一條測試消息
- Subject:
- 點擊 測試
- 確認飛書群收到測試消息
6.6 保存
點擊 添加 完成創(chuàng)建。
七、配置用戶媒介
7.1 進入用戶配置
管理 → 用戶 → 點擊 Admin (Zabbix Administrator)
7.2 添加報警媒介
- 點擊 報警媒介 標簽頁
- 點擊 添加
- 填寫:
- 類型:選擇
feishu - 收件人:填寫
飛書群(任意標識) - 當活動時:默認
- 嚴重性:全選
- 啟用:勾選
- 類型:選擇
- 點擊 添加
7.3 保存
點擊 更新 保存用戶配置。
八、創(chuàng)建動作
8.1 進入動作配置
配置 → 動作 → 觸發(fā)器動作 → 創(chuàng)建動作
8.2 填寫基本信息
| 字段 | 填寫內容 |
|---|---|
| 名稱 | 出口IP異常飛書告警 |
8.3 配置條件
點擊 條件 標簽頁,添加:
- 類型:觸發(fā)器名稱
- 運算符:包含
- 值:
出口IP異常
這樣所有名稱包含“出口IP異常”的觸發(fā)器都會觸發(fā)此動作。
8.4 配置操作
點擊 操作 標簽頁 → 新增:
| 字段 | 填寫內容 |
|---|---|
| 操作類型 | 發(fā)送消息 |
| 默認接收人 | 選擇 Admin (Zabbix Administrator) |
| 僅送到 | 選擇 feishu |
| 主題 | 告警:{TRIGGER.NAME} |
| 消息 | 主機:{HOST.NAME}\n當前IP:{ITEM.LASTVALUE}\n期望IP:{TRIGGER.DESCRIPTION}\n時間:{EVENT.DATE} {EVENT.TIME} |
| 自定義持續(xù)時間 | 0 |
| 僅當問題出現(xiàn)時發(fā)送 | ? 勾選 |
8.5 配置恢復操作(可選)
點擊 新增 添加恢復操作:
| 字段 | 填寫內容 |
|---|---|
| 操作類型 | 發(fā)送消息 |
| 默認接收人 | 選擇 Admin |
| 僅送到 | feishu |
| 主題 | 恢復:{TRIGGER.NAME} |
| 消息 | 主機:{HOST.NAME}\n當前IP:{ITEM.LASTVALUE}\n時間:{EVENT.DATE} {EVENT.TIME} |
| 自定義持續(xù)時間 | 0 |
| 僅當問題恢復時發(fā)送 | ? 勾選 |
8.6 保存
點擊 添加 完成動作創(chuàng)建。
九、測試驗證
9.1 強制觸發(fā)測試
臨時修改觸發(fā)器表達式,強制觸發(fā)告警:
- 配置 → 主機 → 選擇主機 → 觸發(fā)器
- 找到目標觸發(fā)器,點擊編輯
- 將表達式改為:
{hwipmonitor:get_ip_by_domain.sh["api.ipify.org"].last()}<>"1.2.3.4" - 保存
- 等待幾秒,進入 監(jiān)控 → 問題,應看到觸發(fā)器變?yōu)閱栴}狀態(tài)
- 進入 報表 → 動作日志,查看發(fā)送記錄
- 檢查飛書是否收到告警
9.2 恢復表達式
測試完成后,將表達式改回正確的預設IP。
9.3 驗證飛書消息
飛書應收到類似以下內容的消息:
告警:WAN01 出口IP異常 (api.ipify.org) 主機:hwipmonitor 當前IP:103.248.229.101 期望IP:期望IP:103.248.229.101 時間:2026.03.30 17:04:23
十、批量配置其他線路
10.1 方法一:手動創(chuàng)建
為每個域名重復以下操作:
- 創(chuàng)建監(jiān)控項(修改鍵值中的域名)
- 創(chuàng)建觸發(fā)器(修改預設IP和域名)
- 觸發(fā)器名稱格式:
WAN01 出口IP異常 (域名)
10.2 方法二:使用模板
- 創(chuàng)建一個模板,添加所有監(jiān)控項和觸發(fā)器
- 將模板鏈接到主機
10.3 方法三:使用Zabbix API(Python腳本)
#!/usr/bin/env python3
import csv
from zabbix_api import ZabbixAPI
# 配置
ZABBIX_URL = "http://localhost/zabbix"
USER = "Admin"
PASSWORD = "zabbix"
HOST_NAME = "hwipmonitor"
# 線路配置列表
configs = [
{"domain": "ifconfig.me", "ip": "203.0.113.10"},
{"domain": "api.ipify.org", "ip": "103.248.229.101"},
{"domain": "icanhazip.com", "ip": "203.0.113.30"},
# ... 添加更多
]
zapi = ZabbixAPI(ZABBIX_URL)
zapi.login(USER, PASSWORD)
# 獲取主機ID
hosts = zapi.host.get({"filter": {"host": HOST_NAME}})
host_id = hosts[0]["hostid"]
for config in configs:
domain = config["domain"]
preset_ip = config["ip"]
# 創(chuàng)建監(jiān)控項
item = zapi.item.create({
"name": f"WAN01 Exit IP (via {domain})",
"key_": f'get_ip_by_domain.sh["{domain}"]',
"hostid": host_id,
"type": 0, # 外部檢查
"value_type": 1, # 文本
"delay": "60m",
"history": "3d"
})
# 創(chuàng)建觸發(fā)器
trigger = zapi.trigger.create({
"description": f"WAN01 出口IP異常 ({domain})",
"expression": f'{{{HOST_NAME}:get_ip_by_domain.sh["{domain}"].last()}}<>"{preset_ip}"',
"priority": 2, # 警告
"comments": f"期望IP:{preset_ip}",
"status": 0
})
print(f"已創(chuàng)建: {domain} -> {preset_ip}")十一、常見問題排查
11.1 監(jiān)控項顯示“不支持”
可能原因:
- 腳本不存在或路徑錯誤
- 腳本沒有執(zhí)行權限
- 缺少curl命令
解決方法:
# 檢查腳本是否存在 ls -l /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh # 檢查curl是否安裝 which curl # 測試腳本 su -s /bin/sh -c "/usr/lib/zabbix/externalscripts/get_ip_by_domain.sh api.ipify.org" zabbix
11.2 飛書收不到消息
可能原因:
- Webhook地址錯誤
- 飛書機器人安全設置(關鍵詞/IP白名單)
- 腳本中URL為空
解決方法:
- 在媒介類型中點擊測試,確認能收到
- 檢查飛書機器人安全設置,添加關鍵詞“告警”
- 確認腳本中Webhook地址正確
11.3 動作日志顯示“No media defined for user”
解決方法:
- 進入 管理 → 用戶,為Admin用戶添加feishu媒介
- 確認媒介類型已啟用
11.4 觸發(fā)器表達式語法錯誤
正確格式:
{主機名:監(jiān)控項鍵值.last()}<>"預設IP"
常見錯誤:
- 缺少花括號
{} - IP未加雙引號
- 使用中文括號
11.5 查看Zabbix Server日志
# Docker環(huán)境 docker logs zabbix-server --tail 100 | grep -i error # 物理機 tail -f /var/log/zabbix/zabbix_server.log
十二、總結
12.1 配置文件清單
| 文件/配置 | 位置 |
|---|---|
| 外部腳本 | /usr/lib/zabbix/externalscripts/get_ip_by_domain.sh |
| 監(jiān)控項 | Zabbix Web → 配置 → 主機 → 監(jiān)控項 |
| 觸發(fā)器 | Zabbix Web → 配置 → 主機 → 觸發(fā)器 |
| 媒介類型 | Zabbix Web → 管理 → 報警媒介類型 |
| 用戶媒介 | Zabbix Web → 管理 → 用戶 |
| 動作 | Zabbix Web → 配置 → 動作 |
12.2 關鍵宏說明
| 宏 | 說明 |
|---|---|
{HOST.NAME} | 主機名 |
{TRIGGER.NAME} | 觸發(fā)器名稱 |
{ITEM.LASTVALUE} | 監(jiān)控項最新值 |
{TRIGGER.DESCRIPTION} | 觸發(fā)器描述 |
{EVENT.DATE} | 事件日期 |
{EVENT.TIME} | 事件時間 |
{ALERT.SUBJECT} | 告警主題 |
{ALERT.MESSAGE} | 告警內容 |
12.3 后續(xù)優(yōu)化建議
- 調整檢查頻率:根據(jù)線路重要性,可設置為15-30分鐘
- 添加期望IP顯示:在觸發(fā)器描述中填寫期望IP
- 配置告警重復間隔:如需重復告警,修改自定義持續(xù)時間
- 使用模板:將監(jiān)控項和觸發(fā)器放入模板,方便批量管理
- 監(jiān)控腳本健康:添加監(jiān)控項監(jiān)控腳本執(zhí)行狀態(tài)
至此,您已完成 Zabbix 多線路出口IP監(jiān)控與飛書告警的全部配置。如有任何問題,歡迎隨時交流!
到此這篇關于Zabbix 監(jiān)控多線路出口IP并通過飛書告警完整教程的文章就介紹到這了,更多相關Zabbix 監(jiān)控多線路出口IP內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Zabbix如何通過ssh監(jiān)控獲取網(wǎng)絡設備數(shù)據(jù)
這篇文章主要介紹了Zabbix如何通過ssh監(jiān)控獲取網(wǎng)絡設備數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08
通過Zabbix監(jiān)控Oracle 19c數(shù)據(jù)庫的完整配置指南
本文將詳細介紹如何使用Zabbix配置Oracle 19c數(shù)據(jù)庫監(jiān)控,包括安裝、配置、問題排查等全過程,本指南適合新手獨立完成配置,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下2024-12-12
CentOS 6.9 安裝 Zabbix 3.0 的詳細步驟
Zabbix 是一個基于 WEB 界面的,提供分布式系統(tǒng)監(jiān)視以及網(wǎng)絡監(jiān)視功能的企業(yè)級開源解決方案,本文重點研究 Zabbix,使用它的目的是為了更好地監(jiān)控MySQL 數(shù)據(jù)庫服務器,并生成圖形報表,相較于 Nagios,Zabbix 在這方面功能更為強大,感興趣的朋友一起看看吧2025-04-04
Zabbix通過PSK共享密鑰實現(xiàn)Server和Agent的通信加密
這篇文章主要介紹了Zabbix通過PSK共享密鑰實現(xiàn)Server和Agent的通信加密,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06
zabbix監(jiān)控Linux系統(tǒng)服務的流程
這篇文章主要介紹了zabbix監(jiān)控Linux系統(tǒng)服務的流程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-10-10
基于zabbix實現(xiàn)監(jiān)控Jenkins過程詳解
這篇文章主要介紹了基于zabbix實現(xiàn)監(jiān)控Jenkins過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11

