Socks5Proxy
用golang 实现了一个简单的socks5协议来实现代理转发,主要应用场景是給公司内部做VPN登陆,提供内网访问。(声明:由于采用的是原始的socks5协议,并没有对协议做改造加工,并不一定能防范GFW的主动探测,请勿用于非法用途)
项目同时支持两种运行模式:
proxy:HTTP/SOCKS5 TCP 应用代理,支持 HTTP 转发、HTTPS CONNECT 和simple/random流量混淆。tunnel:Linux/macOS/Windows 全局 IPv4 TUN,以及 Android VpnService / iOS Packet Tunnel 原生客户端,默认使用 QUIC + TLS 1.3;可选 TCP + TLS 1.3(-transport tcp)或显式无加密 TCP(-transport tcp-plain),支持none/simple/random混淆。
客户端平台
| 平台 | 架构 | 使用入口 | | --- | --- | --- | | Linux | amd64、arm64 | CLI,TUN 模式需要 root / 网络管理权限 | | Windows | amd64、arm64 | CLI,以管理员身份运行;使用包含对应 Wintun DLL 的 ZIP | | macOS | Intel、Apple Silicon | CLI,TUN 模式需要 sudo | | Android 8.0+ | arm64、armv7、x86_64 | 原生配置界面 + VpnService;构建 APK 后安装 | | iOS / iPadOS 15+ | arm64;模拟器 arm64、x86_64 | SwiftUI + NetworkExtension;真机需 Apple 签名 |
桌面发布物由 Release workflow 构建;移动源码、AAR/XCFramework 和应用构建入口见移动客户端文档。移动端目前提供全局 IPv4 隧道,尚无真机联网验收;IPv6 被阻断。应用签名和商店分发由使用者配置。
安全说明
- 当前
simple/random仅用于流量混淆,不是安全加密,也不提供现代意义上的机密性、完整性或重放防护。 - 全局隧道默认
quic,以及可选的tcp,使用 TLS 1.3;不会自动降级为明文。tcp-plain不提供 IP 包机密性或完整性,即使使用random也是如此。 - 两个 TCP 后端使用新鲜随机挑战和 HMAC 认证,线路上传输认证证明,不直接发送令牌或摘要。摘要本身等价于 TCP 认证凭据,应保密;明文模式仍可被监听、篡改或中继,应使用独立测试令牌。
- 不要把
simple/random当作 TLS、SSH、WireGuard 或 AEAD 安全通道的替代品。 proxy密码最终只影响至多 256 张替换表,长密码不能提升其密码学强度。本地监听无用户认证,默认只绑定127.0.0.1:8888;服务端没有目标地址 ACL,部署时应限制访问来源和出口。- TLS 隧道保护客户端至服务端这一段;服务端仍可看到解封装的流量。目标站点的数据保护依赖 HTTPS 等端到端协议。完整边界见安全与威胁模型。
文件结构
cryptogram.go 流量混淆算法
socks5.go socks5协议实现
server.go 服务端实现
client.go 客户端实现
cmd/server/main.go 服务端主启动程序
cmd/client/main.go 客户端主启动程
internal/tunnel/ 全局加密隧道、TUN 和系统网络配置
mobile/ 可嵌入的 Go 隧道核心,gomobile 绑定接口
apps/android/ Android 原生 VPN 应用
apps/ios/ iOS 原生应用与 Packet Tunnel 扩展
使用说明
从 GitHub Releases 下载对应系统/架构的产物并校验 SHA256SUMS。Release 可能落后于源码;下面也提供从仓库根目录运行的方式(Go 版本见 go.mod)。
客户端和服务端可以在同一台机器运行,使用两个不同端口。分别在两个终端执行:
# 终端 1:服务端
go run ./cmd/server -mode proxy -local 127.0.0.1:18888 -type random -passwd demo-only
终端 2:客户端
go run ./cmd/client -mode proxy -local 127.0.0.1:8888 \
-server 127.0.0.1:18888 -type random -passwd demo-only -recv http
curl --noproxy "" --proxy http://127.0.0.1:8888 https://example.com/
浏览器设置 HTTP/HTTPS 代理为 127.0.0.1:8888。若客户端改为 -recv socks5,浏览器也必须选择 SOCKS5,curl 使用 --proxy socks5h://127.0.0.1:8888。代理目标不能指回这两个监听端口。跨机器部署时,客户端的 -server 改为服务端地址;完整说明见应用代理部署。
-passwd 没有默认值,必须显式设置;-type 默认 random,两端必须相同。客户端 -recv 默认 http。应用代理只处理主动配置代理的应用;全局 IPv4 流量请使用隧道模式。
两端 proxy 模式均支持以下资源参数:
| 参数 | 默认值 | 含义 |
| --- | --- | --- |
| -max-connections | 256 | 每个进程的最大活动会话数,额外连接留在系统监听队列 |
| -dial-timeout | 10s | 上游/目标连接及 DNS 的超时 |
| -handshake-timeout | 10s | 从接收连接到完成协议协商的总预算 |
| -idle-timeout | 5m | 双向均无流量时回收连接 |
握手总预算包含连接时间;这些参数为 0 时使用默认值,负数无效。每会话约占用两个 FD,低 ulimit -n 环境应下调并发上限,详见资源排障。Ctrl+C 会关闭监听及活动会话并等待退出。
TODO
- [x] 明确
simple/random仅用于流量混淆,不作为安全加密承诺(#23) - [x] 迁移 CI 到 GitHub Actions,并补齐格式化 / 测试 / vet / staticcheck(#25)
- [x] 将发布物迁移到 GitHub Releases,并提供
SHA256SUMS(#28) - [x] 补充 README 的安全声明与威胁模型说明(#29)
- [x] 说明客户端与服务端同机部署的使用方式(#2)
- [x] 排查并缓解
socket: too many open files问题(#3) - [x] 更新下载与使用说明,覆盖最新发布方式与问题排查入口(#4)