Clouldon Blog
    • 版块
    • 最新
    • 用户
    • 友链
    • 注册
    • 登录

    MosDNS本地服务器安装

    已定时 已固定 已锁定 已移动 软件教程
    1 帖子 1 发布者 111 浏览 1 关注中
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • clouldonC 离线
      clouldon
      最后由 clouldon 编辑

      以下是 MosDNS-X + EasyMosdns 组合的详细安装教程。教程将严格遵循您指定的目录结构和文件处理方式,所有文件将下载至 /etc/mosdns,二进制文件复制到 /usr/local/bin/,并包含权限设置、服务管理及用户自定义修改的方法。


      一、准备工作

      在开始之前,请确保满足以下条件:

      1. 操作系统:Linux 系统(如 Debian/Ubuntu/CentOS/AlmaLinux 等)。
      2. 权限:拥有 root 或具有 sudo 权限的用户。
      3. 网络:能够访问 GitHub 及互联网以下载所需文件。
      4. 端口:确保 53 端口未被其他 DNS 服务(如 systemd-resolved)占用,并已安装 unzip、wget、curl 等工具:
      # 更新包索引并安装必要工具(以 Debian/Ubuntu 为例)
      sudo apt update && sudo apt install -y wget unzip curl iptables
      
      1. 备份:如果已有 MosDNS 配置,请先备份 /etc/mosdns 目录。

      二、下载所有必需文件

      我们将所有文件集中下载并解压到 /etc/mosdns 目录中。请依次执行以下命令:

      1. 创建并进入工作目录

        sudo mkdir -p /etc/mosdns
        cd /etc/mosdns
        
      2. 下载 EasyMosdns 配置文件压缩包 (v3.5-2)
        源地址

        # 此处使用最新提供的 v3.5-2 版本配置,如链接失效请访问 GitHub Releases 页面查找最新版本
        sudo wget https://github.com/pmkol/easymosdns/archive/refs/tags/v3.5-2.zip -O easymosdns.zip
        
      3. 下载 MosDNS-X 二进制文件压缩包 (v26.05.25)
        源地址

        # 下载适用于 Linux amd64 架构的二进制文件,如需其他架构请前往 Releases 页面选择对应版本
        sudo wget https://github.com/pmkol/mosdns-x/releases/download/v26.05.25/mosdns-linux-amd64.zip -O mosdns-x.zip
        

      此时,/etc/mosdns 目录下应包含两个文件:easymosdns.zip 与 mosdns-x.zip,文件名是重命名的效果。


      三、解压与文件部署

      cd /etc/mosdns
      
      # 1. 解压 EasyMosdns 配置文件(注意:此压缩包内含有顶级目录 easymosdns-3.5-2,我们需要其内部所有内容)
      sudo unzip -q easymosdns.zip
      sudo mv easymosdns-3.5-2/* .   # 将配置内容移至 /etc/mosdns 根目录
      sudo rm -rf easymosdns-3.5-2 easymosdns.zip   # 清理解压残留与原始压缩包
      
      # 2. 解压 MosDNS-X 二进制文件,仅提取内部的 mosdns 可执行文件
      sudo unzip -q mosdns-x.zip mosdns
      sudo cp mosdns /usr/local/bin/   # 将二进制文件移入系统 PATH 路径
      sudo chmod +x /usr/local/bin/mosdns   # 赋予可执行权限
      sudo rm -f mosdns-x.zip   # 删除已使用完毕的压缩包
      

      四、初始化配置文件

      EasyMosdns 提供了一套完整的示例配置文件 config.yaml,我们需要基于此文件进行首次启动前的微调。

      cd /etc/mosdns
      
      # 1. 检查是否存在 config.yaml 文件
      ls -l config.yaml
      
      # 2. (可选)如存在旧配置文件,先创建备份
      sudo cp config.yaml config.yaml.bak
      

      五、安装并启动 MosDNS 系统服务

      MosDNS-X 内置了便捷的服务管理命令(install、start、stop、restart、uninstall)。我们使用以下命令将 MosDNS 安装为系统服务,并立即启动。

      # 1. 将 MosDNS 安装为系统服务,指定工作目录为 /etc/mosdns,并使用 config.yaml 作为主配置文件
      sudo mosdns service install -d /etc/mosdns -c config.yaml
      
      # 2. 启动服务
      sudo mosdns service start
      
      # 3. 查看服务状态(确认是否正常运行)
      sudo mosdns service status
      # 4. 重启服务
      sudo mosdns service restart
      # 5. 停止服务
      sudo mosdns service stop
      

      六、验证 DNS 服务

      服务启动后,可通过以下方式测试 DNS 解析是否正常:

      # 使用 dig 或 nslookup 测试本地 DNS(需提前安装 dnsutils 或 bind-utils)
      dig @127.0.0.1 google.com
      dig @127.0.0.1 qq.com
      
      #或使用nslookip 查看是否默认使用mosdns查询
      nslookup qq.com
      nslookup qq.com 127.0.0.1
      

      如果返回正确的解析结果,说明服务已正常运行。

      # 日志文件优化
      crontab -e
      
      # 在文件末尾添加以下内容
      0 5 * * * sudo truncate -s 0 /etc/mosdns/mosdns.log && /etc/mosdns/rules/update
      

      七、用户自定义修改

      EasyMosdns 提供了高度可定制的配置文件,所有配置均位于 /etc/mosdns/config.yaml。用户可根据注释说明进行个性化修改,例如:

      • 修改监听端口:搜索 protocol: udp 和 protocol: tcp 下方的 addr: 字段,默认端口为 53,可按需更改。
      • 调整上游 DNS 服务器:搜索 upstream 或 remote 相关段落,替换为符合需求的上游地址(如 HTTPS、DoT 等)。
      • 自定义 Hosts 或黑白名单:配置文件中包含丰富的示例,可根据注释轻松添加。

      修改配置后,需手动重启。若需强制重启,可使用以下命令:

      sudo mosdns service restart
      

      八、其他常用管理命令

      操作 命令
      停止服务 sudo mosdns service stop
      重启服务 sudo mosdns service restart
      查看日志 sudo journalctl -u mosdns -f
      卸载服务 sudo mosdns service uninstall (将删除服务但保留配置文件)
      重置配置 sudo /etc/mosdns/tools/config-reset (恢复至初始默认配置)

      九、附录:全自动安装脚本(可选)

      为方便批量部署,您可将以下代码保存为 install_mosdns.sh,一键完成上述所有操作:

      #!/bin/bash
      set -e
      
      echo ">>> 开始安装 MosDNS-X + EasyMosdns ..."
      
      # 安装依赖
      echo ">>> 安装依赖工具..."
      sudo apt update && sudo apt install -y wget unzip curl
      
      # 创建工作目录并进入
      sudo mkdir -p /etc/mosdns
      cd /etc/mosdns
      
      # 下载文件
      echo ">>> 下载 EasyMosdns 配置包..."
      sudo wget https://github.com/pmkol/easymosdns/archive/refs/tags/v3.5-2.zip -O easymosdns.zip
      echo ">>> 下载 MosDNS-X 二进制包..."
      sudo wget https://github.com/pmkol/mosdns-x/releases/download/v26.05.25/mosdns-linux-amd64.zip -O mosdns-x.zip
      
      # 解压与部署
      echo ">>> 解压并部署文件..."
      sudo unzip -q easymosdns.zip
      sudo mv easymosdns-3.5-2/* ./
      sudo rm -rf easymosdns-3.5-2 easymosdns.zip
      
      sudo unzip -q mosdns-x.zip mosdns
      sudo cp mosdns /usr/local/bin/
      sudo chmod +x /usr/local/bin/mosdns
      sudo rm -f mosdns-x.zip
      
      # 安装并启动服务
      echo ">>> 安装系统服务..."
      sudo mosdns service install -d /etc/mosdns -c config.yaml
      sudo mosdns service start
      
      echo ">>> 安装完成!"
      echo ">>> 服务状态:"
      sudo mosdns service status
      

      赋予执行权限并运行:

      chmod +x install_mosdns.sh
      sudo ./install_mosdns.sh
      

      自用config.yaml

      # =============================================
      # EasyMosdns v3.5 - 节点IP自动分流版
      # 项目地址:https://apad.pro/easymosdns
      # 本配置文件用于 MosDNS-X 或原版 MosDNS
      # Github:
      # 配置https://github.com/pmkol/easymosdns
      # 二进制:https://github.com/pmkol/mosdns-x/
      # =============================================
      
      # ---------------------------------------------
      # 日志配置
      # ---------------------------------------------
      log:
        file: "./mosdns.log"          # 日志文件存放路径
        level: info                    # 日志级别:debug/info/warn/error
      
      # ---------------------------------------------
      # 数据源配置(规则文件)
      # 所有规则文件位于 ./rules/ 目录下
      # ---------------------------------------------
      data_providers:
        - tag: chinalist               # 中国域名列表(常见国内域名)
          file: ./rules/china_domain_list.txt
          auto_reload: true
      
        - tag: gfwlist                 # GFW 封锁域名列表(需要代理的域名)
          file: ./rules/gfw_domain_list.txt
          auto_reload: true
      
        - tag: cdncn                   # 国内 CDN 域名列表(使用本地 DNS 解析更优)
          file: ./rules/cdn_domain_list.txt
          auto_reload: true
      
        - tag: chinaip                 # 中国 IP 地址段
          file: ./rules/china_ip_list.txt
          auto_reload: true
      
        - tag: gfwip                   # GFW 相关 IP 地址段(用于响应检测)
          file: ./rules/gfw_ip_list.txt
          auto_reload: true
      
        - tag: adlist                  # 广告域名黑名单
          file: ./rules/ad_domain_list.txt
          auto_reload: true
      
        - tag: hosts                   # 自定义 hosts 映射文件
          file: ./hosts.txt
          auto_reload: true
      
      # ---------------------------------------------
      # 插件列表(按顺序处理)
      # ---------------------------------------------
      plugins:
        # ----- 1. Hosts 映射插件 -----
        - tag: hosts
          type: hosts
          args:
            hosts:
              - "provider:hosts"       # 从 data_providers 中加载 hosts
      
        # ----- 2. ECS (EDNS Client Subnet) 自动获取插件 -----
        - tag: ecs_auto
          type: ecs
          args:
            auto: true                 # 自动获取客户端真实 IP 子网
            force_overwrite: false     # 不强制覆盖已有的 ECS
      
        # ----- 3. ECS 局域网匹配插件(用于判断客户端是否在内网)-----
        - tag: ecs_is_lan
          type: query_matcher
          args:
            ecs:                       # 匹配以下私有/特殊 IP 段的 ECS
              - "0.0.0.0/8"
              - "10.0.0.0/8"
              - "100.64.0.0/10"
              - "127.0.0.0/8"
              - "169.254.0.0/16"
              - "172.16.0.0/12"
              - "192.168.0.0/16"
              - "224.0.0.0/3"
              - "::1/128"
              - "fc00::/7"
              - "fe80::/10"
      
        # ----- 4. 缓存插件(用于局域网客户端)-----
        - tag: cache_lan
          type: cache
          args:
            size: 1024                 # 缓存条目数量
            lazy_cache_ttl: 180        # 懒加载缓存 TTL(秒)
            cache_everything: true     # 缓存所有响应(包括错误)
            lazy_cache_reply_ttl: 1    # 懒加载回复的临时 TTL
      
        # ----- 5. 缓存插件(用于广域网查询)-----
        - tag: cache_wan
          type: cache
          args:
            size: 4096                 # 缓存条目数量(比 LAN 更大)
            compress_resp: true        # 压缩响应以节省内存
            lazy_cache_ttl: 180
            cache_everything: true
            lazy_cache_reply_ttl: 5
      
        # ----- 6. TTL 修改插件(1 分钟)-----
        - tag: ttl_1m
          type: ttl
          args:
            minimal_ttl: 60            # 最小 TTL 60 秒
            maximum_ttl: 3600          # 最大 TTL 1 小时
      
        # ----- 7. TTL 修改插件(5 分钟)-----
        - tag: ttl_5m
          type: ttl
          args:
            minimal_ttl: 300           # 最小 TTL 5 分钟
            maximum_ttl: 18000         # 最大 TTL 5 小时
      
        # ----- 8. TTL 修改插件(1 小时)-----
        - tag: ttl_1h
          type: ttl
          args:
            minimal_ttl: 3600          # 最小 TTL 1 小时
            maximum_ttl: 18000
      
        # ----- 9. 黑洞插件(返回空响应,用于广告屏蔽)-----
        - tag: black_hole
          type: blackhole
          args:
            rcode: 0                   # 返回 NOERROR 空应答
            ipv4: "0.0.0.0"           # A 记录返回 0.0.0.0
            ipv6: "::"                # AAAA 记录返回 ::
      
        # ----- 10. 查询匹配:非域名格式(如纯 IP 查询)-----
        - tag: query_is_non_domain
          type: query_matcher
          args:
            domain:
              - "keyword::"            # 匹配空关键字(通常用于识别非标准域名)
      
        # ----- 11. 查询匹配:本地域名(中国域名)-----
        - tag: query_is_local_domain
          type: query_matcher
          args:
            domain:
              - "provider:chinalist"
      
        # ----- 12. 查询匹配:非本地域名(GFW 列表域名)-----
        - tag: query_is_non_local_domain
          type: query_matcher
          args:
            domain:
              - "provider:gfwlist"
      
        # ----- 13. 查询匹配:国内 CDN 域名-----
        - tag: query_is_cdn_cn_domain
          type: query_matcher
          args:
            domain:
              - "provider:cdncn"
      
        # ----- 14. 查询匹配:广告域名-----
        - tag: query_is_ad_domain
          type: query_matcher
          args:
            domain:
              - "provider:adlist"
      
        # ----- 15. 响应匹配:响应中包含中国 IP-----
        - tag: response_has_local_ip
          type: response_matcher
          args:
            ip:
              - "provider:chinaip"
      
        # ----- 16. 响应匹配:响应中包含 GFW IP-----
        - tag: response_has_gfw_ip
          type: response_matcher
          args:
            ip:
              - "provider:gfwip"
      
        # ----- 17. 查询匹配:QType = 12 (PTR 记录)-----
        - tag: qtype12
          type: query_matcher
          args:
            qtype: [12]
      
        # ----- 18. 查询匹配:QType = 65 (HTTPS 记录)-----
        - tag: qtype65
          type: query_matcher
          args:
            qtype: [65]
      
        # ----- 19. 查询匹配:QType = 255 (ANY 查询)-----
        - tag: qtype255
          type: query_matcher
          args:
            qtype: [255]
      
        # ----- 20. 上游转发:本地 DNS(国内)-----
        - tag: forward_local
          type: fast_forward
          args:
            upstream:
              - addr: "udpme://119.29.29.29"          # 腾讯 DNS(UDP + 多路复用)
              - addr: "udpme://223.5.5.5"             # 阿里 DNS(UDP + 多路复用)
              - addr: "https://dns.alidns.com/dns-query"   # 阿里 DoH
                enable_pipeline: true
                bootstrap: "223.6.6.6"
              - addr: "https://doh.pub/dns-query"          # DNSPod DoH
                enable_pipeline: true
                bootstrap: "119.29.29.29"
      
        # ----- 21. 上游转发:远程 DNS(国际)-----
        - tag: forward_remote
          type: fast_forward
          args:
            upstream:
              - addr: "udpme://1.1.1.1"               # Cloudflare
              - addr: "udpme://8.8.8.8"               # Google
              - addr: "udpme://9.9.9.9"               # Quad9
              - addr: "udp://185.222.222.222"         # 备用 UDP
                #enable_pipeline: true
                #socks5: "127.0.0.1:1080"             # 可通过 SOCKS5 代理(需自行配置)
      
        # ----- 22. 主逻辑序列(核心处理流程)-----
        - tag: main_sequence
          type: sequence
          args:
            exec:
              # 步骤 1:应用 hosts 映射
              - hosts
      
              # 步骤 2:处理非域名查询(如纯 IP 反向查询)
              - if: "(query_is_non_domain)"
                exec:
                  - _new_nxdomain_response   # 返回 NXDOMAIN
                  - _return
      
              # ============================================================
              # 步骤 3:处理 PTR 查询(QType=12)- 修改后直接返回 NXDOMAIN
              # 原因:Windows nslookup 默认会查询 PTR 记录,国内 DNS 对 PTR 支持不佳导致超时
              # 直接返回 NXDOMAIN 可避免超时,不影响正常 A/AAAA 查询
              # ============================================================
              - if: "[qtype12]"              # PTR 反向查询
                exec:
                  - _no_ecs                  # 移除 ECS 信息
                  - _new_nxdomain_response   # 直接返回 NXDOMAIN(域名不存在)
                  - _return
      
              # 步骤 3b:处理 ANY 查询(QType=255)
              - if: "[qtype255]"             # ANY 查询
                exec:
                  - _no_ecs
                  - forward_local
                  - ttl_1h
                  - _return
      
              # 步骤 4:自动获取 ECS(EDNS Client Subnet)
              - ecs_auto
              - _edns0_filter_ecs_only      # 过滤只保留 ECS 信息
      
              # 步骤 5:根据 ECS 是否为局域网选择缓存
              - if: ecs_is_lan
                exec:
                  - cache_lan
                  - _no_ecs
                else_exec:
                  - cache_wan
      
              # 步骤 6:如果是局域网 ECS,再次移除 ECS(避免泄露)
              - if: ecs_is_lan
                exec:
                  - _no_ecs
      
              # 步骤 7:广告域名直接黑洞并返回
              - if: query_is_ad_domain
                exec:
                  - black_hole
                  - ttl_1h
                  - _return
      
              # 步骤 8:本地域名或 CDN 域名 → 使用本地 DNS,并检查响应是否被污染
              - if: "(query_is_local_domain) || (query_is_cdn_cn_domain)"
                exec:
                  - forward_local
                  - if: "(! response_has_gfw_ip)"   # 如果响应中没有 GFW IP,则正常返回
                    exec:
                      - ttl_1m
                      - _return
      
              # 步骤 9:GFW 列表域名 → 直接使用远程 DNS(代理)
              - if: query_is_non_local_domain
                exec:
                  - _prefer_ipv4                # 优先返回 IPv4 地址
                  - forward_remote
                  - ttl_5m
                  - _return
      
              # 步骤 10:其余未分类域名 → 优先远程,如果响应包含中国 IP 则回落到本地 DNS
              - _prefer_ipv4
              - primary:
                  - forward_remote
                  - if: response_has_local_ip
                    exec:
                      - forward_local
                      - _return
                secondary:
                  - forward_local
                  - _return
                fast_fallback: 2500            # 主上游超时后快速切换到备用
                always_standby: false
      
              # 最后设置 TTL 为 5 分钟
              - ttl_5m
      
      # ---------------------------------------------
      # DNS 服务器监听配置
      # ---------------------------------------------
      servers:
        - exec: main_sequence          # 使用上面定义的 main_sequence 处理逻辑
          timeout: 6                   # 查询超时时间(秒)
          listeners:
            - protocol: udp
              addr: "0.0.0.0:53"       # 监听所有网卡的 UDP 53 端口
            - protocol: tcp
              addr: "0.0.0.0:53"       # 监听所有网卡的 TCP 53 端口
      
      # ---------------------------------------------
      # API 接口(可选,默认注释)
      # ---------------------------------------------
      #api:
        #http: "0.0.0.0:9080"          # 开启后可通过 HTTP 查看统计信息
      

      结束语

      至此,您已成功部署了一套基于 MosDNS-X 与 EasyMosdns 的 DNS 分流服务器。它不仅具备极高的性能,还内置了针对中国大陆地区的优化规则,可有效解决 DNS 污染问题,并提供 ECS 支持以加速 CDN 调度。如有任何自定义需求(如修改上游、调整缓存策略、添加广告过滤等),均可通过编辑 /etc/mosdns/config.yaml 轻松实现。

      1 条回复 最后回复 回复 引用

      你好!看起来您对这段对话很感兴趣,但您还没有一个账号。

      厌倦了每次访问都刷到同样的帖子?您注册账号后,您每次返回时都能精准定位到您上次浏览的位置,并可选择接收新回复通知(通过邮件或推送通知)。您还能收藏书签、为帖子顶,向社区成员表达您的欣赏。

      有了你的建议,这篇帖子会更精彩哦 💗

      注册 登录
      • 第一个帖子
        最后一个帖子