10 KiB
10 KiB
YLTX-DNS 智能防污染系统 (二开版)
基于 MosDNS v5 的企业级DNS智能分流与防污染解决方案
✨ 核心特性
🛡️ 智能防污染
- 先查国内DNS,智能检测污染IP
- 基于CN地址表精准识别
- 自动切换国际DNS重新查询
- P95延迟 < 150ms
🎯 自动依赖排序
- 彻底解决配置顺序敏感问题
- 拓扑排序自动调整插件加载顺序
- 循环依赖智能检测与报告
🖥️ Web可视化管理
- Vue 3 + Element Plus 现代化界面
- 零YAML配置,表单化操作
- 域名规则可视化管理
- MikroTik一键集成
🔧 配置预验证
- 启动前全面验证配置
- 插件引用完整性检查
- 文件路径自动验证
- 详细错误提示,防止崩溃
🚀 MikroTik集成
- 自动推送解析结果到路由器
- 支持地址列表批量管理
- 可配置缓存与超时策略
📊 快速对比
| 特性 | 原版MosDNS | YLTX-DNS (二开版) |
|---|---|---|
| 配置方式 | 手写YAML | Web界面 + YAML |
| 配置顺序 | ❌ 严格要求 | ✅ 任意顺序 |
| 防污染方案 | ❌ 需手动配置 | ✅ 智能检测 |
| 配置验证 | ⚠️ 运行时错误 | ✅ 启动前验证 |
| 路由器集成 | ⚠️ 需手动配置 | ✅ 一键启用 |
| Web管理 | ❌ 无 | ✅ 完整界面 |
| 上手难度 | 🔴 较高 | 🟢 低 |
🚀 快速开始
1. 编译项目
# 克隆代码
git clone <your-repo>
cd mosdns
# 构建前端
cd web-ui
npm install
npm run build
cd ..
# 编译程序
go build -ldflags="-s -w" -o mosdns .
2. 准备配置
# 创建目录
mkdir -p config.d/rules data/mikrotik
# 使用示例配置
cp config-smart-fallback.yaml config.yaml
3. 启动服务
# 直接运行
./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界面操作:
- 访问 http://localhost:5555
- 点击「域名路由规则」
- 点击「添加规则」
- 填写表单:
- 规则名:
openai - 域名文件:
/data/mikrotik/openai.txt - DNS策略:
智能防污染 - MikroTik: 启用,填写路由器信息
- 规则名:
- 保存并重启
自动生成的配置:
# 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. 配置顺序自由
传统:
# ❌ 顺序错误→启动失败
plugins:
- tag: main
exec: $upstream # upstream还未定义
- tag: upstream
YLTX-DNS:
# ✅ 任意顺序→自动排序
plugins:
- tag: main
exec: $upstream # OK! 自动调整
- tag: upstream
2. 智能污染检测
传统: 域名黑名单(维护困难)
YLTX-DNS: CN IP地址表(精准可靠)
3. 零配置门槛
传统: 手写复杂YAML
YLTX-DNS: Web表单一键生成
🛠️ 运维指南
systemd配置
# /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
日志查看
# 实时日志
journalctl -u mosdns -f
# 错误日志
journalctl -u mosdns -p err
# 详细日志
./mosdns -c config.yaml -v
性能监控
# 查询统计
curl http://localhost:5541/metrics
# 系统状态
curl http://localhost:5541/api/server-info
🐛 故障排查
启动失败
# 检查配置
./mosdns -c config.yaml -dry-run
# 查看错误
journalctl -u mosdns -n 50
Web无法访问
# 检查端口
netstat -tlnp | grep 5555
# 测试连接
curl http://localhost:5555
防污染不生效
# 检查CN地址表
ls -lh data/chn_ip.txt
# 启用详细日志
# config.yaml → smart_fallback → verbose: true
📚 完整文档
🤝 参与贡献
欢迎提交Issue和Pull Request!
- Fork本项目
- 创建特性分支 (
git checkout -b feature/xxx) - 提交更改 (
git commit -m 'Add xxx') - 推送分支 (
git push origin feature/xxx) - 开启Pull Request
📄 开源许可
本项目基于 GPL-3.0 开源许可证
继承自 MosDNS v5
🙏 致谢
- MosDNS - 强大的DNS解析引擎
- Element Plus - 优雅的Vue组件库
- chnroutes2 - CN IP地址表数据源
📞 支持
⭐ 如果这个项目对你有帮助,请给个Star!
最后更新: 2025-10-15