You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在dnsmasq中实现自定义地址失效时自动回退到默认DNS解析?

如何在dnsmasq中实现自定义地址失效时自动回退到默认DNS解析?

刚好碰到过类似的需求,dnsmasq本身的静态address配置是固定死的,不会自动检测你的服务器是否在线,所以得靠一点小脚本配合动态配置来实现自动回退,给你两种实用的方案:

方案一:动态配置文件+定时健康检查脚本

这是最直接的方法,核心思路是用脚本定期检测服务器状态,动态生成dnsmasq的配置文件,再让dnsmasq重载配置。

  1. 准备动态配置目录
    先创建一个专门放动态DNS配置的目录,比如/etc/dnsmasq.d/dynamic,然后打开你的dnsmasq主配置文件(一般是/etc/dnsmasq.conf),添加一行:

    conf-dir=/etc/dnsmasq.d/dynamic
    

    这样dnsmasq会自动加载这个目录下的所有.conf文件。

  2. 编写健康检查脚本
    创建一个脚本文件,比如/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
    
  3. 设置脚本权限和定时任务
    给脚本加上执行权限:

    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里做条件转发:

  1. 先安装并配置unbound作为本地递归DNS,监听127.0.0.1#5300。
  2. 修改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
      
    这种方式的优势是解析更可靠,但配置稍复杂,适合对DNS稳定性要求高的场景。

注意事项

  • 确保运行脚本的用户(比如crontab的执行用户)有修改动态配置文件的权限。
  • 检测方式可以根据你的服务类型调整:如果是HTTP服务,用curl -s -o /dev/null -w "%{http_code}" http://$SERVER_IP | grep 200会比ping更准确,因为ping通不代表服务正常。
  • 测试时可以手动停止你的服务器,等待脚本运行后,用nslookup steamcontent.com验证是否回退到官方解析。

备注:内容来源于stack exchange,提问作者Pickle Tickle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:12:59