# YLTX-DNS 智能防污染系统 (二开版) > 基于 MosDNS v5 的企业级DNS智能分流与防污染解决方案 [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) [![Go Version](https://img.shields.io/badge/Go-1.19+-00ADD8?logo=go)](https://golang.org/) [![Vue 3](https://img.shields.io/badge/Vue-3.3+-4FC08D?logo=vue.js)](https://vuejs.org/) --- ## ✨ 核心特性 ### 🛡️ 智能防污染 - 先查国内DNS,智能检测污染IP - 基于CN地址表精准识别 - 自动切换国际DNS重新查询 - P95延迟 < 150ms ### 🎯 自动依赖排序 - 彻底解决配置顺序敏感问题 - 拓扑排序自动调整插件加载顺序 - 循环依赖智能检测与报告 ### 🖥️ Web可视化管理 - Vue 3 + Element Plus 现代化界面 - 零YAML配置,表单化操作 - 域名规则可视化管理 - MikroTik一键集成 ### 🔧 配置预验证 - 启动前全面验证配置 - 插件引用完整性检查 - 文件路径自动验证 - 详细错误提示,防止崩溃 ### 🚀 MikroTik集成 - 自动推送解析结果到路由器 - 支持地址列表批量管理 - 可配置缓存与超时策略 --- ## 📊 快速对比 | 特性 | 原版MosDNS | YLTX-DNS (二开版) | |------|-----------|------------------| | 配置方式 | 手写YAML | Web界面 + YAML | | 配置顺序 | ❌ 严格要求 | ✅ 任意顺序 | | 防污染方案 | ❌ 需手动配置 | ✅ 智能检测 | | 配置验证 | ⚠️ 运行时错误 | ✅ 启动前验证 | | 路由器集成 | ⚠️ 需手动配置 | ✅ 一键启用 | | Web管理 | ❌ 无 | ✅ 完整界面 | | 上手难度 | 🔴 较高 | 🟢 低 | --- ## 🚀 快速开始 ### 1. 编译项目 ```bash # 克隆代码 git clone cd mosdns # 构建前端 cd web-ui npm install npm run build cd .. # 编译程序 go build -ldflags="-s -w" -o mosdns . ``` ### 2. 准备配置 ```bash # 创建目录 mkdir -p config.d/rules data/mikrotik # 使用示例配置 cp config-smart-fallback.yaml config.yaml ``` ### 3. 启动服务 ```bash # 直接运行 ./mosdns -c config.yaml # 或使用systemd sudo systemctl start mosdns ``` ### 4. 访问界面 ``` Web管理: http://localhost:5555 DNS端口: 53, 5353 ``` --- ## 🎯 核心功能 ### 智能防污染工作流程 ``` 用户查询 chat.openai.com ↓ 查询国内DNS (223.5.5.5) ↓ 返回IP: 127.0.0.1 ↓ 检查CN地址表 → ❌ 不在表中 ↓ 判定为污染 → 切换国际DNS ↓ 查询Cloudflare (1.1.1.1) ↓ 返回正确IP: 104.18.xxx.xxx ✅ ``` ### Web界面功能 ``` ┌─────────────────────────────────────┐ │ 📊 仪表盘 │ │ - 系统状态监控 │ │ - DNS端口识别 │ │ - 实时查询统计 │ ├─────────────────────────────────────┤ │ 🎯 域名路由规则 │ │ - 规则增删改查 │ │ - DNS策略选择 │ │ ○ 国内DNS │ │ ○ 国外DNS │ │ ● 智能防污染 ⭐ │ │ - MikroTik配置 │ │ - 可视化表单 │ └─────────────────────────────────────┘ ``` --- ## 📝 配置示例 ### 添加OpenAI规则 **Web界面操作**: 1. 访问 http://localhost:5555 2. 点击「域名路由规则」 3. 点击「添加规则」 4. 填写表单: - 规则名: `openai` - 域名文件: `/data/mikrotik/openai.txt` - DNS策略: `智能防污染` - MikroTik: 启用,填写路由器信息 5. 保存并重启 **自动生成的配置**: ```yaml # config.d/rules/openai.yaml plugins: - tag: domains_openai type: domain_set args: files: ["/data/mikrotik/openai.txt"] - tag: rule_openai type: sequence args: exec: - matches: qname $domains_openai exec: $smart-fallback - matches: has_resp exec: $mikrotik_openai - tag: mikrotik_openai type: mikrotik_addresslist args: host: "192.168.1.1" port: 8728 username: "admin" password: "******" address_list: "openai" ``` --- ## 🏗️ 技术架构 ### 核心组件 ``` ┌──────────────────────────────────────────┐ │ 前端层 (Vue 3 + Element Plus) │ │ - 仪表盘 DashboardView │ │ - 规则管理 RulesView │ │ - API客户端 (Axios) │ └──────────────┬───────────────────────────┘ │ HTTP API ┌──────────────▼───────────────────────────┐ │ API层 (Go HTTP Handlers) │ │ - 规则管理 rule_handlers.go │ │ - 服务器信息 api_handlers.go │ │ - MikroTik管理 │ └──────────────┬───────────────────────────┘ │ ┌──────────────▼───────────────────────────┐ │ 业务层 (ConfigBuilder) │ │ - 配置生成 config_builder.go │ │ - 配置验证 config_validator.go │ │ - 拓扑排序 toposort.go │ └──────────────┬───────────────────────────┘ │ ┌──────────────▼───────────────────────────┐ │ 插件层 (MosDNS Plugins) │ │ - 智能防污染 smart_fallback │ │ - 域名集合 domain_set │ │ - MikroTik推送 mikrotik_addresslist │ └──────────────┬───────────────────────────┘ │ ┌──────────────▼───────────────────────────┐ │ 网络层 │ │ - UDP/TCP Server (53, 5353) │ │ - 国内DNS (223.5.5.5) │ │ - 国际DNS (1.1.1.1, 8.8.8.8) │ └──────────────────────────────────────────┘ ``` ### 新增文件清单 | 文件 | 说明 | 行数 | |------|------|------| | `pkg/utils/toposort.go` | 拓扑排序算法 | 145 | | `coremain/config_validator.go` | 配置验证器 | 293 | | `coremain/config_builder.go` | 配置生成器 | 429 | | `plugin/executable/smart_fallback/` | 智能防污染插件 | 270 | | `web-ui/` | Vue前端项目 | 2000+ | | `test-smart-fallback.sh` | 自动化测试 | 243 | | `data/chn_ip.txt` | CN地址表 | 772 | --- ## 📈 性能指标 | 场景 | 延迟 | 说明 | |------|------|------| | 国内域名 | 20-30ms | 无需防污染 | | 国外域名(污染) | 80-120ms | 需二次查询 | | 国外域名(无污染) | 30-50ms | 一次命中 | | 缓存命中 | <5ms | 零网络 | **并发能力**: - 单核: 3000-5000 qps - 四核: 10000-15000 qps **资源占用**: - 内存: 30-150MB - CPU: <5% (1000 qps) - 二进制: ~15MB (含Web) --- ## 🔧 核心创新 ### 1. 配置顺序自由 **传统**: ```yaml # ❌ 顺序错误→启动失败 plugins: - tag: main exec: $upstream # upstream还未定义 - tag: upstream ``` **YLTX-DNS**: ```yaml # ✅ 任意顺序→自动排序 plugins: - tag: main exec: $upstream # OK! 自动调整 - tag: upstream ``` ### 2. 智能污染检测 **传统**: 域名黑名单(维护困难) **YLTX-DNS**: CN IP地址表(精准可靠) ### 3. 零配置门槛 **传统**: 手写复杂YAML **YLTX-DNS**: Web表单一键生成 --- ## 🛠️ 运维指南 ### systemd配置 ```ini # /etc/systemd/system/mosdns.service [Unit] Description=YLTX-DNS Smart Fallback Service After=network.target [Service] Type=simple User=mosdns ExecStart=/usr/local/bin/mosdns -c /etc/mosdns/config.yaml Restart=on-failure RestartSec=10s LimitNOFILE=65535 [Install] WantedBy=multi-user.target ``` ### 日志查看 ```bash # 实时日志 journalctl -u mosdns -f # 错误日志 journalctl -u mosdns -p err # 详细日志 ./mosdns -c config.yaml -v ``` ### 性能监控 ```bash # 查询统计 curl http://localhost:5541/metrics # 系统状态 curl http://localhost:5541/api/server-info ``` --- ## 🐛 故障排查 ### 启动失败 ```bash # 检查配置 ./mosdns -c config.yaml -dry-run # 查看错误 journalctl -u mosdns -n 50 ``` ### Web无法访问 ```bash # 检查端口 netstat -tlnp | grep 5555 # 测试连接 curl http://localhost:5555 ``` ### 防污染不生效 ```bash # 检查CN地址表 ls -lh data/chn_ip.txt # 启用详细日志 # config.yaml → smart_fallback → verbose: true ``` --- ## 📚 完整文档 - [架构设计文档](./yltx-dns-智能防污染系统-架构设计文档.md) - [二次开发总结](./YLTX-DNS智能防污染系统-二次开发总结.md) - [错误修复记录](./错误修复总结.md) - [配置示例](./config-smart-fallback.yaml) --- ## 🤝 参与贡献 欢迎提交Issue和Pull Request! 1. Fork本项目 2. 创建特性分支 (`git checkout -b feature/xxx`) 3. 提交更改 (`git commit -m 'Add xxx'`) 4. 推送分支 (`git push origin feature/xxx`) 5. 开启Pull Request --- ## 📄 开源许可 本项目基于 **GPL-3.0** 开源许可证 继承自 [MosDNS v5](https://github.com/IrineSistiana/mosdns) --- ## 🙏 致谢 - **MosDNS** - 强大的DNS解析引擎 - **Element Plus** - 优雅的Vue组件库 - **chnroutes2** - CN IP地址表数据源 --- ## 📞 支持 - 📖 [完整文档](./YLTX-DNS智能防污染系统-二次开发总结.md) - 🐛 [问题反馈](../../issues) - 💬 [讨论区](../../discussions) --- **⭐ 如果这个项目对你有帮助,请给个Star!** *最后更新: 2025-10-15*