# edns **Repository Path**: dark.H/edns ## Basic Information - **Project Name**: edns - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-20 - **Last Updated**: 2025-12-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EDNS - 加密DNS代理服务器 一个基于UDP传输的加密DNS代理服务器,支持AES加密的DNS查询转发。既可单独部署作为代理服务,也可作为Go库集成到其他项目中。 ## 功能特性 - 🚀 **高性能**: 基于UDP协议,支持并发处理 - 🔐 **AES加密**: 使用AES-GCM算法加密DNS流量 - 🌐 **多上游支持**: 支持配置多个上游DNS服务器 - ⚡ **低延迟**: 优化的网络处理和连接管理 - 🛠️ **易配置**: 支持命令行参数和配置文件 - 📦 **库支持**: 可作为Go库直接集成 - 📊 **监控**: 内置性能指标和日志记录 ## 架构设计 ``` 客户端 (DNS Client) <---UDP---> 服务器 (DNS Server) | | v v [本地DNS查询] [上游DNS服务器] | | v v [AES加密] ---> [网络传输] ---> [AES解密] | | v v [返回响应] <--- [网络传输] <--- [DNS查询] ``` ## 快速开始 ### 安装 ```bash # 克隆项目 git clone https://gitee.com/dark.H/edns.git cd edns # 构建二进制文件 make build # 或者直接使用go命令 go build -o build/edns-client ./cmd/client go build -o build/edns-server ./cmd/server ``` ### 运行服务器 ```bash # 使用默认配置 ./build/edns-server # 使用自定义参数 ./build/edns-server \ -listen "0.0.0.0:5354" \ -upstream "8.8.8.8:53,1.1.1.1:53" \ -key "your-secret-key" \ -verbose ``` ### 运行客户端 ```bash # 使用默认配置 ./build/edns-client # 使用自定义参数 ./build/edns-client \ -listen "127.0.0.1:5353" \ -server "127.0.0.1:5354" \ -key "your-secret-key" \ -verbose ``` ### 测试DNS查询 ```bash # 使用客户端作为DNS服务器 dig @127.0.0.1 -p 5353 google.com # 或使用nslookup nslookup google.com 127.0.0.1:5353 ``` ## 作为Go库使用 EDNS现在可以作为Go库直接集成到您的项目中,提供完整的DNS代理功能。 ### 安装库 ```bash go get gitee.com/dark.H/edns ``` ### 客户端使用示例 ```go package main import ( "fmt" "log" "gitee.com/dark.H/edns/pkg/edns" "gitee.com/dark.H/edns/internal/config" ) func main() { // 创建客户端配置 cfg := config.DefaultConfig() cfg.Client.ListenAddr = "127.0.0.1:5353" cfg.Client.ServerAddr = "127.0.0.1:5354" cfg.Client.TransportProtocol = "udp" cfg.Client.EnableLogging = true cfg.Common.EncryptionKey = "my-secret-key-123" // 创建客户端 client, err := edns.NewClient(cfg) if err != nil { log.Fatal(err) } defer client.Close() // 方式1: 启动服务监听DNS查询 go func() { if err := client.StartService(); err != nil { log.Printf("Client service error: %v", err) } }() // 方式2: 直接使用Query方法发送DNS查询 response, err := client.Query("example.com") if err != nil { log.Fatal(err) } fmt.Printf("Received DNS response: %d bytes\n", len(response)) // 解析和显示响应... } ``` ### 服务器使用示例 ```go package main import ( "log" "gitee.com/dark.H/edns/pkg/edns" "gitee.com/dark.H/edns/internal/config" ) func main() { // 创建服务器配置 cfg := config.DefaultConfig() cfg.Server.ListenAddr = "0.0.0.0:5354" cfg.Server.TransportProtocol = "udp" cfg.Server.EnableLogging = true cfg.Server.UpstreamDNS = []string{"8.8.8.8:53"} cfg.Common.EncryptionKey = "my-secret-key-123" // 创建服务器 server, err := edns.NewServer(cfg) if err != nil { log.Fatal(err) } defer server.Close() log.Println("Starting DNS proxy server...") // 启动服务器(阻塞) if err := server.StartService(); err != nil { log.Fatal(err) } } ``` ### API 参考 #### 客户端 API ```go // NewClient 创建新的DNS代理客户端 func NewClient(cfg *config.Config) (*Client, error) // StartService 启动客户端服务监听DNS查询 func (c *Client) StartService() error // Query 发送DNS查询并返回原始DNS响应 func (c *Client) Query(domain string) ([]byte, error) // Close 关闭客户端释放资源 func (c *Client) Close() ``` #### 服务器 API ```go // NewServer 创建新的DNS代理服务器 func NewServer(cfg *config.Config) (*Server, error) // StartService 启动服务器监听加密DNS查询 func (s *Server) StartService() error // Close 关闭服务器释放资源 func (s *Server) Close() ``` ## 配置选项 ### 服务器端参数 ```bash ./build/edns-server -h ``` - `-listen`: 监听地址 (默认: `0.0.0.0:5354`) - `-upstream`: 上游DNS服务器,用逗号分隔 (默认: `8.8.8.8:53,1.1.1.1:53`) - `-key`: 加密密钥 (默认: `default-secret-key`) - `-timeout`: 请求超时时间 (默认: `5s`) - `-verbose`: 启用详细日志 ### 客户端参数 ```bash ./build/edns-client -h ``` - `-listen`: 本地监听地址 (默认: `127.0.0.1:5353`) - `-server`: 代理服务器地址 (默认: `127.0.0.1:5354`) - `-key`: 加密密钥 (默认: `default-secret-key`) - `-timeout`: 请求超时时间 (默认: `5s`) - `-verbose`: 启用详细日志 ## 配置文件 创建配置文件 `config.json`: ```json { "client": { "listen_addr": "127.0.0.1:5353", "server_addr": "127.0.0.1:5354", "enable_logging": true, "buffer_size": 4096, "max_connections": 1000 }, "server": { "listen_addr": "0.0.0.0:5354", "upstream_dns": ["8.8.8.8:53", "1.1.1.1:53"], "enable_logging": true, "buffer_size": 4096, "max_connections": 1000 }, "common": { "encryption_key": "your-secret-key-here", "request_timeout": "5s", "read_timeout": "1s", "write_timeout": "1s", "enable_metrics": false, "metrics_port": 9090 } } ``` ## 项目结构 ``` edns/ ├── cmd/ │ ├── client/ # 客户端命令行入口 │ └── server/ # 服务器命令行入口 ├── pkg/ │ └── edns/ # 可复用库包 │ ├── client.go # 客户端库实现 │ └── server.go # 服务器库实现 ├── internal/ │ ├── crypto/ # AES加密/解密模块 │ ├── dns/ # DNS处理模块 │ ├── proxy/ # 代理核心逻辑 │ └── config/ # 配置管理 ├── examples/ │ ├── client_example.go # 客户端使用示例 │ └── server_example.go # 服务器使用示例 ├── build/ # 构建输出目录 ├── go.mod ├── go.sum ├── Makefile └── README.md ``` ## 开发 ### 开发环境 ```bash # 安装依赖 go mod tidy # 构建所有组件 make build # 运行示例 go run examples/client_example.go go run examples/server_example.go # 代码格式化 gofmt -w . ``` ### 性能优化 - 使用连接池管理UDP连接 - 实现goroutine池复用 - Buffer复用减少内存分配 - 批量处理提高吞吐量 - 自适应超时机制 ## 使用场景 - 🌐 **网络代理**: 在受限网络环境中访问DNS服务 - 🔒 **隐私保护**: 加密DNS查询防止网络监控 - 🚀 **性能优化**: 缓存和负载均衡提高响应速度 - 📊 **流量管理**: 集中式DNS流量控制和监控 - 🏗️ **系统集成**: 作为库集成到Go应用中 ## 故障排除 ### 常见问题 1. **连接超时** ```bash # 检查网络连通性 telnet # 调整超时设置 -timeout 10s ``` 2. **加密失败** ```bash # 确保客户端和服务器使用相同密钥 -key "same-secret-key" ``` 3. **DNS解析失败** ```bash # 检查上游DNS服务器 dig @8.8.8.8 google.com # 使用详细日志查看错误 -verbose ``` ## 许可证 [MIT License](LICENSE) ## 贡献 欢迎提交Issue和Pull Request来改进这个项目。 ## 更新日志 ### v1.1.0 - 重构为可复用Go库 - 新增 `Query()` 方法支持直接查询 - 改进API设计,提供 `StartService()` 方法 - 添加完整的使用示例 ### v1.0.0 - 初始版本发布 - 基本UDP DNS代理功能 - AES加密支持 - 配置文件支持 - 性能优化