一个支持动态代理链的HTTP/SOCKS5代理服务器。
- 同时支持HTTP和SOCKS5代理协议,共用同一个端口
- 支持用户名、密码认证(可选)
- 支持HTTP CONNECT命令
- 支持多级代理链
- 支持在用户名中编码动态代理链
- 支持配置默认代理链
- 支持.env文件配置
go install github.com/webee/dynamic-proxy-chain/cmd/dynamic-proxy-chain@latest或者从源码编译:
git clone https://github.com/webee/dynamic-proxy-chain.git
cd dynamic-proxy-chain
go build ./cmd/dynamic-proxy-chaindynamic-proxy-chain/
├── cmd/
│ └── dynamic-proxy-chain/ // 命令行入口程序
│ └── main.go
├── config.go // 配置处理模块
├── chain.go // 代理链管理
├── server.go // 代理服务器实现
├── .env.example // 环境变量示例
├── go.mod // Go模块文件
└── README.md // 项目文档
dynamic-proxy-chain [选项]
选项:
-host string
监听主机 (默认 "0.0.0.0")
-port int
监听端口 (默认 8080)
-user string
认证用户名
-pass string
认证密码
-proxy string
默认代理链,格式:scheme://[username:password@]host:port[,scheme://[username:password@]host:port]...
也可以通过环境变量或.env文件配置:
HOST: 监听主机PORT: 监听端口USER: 认证用户名PASS: 认证密码PROXY: 默认代理链
在用户名中编码动态代理链的格式为:
username+<p1 scheme>;<p1 username>;<p1 password>;<p1 host>;<p1 port>+<p2 scheme>;<p2 username>;<p2 password>;<p2 host>;<p2 port>+...
其中:
username: 原始用户名+: 代理分隔符;: 代理内部参数分隔符- 每个代理参数包括:scheme, username, password, host, port
在使用socks5代理请求时,要使动态代理链生效,则服务器必须配置用户名, 因为动态代理链是编码在用户名中的,如果服务器不需要认证,则无法解析到指定的动态代理链信息。
# 启动一个简单的代理服务器
dynamic-proxy-chain
# 指定端口和认证信息
dynamic-proxy-chain -port 1080 -user user -pass pass
# 配置默认代理链
dynamic-proxy-chain -proxy "http://proxy1.example.com:8080,socks5://user:pass@proxy2.example.com:1080"例如,如果代理服务器配置了用户名user和密码pass,那么使用动态代理链的方式为:
用户名: user+http;;proxy1.example.com;8080+socks5;user2;pass2;proxy2.example.com;1080
密码: pass
这将创建一个代理链:客户端 -> 动态代理链服务器 -> http://proxy1.example.com:8080 -> socks5://user2:pass2@proxy2.example.com:1080 -> 目标服务器
package main
import (
"log"
dpc "github.com/webee/dynamic_proxy_chain"
)
func main() {
// 创建配置
cfg := &dpc.Config{
Host: "0.0.0.0",
Port: 8080,
Username: "user",
Password: "pass",
}
// 创建代理服务器
server := dpc.NewServer(cfg)
// 启动服务器
if err := server.Start(); err != nil {
log.Fatalf("启动服务器失败: %v", err)
}
}MIT