edns

command module
v0.2.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 20, 2025 License: MulanPSL-2.0 Imports: 3 Imported by: 0

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查询]

快速开始

安装
# 克隆项目
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应用中

故障排除

常见问题
  1. 连接超时

    # 检查网络连通性
    telnet <server-ip> <port>
    
    # 调整超时设置
    -timeout 10s
    
  2. 加密失败

    # 确保客户端和服务器使用相同密钥
    -key "same-secret-key"
    
  3. 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加密支持
  • 配置文件支持
  • 性能优化

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
cmd
client command
server command
internal
dns
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL