如何在dnsmasq中实现自定义地址失效时自动回退到默认DNS解析?
如何在dnsmasq中实现自定义地址失效时自动回退到默认DNS解析?
刚好碰到过类似的需求,dnsmasq本身的静态address配置是固定死的,不会自动检测你的服务器是否在线,所以得靠一点小脚本配合动态配置来实现自动回退,给你两种实用的方案:
方案一:动态配置文件+定时健康检查脚本
这是最直接的方法,核心思路是用脚本定期检测服务器状态,动态生成dnsmasq的配置文件,再让dnsmasq重载配置。
准备动态配置目录
先创建一个专门放动态DNS配置的目录,比如/etc/dnsmasq.d/dynamic,然后打开你的dnsmasq主配置文件(一般是/etc/dnsmasq.conf),添加一行:conf-dir=/etc/dnsmasq.d/dynamic这样dnsmasq会自动加载这个目录下的所有
.conf文件。编写健康检查脚本
创建一个脚本文件,比如/usr/local/bin/check_steam_server.sh,内容如下:#!/bin/bash # 目标服务器IP和要重定向的域名 SERVER_IP="192.168.0.225" TARGET_DOMAIN="steamcontent.com" # 动态配置文件路径 DYNAMIC_CONF="/etc/dnsmasq.d/dynamic/steam_redirect.conf" # 检测服务器是否可用:这里用ping发送3个包,超时2秒,你也可以换成检测服务端口(比如nc -z $SERVER_IP 80) if ping -c 3 -W 2 $SERVER_IP > /dev/null 2>&1; then # 服务器正常,生成静态重定向配置 echo "address=/$TARGET_DOMAIN/$SERVER_IP" > $DYNAMIC_CONF else # 服务器离线,清空配置文件,让dnsmasq用默认DNS解析该域名 > $DYNAMIC_CONF fi # 给dnsmasq发HUP信号重载配置,不用重启服务 pkill -HUP dnsmasq设置脚本权限和定时任务
给脚本加上执行权限:chmod +x /usr/local/bin/check_steam_server.sh然后用crontab定时运行脚本,比如每分钟检测一次:
crontab -e在打开的编辑器里添加一行:
* * * * * /usr/local/bin/check_steam_server.sh保存退出即可。如果需要更频繁的检测(比如30秒一次),可以再加一行:
* * * * * sleep 30 && /usr/local/bin/check_steam_server.sh
方案二:结合本地递归DNS(进阶)
如果你希望服务器离线时的DNS解析更精准(比如避免dnsmasq缓存旧的失效IP),可以搭配一个本地递归DNS服务(比如unbound),然后在dnsmasq里做条件转发:
- 先安装并配置unbound作为本地递归DNS,监听
127.0.0.1#5300。 - 修改dnsmasq配置,用
server指令配合ipset实现条件转发:- 先创建一个ipset:
ipset create steam_server hash:ip - 脚本检测到服务器正常时,把
192.168.0.225加入ipset;离线时移除。 - 在dnsmasq配置里加:
# 服务器在线时,用静态地址 ipset=/$TARGET_DOMAIN/steam_server address=/$TARGET_DOMAIN/$SERVER_IP # 服务器离线时,转发到unbound递归解析 server=/$TARGET_DOMAIN/127.0.0.1#5300
- 先创建一个ipset:
注意事项
- 确保运行脚本的用户(比如crontab的执行用户)有修改动态配置文件的权限。
- 检测方式可以根据你的服务类型调整:如果是HTTP服务,用
curl -s -o /dev/null -w "%{http_code}" http://$SERVER_IP | grep 200会比ping更准确,因为ping通不代表服务正常。 - 测试时可以手动停止你的服务器,等待脚本运行后,用
nslookup steamcontent.com验证是否回退到官方解析。
备注:内容来源于stack exchange,提问作者Pickle Tickle
相关产品推荐
相关产品推荐

