English | 中文
exsocks 是一个用 Rust 编写的高性能 SOCKS5 代理服务器,基于 Tokio 异步运行时构建,专注于性能、安全性和可运维性。
- 高性能异步架构 — 基于 Tokio epoll/kqueue 事件驱动,单进程可处理数万并发连接
- SOCKS5 协议 — 完整实现 RFC 1928 CONNECT 命令,支持 IPv4 / IPv6 / 域名地址类型
- 用户认证 — 支持 RFC 1929 用户名/密码认证,凭证文件热加载
- 源地址白名单 — 基于 CIDR 规则的客户端 IP 访问控制,配置文件热加载
- 目标地址规则管控 — 支持 DOMAIN/DOMAIN-SUFFIX/IP-CIDR 规则的 PASS/BLOCK 控制,支持优先级匹配;域名后缀匹配采用倒序 Trie 优化,IP-CIDR 匹配采用 Radix Trie 优化
- DNS 缓存 — 内置 DNS 解析缓存(正缓存 + 负缓存),减少重复 DNS 查询
- 可配置缓冲区 — 转发缓冲区大小可调(16 KiB ~ 256 KiB),适配不同网络场景
- Prometheus 监控 — 内置 Prometheus metrics 端点,9 个核心指标(连接数、字节数、认证、DNS 缓存等),纯原子操作零开销
- 结构化日志 — 基于
tracing,支持按天滚动、文件大小滚动、最大保留天数 - 多层配置 — 支持 YAML 配置文件 + 环境变量 + 命令行参数,优先级递增
- Docker 支持 — 提供多阶段构建 Dockerfile,生产就绪
- 优雅关闭 — 支持
Ctrl+C信号优雅关闭,等待活跃连接完成
# 克隆仓库
git clone <repo-url>
cd exsocks
# 开发构建
make build
# 生产优化构建(启用 LTO + 单 codegen unit)
make build-release
# 构建镜像
make build-docker# 使用默认配置启动(监听 127.0.0.1:1080,无认证)
./exsocks./exsocks --config example/server.yaml./exsocks --bind 0.0.0.0:1080 --log-level debugcurl -x socks5h://127.0.0.1:1080 https://httpbin.org/ipexsocks 支持多层配置,优先级从低到高:
- 系统配置:
~/.config/exsocks/server.yaml - 当前目录:
./config/server.yaml - 命令行指定:
--config <path> - 环境变量:
EXSOCKS_*(如EXSOCKS_BIND)
完整配置示例 (example/server.yaml)
启用 metrics_enabled: true 后,exsocks 在 metrics_bind 地址暴露 /metrics HTTP 端点,供 Prometheus 抓取。
| 类型 | 指标名 | 标签 | 说明 |
|---|---|---|---|
| Gauge | exsocks_active_connections |
- | 当前活跃连接数 |
| Counter | exsocks_connections_total |
status=accepted/blocked |
连接总数 |
| Counter | exsocks_bytes_total |
direction=up/down |
传输字节总数 |
| Counter | exsocks_connect_target_errors_total |
- | 连接目标失败总数 |
| Counter | exsocks_auth_total |
result=success/failure |
认证结果计数 |
| Counter | exsocks_dns_cache_total |
result=hit/miss |
DNS 缓存命中/未命中 |
| Counter | exsocks_dns_resolve_total |
result=success/failure |
DNS 解析结果 |
| Counter | exsocks_target_rule_total |
action=pass/block |
目标规则命中计数 |
| Gauge | exsocks_dns_cache_entries |
- | DNS 缓存当前条目数 |
scrape_configs:
- job_name: 'exsocks'
static_configs:
- targets: ['127.0.0.1:9090']所有指标操作均为无锁原子操作(fetch_add),单次约 5-10ns,不引入任何 mutex 竞争或内存分配。metrics_enabled: false 时走 no-op 路径,开销约 1-2ns。
Accept → 白名单检查 → SOCKS5 握手 → 认证 → 请求解析 → DNS 解析 → 连接目标 → 双向转发
| 阶段 | 设计 | 说明 |
|---|---|---|
| 连接接受 | epoll/kqueue 事件驱动 | tokio::spawn 轻量异步 task |
| 握手/请求解析 | 栈上固定缓冲区 | 零堆分配,系统调用次数最小化 |
| DNS 解析 | DashMap 并发缓存 |
正/负缓存分离 TTL,惰性淘汰 |
| 数据转发 | BufReader + copy_buf |
可配置缓冲区(默认 64 KiB),纯异步 |
| 认证/白名单 | ArcSwap 无锁读 |
热加载时原子替换,读路径零开销 |
# 运行所有测试
make test
# 仅单元测试
make test-unit
# 仅集成测试
make test-integration
# Docker 容器内测试(适用于 macOS 开发环境)
make test-docker
# 测试覆盖率(仅 Linux,需安装 cargo-tarpaulin)
make coverageMIT