Go to file
jianghanxin da892685bc update 2025-03-17 20:01:21 +08:00
config update 2025-03-17 20:01:21 +08:00
dns update 2025-03-17 20:01:21 +08:00
proxy update 2025-03-17 20:01:21 +08:00
README.md update 2025-03-17 20:01:21 +08:00
SNI_Proxy update 2025-03-17 20:01:21 +08:00
config.yaml update 2025-03-17 20:01:21 +08:00
go.mod update 2025-03-17 20:01:21 +08:00
go.sum update 2025-03-17 20:01:21 +08:00
init.txt update 2025-03-17 20:01:21 +08:00
main.go update 2025-03-17 20:01:21 +08:00

README.md

SNI 代理

这是一个基于 Go 语言实现的 SNI 代理,支持 TLS 分片功能和多种域名匹配方法。

功能特点

  • 直接使用 SNI 域名作为目标地址
  • 支持多种 DNS 协议解析域名UDP/TCP/DoT/DoH/DoQ
  • 支持 TLS 分片(可配置分片大小范围)
  • 多种域名匹配方式:
    • 正则表达式匹配
    • 后缀匹配
    • 关键词匹配
  • 完善的超时控制和连接管理
  • 基于配置文件的灵活配置

安装

从源码构建

# 克隆仓库
git clone https://github.com/yourusername/SNI_Proxy.git
cd SNI_Proxy

# 安装依赖
go mod tidy

# 构建
go build -o sni_proxy

使用方法

  1. 创建配置文件 config.yaml(参考示例配置文件)
  2. 运行代理服务器:
./sni_proxy -config config.yaml

配置文件说明

配置文件使用 YAML 格式,包含以下主要部分:

# 监听地址
listen: "0.0.0.0:443"

# 默认目标端口
default_port: 443

# DNS解析器配置
dns:
  protocol: "udp"        # 支持 udp, tcp, dot, doh, doq
  server: "8.8.8.8:53"   # DNS服务器地址
  timeout: 5             # 超时时间(秒)

# 超时配置
timeout:
  connect: 10            # 连接超时(秒)
  read: 30               # 读取超时(秒)
  write: 5               # 写入超时(秒)
  idle: 60               # 空闲超时(秒)
  lifetime: 300          # 连接最大生命周期(秒)

# 日志级别: debug, info, warn, error
log_level: "info"

# 最大并发连接数
max_conns: 1000

# 代理规则
rules:
  # 规则示例
  - domains:
      - type: regexp    # 支持 regexp, suffix, keyword
        value: "^api\\.example\\.com$"
    port: 443           # 目标端口
    fragment:
      enabled: true     # 是否启用 TLS 分片
      min_size: 100     # 最小分片大小
      max_size: 500     # 最大分片大小

工作原理

  1. 代理服务器接收客户端的 TLS 连接
  2. 从 ClientHello 消息中提取 SNI服务器名称指示
  3. 根据配置的规则匹配 SNI 域名
  4. 使用配置的 DNS 解析器将 SNI 域名解析为 IP 地址
  5. 使用解析得到的 IP 地址和配置的端口连接到目标服务器
  6. 将客户端的请求转发到目标服务器,可选择进行 TLS 分片

域名匹配方式

  1. 正则表达式匹配 (regexp):使用正则表达式匹配域名
  2. 后缀匹配 (suffix):匹配指定后缀的域名
  3. 关键词匹配 (keyword):匹配包含指定关键词的域名

DNS 解析器配置

  • protocol: DNS 协议类型,支持以下选项:
    • udp: 标准 UDP DNS默认
    • tcp: 标准 TCP DNS
    • dot: DNS over TLS
    • doh: DNS over HTTPS
    • doq: DNS over QUIC目前不支持
  • server: DNS 服务器地址,格式为 IP:端口
  • timeout: DNS 查询超时时间(秒)

超时和连接管理配置

  • timeout: 超时配置
    • connect: 连接目标服务器的超时时间(秒)
    • read: 读取数据的超时时间(秒)
    • write: 写入数据的超时时间(秒)
    • idle: 空闲连接的超时时间(秒)
    • lifetime: 连接的最大生命周期(秒)
  • log_level: 日志级别,支持 debug、info、warn、error
  • max_conns: 最大并发连接数,超过此数量的新连接将被拒绝

TLS 分片配置

  • enabled: 是否启用 TLS 分片
  • min_size: 最小分片大小(字节)
  • max_size: 最大分片大小(字节)

性能优化

为了避免进程卡死和资源泄漏,本代理实现了以下优化:

  1. 完善的超时控制:为每个连接阶段设置合理的超时时间
  2. 连接生命周期管理:限制连接的最大生存时间
  3. 连接数量限制:防止过多连接导致资源耗尽
  4. 空闲连接清理:定期清理空闲连接
  5. 错误处理优化:优化常见网络错误的处理方式
  6. 资源使用监控:定期记录连接统计信息

注意事项

  • 本程序需要以 root 权限运行才能监听 443 端口
  • 确保目标服务器地址可达
  • 正则表达式需要使用有效的 Go 语言正则表达式语法
  • 适当调整超时和连接管理参数,以适应不同的网络环境

许可证

MIT