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查询]
快速开始
安装
# 克隆项目
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
运行服务器
# 使用默认配置
./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
运行客户端
# 使用默认配置
./build/edns-client
# 使用自定义参数
./build/edns-client \
-listen "127.0.0.1:5353" \
-server "127.0.0.1:5354" \
-key "your-secret-key" \
-verbose
测试DNS查询
# 使用客户端作为DNS服务器
dig @127.0.0.1 -p 5353 google.com
# 或使用nslookup
nslookup google.com 127.0.0.1:5353
作为Go库使用
EDNS现在可以作为Go库直接集成到您的项目中,提供完整的DNS代理功能。
安装库
go get gitee.com/dark.H/edns
客户端使用示例
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))
// 解析和显示响应...
}
服务器使用示例
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
// 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
// NewServer 创建新的DNS代理服务器
func NewServer(cfg *config.Config) (*Server, error)
// StartService 启动服务器监听加密DNS查询
func (s *Server) StartService() error
// Close 关闭服务器释放资源
func (s *Server) Close()
配置选项
服务器端参数
./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: 启用详细日志
客户端参数
./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:
{
"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
开发
开发环境
# 安装依赖
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应用中
故障排除
常见问题
-
连接超时
# 检查网络连通性
telnet <server-ip> <port>
# 调整超时设置
-timeout 10s
-
加密失败
# 确保客户端和服务器使用相同密钥
-key "same-secret-key"
-
DNS解析失败
# 检查上游DNS服务器
dig @8.8.8.8 google.com
# 使用详细日志查看错误
-verbose
许可证
MIT License
贡献
欢迎提交Issue和Pull Request来改进这个项目。
更新日志
v1.1.0
- 重构为可复用Go库
- 新增
Query() 方法支持直接查询
- 改进API设计,提供
StartService() 方法
- 添加完整的使用示例
v1.0.0
- 初始版本发布
- 基本UDP DNS代理功能
- AES加密支持
- 配置文件支持
- 性能优化