在 RouterOS(ROS)中,VRRP 主要用于高可用性,但 ROS 本身不直接支持 VRRP 状态变化时自动更新 DNS,你需要通过脚本手动实现或结合其他服务,以下是几种方法:
方法1:使用 ROS 脚本监控 VRRP 状态
创建 VRRP 状态变为 master 时的脚本
/system script add name=vrrp-master source={
# 更新 DNS 记录(假设使用 ROS 的 DNS 服务器)
/ip dns static set [find name="yourdomain.com"] address=你的VRRP虚拟IP
# 或者使用外部 DNS API
/tool fetch url="http://your-dns-api/update?domain=yourdomain.com&ip=你的VRRP虚拟IP"
}
创建 VRRP 状态变为 backup 时的脚本(可选)
/system script add name=vrrp-backup source={
# 可以更新到另一个IP或什么都不做
}
在 VRRP 接口配置中设置触发
/interface vrrp add name=vrrp1 interface=ether1 vrid=50 \
priority=150 authentication=ah \
on-backup="vrrp-backup" \
on-master="vrrp-master" \
password="yourpassword"方法2:使用 Netwatch 监控 VRRP IP
监控 VRRP 虚拟IP是否出现在接口上
/tool netwatch add host=你的VRRP虚拟IP timeout=3s interval=10s \
up-script="/ip dns static set [find name=\"yourdomain.com\"] address=你的VRRP虚拟IP" \
down-script="# 可以处理故障转移"方法3:结合外部 DNS 服务商 API
/system script add name=update-cloudflare source={
:local cfApiToken "your-cloudflare-api-token"
:local cfZoneId "your-zone-id"
:local cfDnsRecordId "your-dns-record-id"
:local domain "yourdomain.com"
:local vrrpIp "你的VRRP虚拟IP"
/tool fetch url="https://api.cloudflare.com/client/v4/zones/$cfZoneId/dns_records/$cfDnsRecordId" \
http-method=put \
http-data="{\"type\":\"A\",\"name\":\"$domain\",\"content\":\"$vrrpIp\",\"ttl\":120,\"proxied\":false}" \
http-header="Content-Type:application/json" \
http-header="Authorization:Bearer $cfApiToken"
}方法4:使用 DDNS 客户端
配置 DDNS 客户端 /ip cloud set ddns-enabled=yes /ip cloud set ddns-update-interval=5m 或者在 /ip cloud 中配置自定义 DDNS
/system script add name=update-dyndns source={
/tool fetch url="http://username:password@dyndns.example.com/nic/update?hostname=yourdomain.com&myip=你的VRRP虚拟IP"
}
添加到定时器
/system scheduler add name=ddns-update interval=5m on-event=update-dyndns方法5:结合外部监控脚本
创建外部脚本(Python/Bash),通过 API 监控 ROS 状态:
#!/usr/bin/env python3
import requests
from routeros_api import RouterOsApi
连接到主备 ROS
primary = RouterOsApi('192.168.1.1', user='admin', password='')
backup = RouterOsApi('192.168.1.2', user='admin', password='')
检查 VRRP 状态
def check_vrrp_status():
# 实现状态检查逻辑
pass
更新 DNS(通过 API 调用 Cloudflare/DNS 服务商)
def update_dns(new_ip):
pass推荐的最佳实践:
1、对于小型网络:使用方法1(ROS脚本)+ 方法4(DDNS)
2、对于生产环境:使用方法3(外部DNS API)+ 方法5(外部监控)
3、确保脚本容错:添加日志和错误处理
增强版 VRRP Master 脚本
/system script add name=vrrp-master-enhanced source={
:log info "VRRP: Switching to MASTER state"
# 更新内部 DNS
/ip dns static set [find name="router.yourdomain.com"] address=192.168.100.1
# 调用外部 API
/tool fetch url="http://dns-api.yourdomain.com/update" \
http-method=post \
http-data="{\"domain\":\"yourdomain.com\",\"ip\":\"192.168.100.1\"}" \
http-header="Content-Type:application/json" \
dst-path=update-result.txt
:log info "VRRP: DNS update completed"
}注意事项:
1、DNS TTL:设置较低的 TTL(如 60秒)以便快速切换
2、脚本安全:不要在脚本中硬编码密码,使用密钥或证书
3、故障回退:确保备份状态时也能正确处理
4、日志记录:记录所有状态变化和更新操作
5、测试:在非生产环境充分测试脚本
选择哪种方法取决于你的网络规模、DNS 服务商和技术栈,对于大多数场景,方法1+方法3的组合比较实用。
文章摘自:https://idc.huochengrm.cn/dns/22833.html
评论
双冷萱
回复ROS VRRP更新DNS的步骤包括:配置VRRP组,设置优先级和IP地址;在路由器上启用虚拟MAC并绑定接口与VIP,完成这些后重启服务生效即可自动同步到本地域名服务器中修改后的记录信息了(如通过命令行操作)。