Skip to content

About

HTTP 代理与 SOCKS5 代理互转命令行工具,使用 Go 编写,同时支持 Linux 与 Windows。 本地开启一个 HTTP 或 SOCKS5 代理服务端(前端),将流量转发到另一个 HTTP/SOCKS5 代理(后端);不指定后端时则为普通直连代理。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

proxy-forward

HTTP 代理与 SOCKS5 代理互转命令行工具,使用 Go 编写,同时支持 Linux 与 Windows。

本地开启一个 HTTP 或 SOCKS5 代理服务端(前端),将流量转发到另一个 HTTP/SOCKS5 代理(后端);不指定后端时则为普通直连代理。

功能特性

  • 代理互转:支持 HTTP↔SOCKS5 全部四种组合(HTTP→SOCKS5、SOCKS5→HTTP、HTTP→HTTP、SOCKS5→SOCKS5)
  • 直连代理:仅指定前端时,自动开启普通 HTTP / SOCKS5 代理,直接转发流量到目标
  • 前后端认证:前端与后端均可单独配置用户名密码认证,默认匿名
  • 多服务并行:通过 yaml 配置文件可同时开启多个监听端口,运行不同转发规则
  • CLI 优先:命令行参数优先级高于配置文件中的同名参数
  • 来源 IP 访问控制(ACL):支持白名单/黑名单,规则支持单一 IP、IP 范围(192.168.1.100-192.168.1.150)、CIDR(10.0.0.0/8),亦支持 IPv6
  • 分级日志:debug / info / warn / error / none,可输出到终端或指定文件
  • 跨平台:纯标准库实现(仅依赖 gopkg.in/yaml.v3),支持交叉编译 Linux / Windows

目录结构

go-proxy-forward-tool/
├── main.go            # 程序入口:命令行解析、参数优先级合并、信号处理
├── config.go          # yaml 配置加载、校验与编译
├── config.example.yaml# 配置文件示例(含注释)
├── logger.go          # 分级日志器
├── acl.go             # 来源 IP 访问控制(单IP/范围/CIDR、黑白名单)
├── backend.go         # 后端连接:HTTP 隧道 / SOCKS5 / 直连,及双向隧道拷贝
├── httpproxy.go       # HTTP 前端代理(CONNECT 隧道 + 普通请求转发)
├── socksproxy.go      # SOCKS5 前端代理(RFC1928/1929 握手与认证)
├── server.go          # 服务框架:多服务并行、优雅停止
├── *_test.go          # 单元测试与集成测试
├── go.mod / go.sum
└── .gitignore

编译

# 本地平台
go build -o proxy-forward .

# Linux (amd64)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o proxy-forward .

# Windows (amd64)
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o proxy-forward.exe .

命令行用法

proxy-forward [选项]

  -config <file>       yaml 配置文件路径(支持多服务)
  -listen <addr>       前端监听地址,如 http://0.0.0.0:8080 或 socks5://127.0.0.1:1080
                       可在地址中嵌入认证: http://user:pass@0.0.0.0:8080
  -backend <addr>      后端代理地址,如 socks5://user:pass@127.0.0.1:1083 或 http://127.0.0.1:7071
                       省略或指定 direct 则为直连代理
  -acl <rules>         来源IP访问控制: whitelist:192.168.1.100,10.0.0.0/8,1.2.3.4-1.2.3.9
                       或 blacklist:192.168.1.100,10.0.0.0/8
  -log-level <level>   日志级别: debug|info|warn|error|none(默认 info)
  -log-file <file>     日志输出文件路径,默认输出到终端
  -version             显示版本号

使用示例

# HTTP 前端 -> SOCKS5 后端
./proxy-forward -listen http://0.0.0.0:8080 -backend socks5://127.0.0.1:1083

# SOCKS5 前端 -> HTTP 后端
./proxy-forward -listen socks5://0.0.0.0:1080 -backend http://127.0.0.1:7071

# 直连 SOCKS5 代理(无后端)
./proxy-forward -listen socks5://0.0.0.0:1080

# 直连 HTTP 代理
./proxy-forward -listen http://0.0.0.0:8080

# 带认证与 ACL
./proxy-forward -listen http://user:pass@0.0.0.0:8080 -acl whitelist:192.168.1.0/24,127.0.0.1

