域名解析异常往往会导致服务在用户端彻底不可见,很多站长发现问题时流量已经损失大半。在主机选的日常运维交流中,通过 AI Agent 实现自动化监控和即时告警,是解决这一被动局面的最佳方案。本文将教你如何在 VPS 上部署一个轻量级的 AI Agent,用于自动检测 DNS 解析结果及 IP 变化,甚至在检测到 IP 偏移时自动修正,确保服务高可用。

为什么需要 AI Agent 监控 DNS 解析?
手动使用 `nslookup` 或 `dig` 排查虽然直观,但无法做到 7×24 小时实时监控。DNS 劫持、解析记录被误删、或者家庭宽带动态 IP 变更导致的 DDNS 失效,都会让服务器“失联”。传统的监控脚本通常只能发邮件,而引入 AI Agent 概念的监控流程,则具备了“感知-决策-行动”的闭环能力:它不仅能发现问题,还能根据预设逻辑调用 API 自动修复,或者通过多渠道(如 Telegram、企业微信)发送结构化告警。
VPS 部署轻量级 DNS 监控 Agent
我们不需要昂贵的 GPU 服务器,普通的 1C1M VPS 即可运行这套基于 Python 的监控 Agent。为了方便管理和扩展,建议使用 Docker 进行容器化部署。
环境准备与依赖安装
首先准备一个干净的目录,创建 `requirements.txt`,列出必要的依赖库。这里我们使用 `dnspython` 进行专业的 DNS 查询,使用 `requests` 调用 Webhook 或 API。
text
dnspython==2.4.2
requests==2.31.0
python-dotenv==1.0.0
编写 `Dockerfile`,构建一个极简的运行环境:
dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
CMD ["python", "dns_agent.py"]
编写检测与告警逻辑
创建 `dns_agent.py`,这是 Agent 的核心大脑。它需要包含查询当前解析、对比目标 IP、触发告警三个功能模块。
python
import dns.resolver
import os
import requests
from dotenv import load_dotenv
load_dotenv()
DOMAIN = os.getenv("DOMAIN")
EXPECTED_IP = os.getenv("EXPECTED_IP") # 预期的正确 IP
WEBHOOK_URL = os.getenv("WEBHOOK_URL") # 告警接收地址
def check_dns(domain):
try:
answers = dns.resolver.resolve(domain, 'A')
return [rdata.address for rdata in answers]
except Exception as e:
print(f"DNS 查询出错: {e}")
return []
def send_alert(msg):
if WEBHOOK_URL:
requests.post(WEBHOOK_URL, json={"text": msg})
print("告警已发送")
def run_check():
current_ips = check_dns(DOMAIN)
print(f"当前解析 IP: {current_ips}")
if not current_ips:
send_alert(f"⚠️ 域名 {DOMAIN} 解析失败或不存在!")
return
if EXPECTED_IP not in current_ips:
alert_msg = f"🚨 域名 {DOMAIN} 解析异常!\n预期 IP: {EXPECTED_IP}\n当前 IP: {', '.join(current_ips)}"
send_alert(alert_msg)
else:
print("解析正常")
if __name__ == "__main__":
run_check()
创建 `.env` 文件填入敏感信息,不要把 Key 写死在代码里:
DOMAIN=zhujixuan.com
EXPECTED_IP=1.2.3.4
WEBHOOK_URL=https://your-webhook-url
使用 Docker Compose 启动,并设置定时任务:
yaml
version: '3'
services:
dns-agent:
build: .
env_file:
– .env
restart: always
为了实现周期性检测,不要在 Python 里写死 `while True` 循环,这会让容器难以管理。推荐在宿主机使用 Crontab 或者利用 Docker 的健康检查机制,更优雅的方式是配合宿主机的 Cron 定时执行一次性的 Docker 容器:
*/10 * * * * cd /root/dns-monitor && docker-compose run –rm dns-agent
实战:自动修正 IP 变化的闭环流程
对于使用家庭宽带或动态 IP VPS 的用户,仅仅发现问题是不够的,Agent 应该具备“自愈”能力。我们可以扩展上述脚本,使其在检测到 IP 变化时,自动调用 Cloudflare API 更新 DNS 记录。
对接 Cloudflare API 实现自动更新
在 `dns_agent.py` 中增加更新逻辑。你需要准备 Cloudflare 的 Zone ID 和 API Token。
python
CF_API_TOKEN = os.getenv("CF_API_TOKEN")
CF_ZONE_ID = os.getenv("CF_ZONE_ID")
CF_RECORD_ID = os.getenv("CF_RECORD_ID") # 需要先通过 API 获取
def update_cloudflare_dns(new_ip):
url = f"https://api.cloudflare.com/client/v4/zones/{CF_ZONE_ID}/dns_records/{CF_RECORD_ID}"
headers = {
"Authorization": f"Bearer {CF_API_TOKEN}",
"Content-Type": "application/json"
}
data = {
"type": "A",
"name": DOMAIN,
"content": new_ip,
"ttl": 120 # 低 TTL 以便快速生效
}
try:
response = requests.put(url, headers=headers, json=data)
if response.status_code == 200:
print(f"DNS 记录已更新为: {new_ip}")
send_alert(f"✅ 域名 {DOMAIN} 已自动修正 IP 为: {new_ip}")
else:
print(f"更新失败: {response.text}")
except Exception as e:
print(f"API 调用异常: {e}")
def run_check():
local_ip = requests.get('https://api.ipify.org').text
if EXPECTED_IP not in current_ips:
update_cloudflare_dns(local_ip)
这样,Agent 就从一个单纯的“报警器”进化为了“运维管家”,完全无需人工干预即可应对 IP 漂移。
老鸟叮嘱
1.频率控制:不要把检测频率设置得太高,比如每分钟一次,这可能会导致 DNS 提供商封禁你的 IP,或者触发 Cloudflare API 限流。5-10 分钟是一个合理的区间。
2.API 权限:在 Cloudflare 创建 Token 时,遵循最小权限原则,只赋予“编辑 DNS”的权限,不要给全权,以防 Token 泄漏造成灾难性后果。
3.多节点验证:单点 VPS 可能会因为自身网络问题误报。有条件的可以部署在两个不同地域的 VPS 上,只有当两者都判定异常时才发送告警,减少误报噪音。
4.日志留存:建议将 Agent 的标准输出重定向到文件,或者挂载 Volume,方便事后回溯是哪一刻发生了变更。
FAQ
1. 这种 Agent 能检测到 DNS 污染吗?
可以。如果 DNS 查询返回的 IP 是错误的(比如被劫持到了其他 IP),脚本中的 `EXPECTED_IP` 校验就会失败,从而触发告警。
2. 除了 Cloudflare,支持阿里云或腾讯云吗?
支持,原理完全一样。你需要查阅阿里云或腾讯云的 DNS API 文档,替换 `update_cloudflare_dns` 函数中的请求 URL 和参数格式即可。
3. 运行这个 Agent 需要什么配置的 VPS?
极低。1C1M、512M 内存的 VPS 跑 Docker 容器都绰绰有余,因为它只是发几个 HTTP 请求,不涉及高计算。
4. 如果域名使用了 CDN(如 Cloudflare 代理),IP 变化是正常的吗?
是的。如果开启了 CDN(橙色云朵),解析到的 IP 是 CDN 节点的 IP,会经常变化。在这种情况下,你应该检测的是“域名是否可解析”以及“HTTP 状态码是否 200”,而不是比对具体的 IP 地址。脚本逻辑需要调整为 `requests.head` 检查网页可用性。
5. 如何获取 Cloudflare 的 Record ID?
可以通过 `curl` 命令调用 List DNS Records 接口:`curl -X GET "https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records" -H "Authorization: Bearer {token}"`,返回的 JSON 里会包含每条记录的 `id`。
通过部署这套自动化的 DNS 监控 Agent,我们可以将繁琐的日常检查工作交给代码,让运维工作变得从容不迫。无论是应对黑客攻击导致的篡改,还是动态 IP 的自动适配,这套方案都能提供坚实的技术保障。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/10197.html 商家投稿邮箱:zhujixuanblog@qq.com
