428 lines
10 KiB
Markdown
428 lines
10 KiB
Markdown
# YLTX-DNS 智能防污染系统 (二开版)
|
||
|
||
> 基于 MosDNS v5 的企业级DNS智能分流与防污染解决方案
|
||
|
||
[](https://www.gnu.org/licenses/gpl-3.0)
|
||
[](https://golang.org/)
|
||
[](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 <your-repo>
|
||
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*
|
||
|