# 配置文件方式
./proxy-forward -config config.yaml

命令行参数与配置文件重复时,命令行优先。若配置文件含多个服务而命令行指定了 -listen/-backend/-acl,则覆盖配置文件中的第一个服务。

配置文件格式

log:
  level: info          # debug | info | warn | error | none
  file: ""             # 日志输出文件路径,留空则输出到终端

servers:               # 可配置多个服务,同时监听运行
  - name: rule1        # 规则名称(仅用于日志标识,可选)
    frontend:          # 前端(必填)
      protocol: http   # http | socks5
      listen: "0.0.0.0:8080"
      username: ""     # 前端认证(可选),留空为匿名
      password: ""
      acl:             # 来源 IP 访问控制(可选)
        mode: whitelist   # whitelist | blacklist
        rules:
          - "192.168.1.100"
          - "192.168.1.100-192.168.1.150"   # IP 范围(含边界)
          - "10.0.0.0/8"                    # CIDR
    backend:           # 后端(可选),不配置则为直连
      protocol: socks5 # http | socks5 | direct
      host: "127.0.0.1"
      port: 1083
      username: ""     # 后端认证(可选)
      password: ""

配置示例:同时开启多个转发服务

log:
  level: info
  file: "./proxy.log"

servers:
  - name: rule1                       # HTTP: 0.0.0.0:8080 -> SOCKS5 127.0.0.1:1083
    frontend: { protocol: http, listen: "0.0.0.0:8080" }
    backend:  { protocol: socks5, host: "127.0.0.1", port: 1083 }

  - name: rule2                       # SOCKS5: 0.0.0.0:4430 -> HTTP 127.0.0.1:7071
    frontend: { protocol: socks5, listen: "0.0.0.0:4430" }
    backend:  { protocol: http, host: "127.0.0.1", port: 7071 }

  - name: rule3                       # SOCKS5: 0.0.0.0:4451 -> SOCKS5 127.0.0.1:6780
    frontend: { protocol: socks5, listen: "0.0.0.0:4451" }
    backend:  { protocol: socks5, host: "127.0.0.1", port: 6780 }

ACL 说明

  • whitelist:仅放行命中规则的来源 IP,未命中一律拒绝
  • blacklist:拒绝命中规则的来源 IP,未命中一律放行
  • 规则支持三种形式,可混合使用:
    • 单一 IP:192.168.1.100
    • IP 范围:192.168.1.100-192.168.1.150(包含边界)
    • CIDR:10.0.0.0/8、2001:db8::/32
  • 仅验证来源 IP;客户端与前端之间未接入其他中间代理时,即为连接方的 IP

日志说明

级别 说明
debug 最详细,含每连接转发细节
info 常规信息(默认)
warn 警告(认证失败、ACL 拒绝等)
error 错误
none 完全静默
  • 不指定 -log-file / log.file 时,日志输出到终端
  • 指定文件路径后日志追加写入该文件(自动创建)

工作原理

  • HTTP 前端:解析请求,CONNECT 方法建立隧道;普通请求改写为 origin-form 后经隧道转发
  • SOCKS5 前端:完整实现 RFC1928 握手与 RFC1929 用户名密码认证,支持 CONNECT 命令
  • 后端连接:
    • HTTP 后端:发送 CONNECT target 建立隧道(带 Proxy-Authorization 支持)
    • SOCKS5 后端:客户端握手 + CONNECT(带用户名密码认证支持)
    • 直连:直接 TCP 连接目标
  • 隧道采用双向拷贝 + 半关闭传播,保证 EOF 沿多级链路正确传递

测试

go vet ./...
go test -race ./...

测试覆盖:ACL 解析与匹配、配置解析、CLI 参数覆盖、HTTP/SOCKS5 前后端四种链路、前后端认证、ACL 白名单/黑名单、CONNECT 隧道、多服务并行运行等。

About

HTTP 代理与 SOCKS5 代理互转命令行工具,使用 Go 编写,同时支持 Linux 与 Windows。 本地开启一个 HTTP 或 SOCKS5 代理服务端(前端),将流量转发到另一个 HTTP/SOCKS5 代理(后端);不指定后端时则为普通直连代理。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages