MosDNS本地服务器安装
-
以下是 MosDNS-X + EasyMosdns 组合的详细安装教程。教程将严格遵循您指定的目录结构和文件处理方式,所有文件将下载至
/etc/mosdns,二进制文件复制到/usr/local/bin/,并包含权限设置、服务管理及用户自定义修改的方法。
一、准备工作
在开始之前,请确保满足以下条件:
- 操作系统:Linux 系统(如 Debian/Ubuntu/CentOS/AlmaLinux 等)。
- 权限:拥有
root或具有sudo权限的用户。 - 网络:能够访问 GitHub 及互联网以下载所需文件。
- 端口:确保
53端口未被其他 DNS 服务(如systemd-resolved)占用,并已安装unzip、wget、curl等工具:
# 更新包索引并安装必要工具(以 Debian/Ubuntu 为例) sudo apt update && sudo apt install -y wget unzip curl iptables- 备份:如果已有 MosDNS 配置,请先备份
/etc/mosdns目录。
二、下载所有必需文件
我们将所有文件集中下载并解压到
/etc/mosdns目录中。请依次执行以下命令:-
创建并进入工作目录
sudo mkdir -p /etc/mosdns cd /etc/mosdns -
下载 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 -
下载 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轻松实现。