`gost` (GO Simple Tunnel) :一个用 Go 语言实现的多功能安全隧道工具

gost (GO Simple Tunnel) 是一个用 Go 语言实现的多功能安全隧道工具,支持多种协议(如 SOCKS5、HTTP、Shadowsocks、VMess 等),可以作为代理服务器或客户端使用,常用于科学上网、内网穿透等场景。

下面将详细介绍 gost 的基本使用方法。


1. 安装 gost

gost 的安装非常简单,因为它是一个独立的二进制文件,无需其他依赖。

方法一:下载预编译的二进制文件 (推荐)

这是最简单快捷的方法。

  1. 访问 gost 的 GitHub Release 页面:https://github.com/go-gost/gost/releases

  2. 根据你的操作系统和CPU架构下载对应的最新版本压缩包(例如 gost_x.y.z_linux_amd64.tar.gzgost_x.y.z_windows_amd64.zip)。

  3. 解压下载的文件,你会得到一个名为 gost (Linux/macOS) 或 gost.exe (Windows) 的可执行文件。

  4. 将该文件移动到你希望的位置(例如 /usr/local/bin/ 或任意目录),并确保它有执行权限。

Linux/macOS 示例:

  
# 下载 (以 v3.0.0 为例,请替换为最新版本)
  
wget https://github.com/go-gost/gost/releases/download/v3.0.0/gost_3.0.0_linux_amd64.tar.gz
  

  
# 解压
  
tar -xzf gost_3.0.0_linux_amd64.tar.gz
  

  
# 移动到 /usr/local/bin 并添加执行权限 (需要root权限)
  
sudo mv gost /usr/local/bin/gost
  
sudo chmod +x /usr/local/bin/gost
  

  
# 验证是否安装成功
  
gost -v
  

方法二:从源代码编译 (需要 Go 环境)

如果你已经安装了 Go 语言开发环境(Go 1.18 或更高版本),也可以从源代码编译安装:

  
go install github.com/go-gost/gost/cmd/gost@latest
  

编译成功后,gost 可执行文件将位于 $GOPATH/bin$GOBIN 目录下。


2. 基本概念

在使用 gost 之前,需要理解其核心概念:

  • 监听 (Listen, -L--listen): gost 作为服务端时,指定它监听的地址和端口,以及监听什么协议。

  • 转发 (Forward, -F--forward): gost 作为客户端时,指定它将请求转发到哪个远程地址和端口,以及使用什么协议进行转发。

  • 协议 (Protocol): gost 支持多种协议,如 socks5httpss (Shadowsocks)、wss (WebSocket Secure) 等。协议通常与地址一起构成一个 URL 形式的字符串,例如 socks5://:1080http://user:pass@example.com:8080


3. 常见使用场景与示例

3.1 搭建一个简单的 SOCKS5 代理服务器

服务器上运行:

  
gost -L "socks5://:1080"
  
  • 这会在服务器的 1080 端口启动一个 SOCKS5 代理。

  • 默认监听所有网络接口(0.0.0.0),如果想指定监听地址,例如只在本地监听:gost -L "socks5://127.0.0.1:1080"

  • 默认无认证,如果需要用户名密码认证:

    
    gost -L "socks5://user:password@:1080"
    

3.2 使用 SOCKS5 代理客户端(本地代理)

客户端本地运行:

  
gost -L "socks5://:1080" -F "socks5://your_server_ip:remote_port"
  
  • 这会在客户端本地的 1080 端口启动一个 SOCKS5 代理。

  • 当你的应用程序连接到本地的 socks5://:1080 时,gost 会将请求通过 socks5 协议转发到 your_server_ip:remote_port

  • 如果远程服务器需要认证,客户端也需要提供认证信息:

    
    gost -L "socks5://:1080" -F "socks5://user:password@your_server_ip:remote_port"
    
  • remote_port 通常是服务器上 gost -L 监听的端口。

如何使用代理:

  • 浏览器: 在浏览器或系统网络设置中配置 SOCKS5 代理,地址为 127.0.0.1,端口为 1080

  • 命令行: 使用 curl 等工具时指定代理:

    
    curl -x socks5://127.0.0.1:1080 https://www.google.com
    

3.3 搭建一个简单的 HTTP 代理服务器

服务器上运行:

  
gost -L "http://:8080"
  
  • 这会在服务器的 8080 端口启动一个 HTTP 代理。

  • 带认证的 HTTP 代理:

    
    gost -L "http://user:password@:8080"
    

3.4 使用 HTTP 代理客户端

客户端本地运行:

  
gost -L "http://:8100" -F "http://your_server_ip:remote_port"
  
  • 这会在客户端本地的 8100 端口启动一个 HTTP 代理,并转发到远程 HTTP 代理。

3.5 Shadowsocks (SS) 代理

服务器端:

  
gost -L "ss://aes-256-cfb:your_password@:8388"
  
  • 这会在服务器的 8388 端口启动一个 Shadowsocks 代理,使用 aes-256-cfb 加密方法和 your_password 密码。

客户端:

  
gost -L "socks5://:1080" -F "ss://aes-256-cfb:your_password@your_server_ip:8388"
  
  • 这会在客户端本地的 1080 端口启动一个 SOCKS5 代理,并通过 Shadowsocks 协议转发到远程服务器。

3.6 加密隧道 (TLS/WS/WSS)

为了增加安全性或伪装流量,gost 支持使用 TLS、WebSocket 或 WebSocket Secure (WSS) 作为底层传输协议。

a) SOCKS5 over TLS (SOCKS5+TLS)

服务器端:

为了使用 TLS,你需要一个证书和私钥。如果没有,gost 可以自动生成一个自签名证书(仅供测试,生产环境请使用正式证书)。

  • 使用自签名证书 (简单但有警告):

    
    gost -L "socks5+tls://:443"
    

    gost 会自动生成一个自签名证书。

  • 使用你自己的证书和私钥:

    
    gost -L "socks5+tls://:443?cert=/path/to/server.pem&key=/path/to/server.key"
    

客户端:

  • 连接到自签名 TLS 服务器 (会忽略证书验证,不安全):

    
    gost -L "socks5://:1080" -F "socks5+tls://your_server_ip:443?secure=false"
    

    secure=false 表示不验证服务器证书,方便测试,但有安全风险。

  • 连接到拥有有效证书的 TLS 服务器:

    
    gost -L "socks5://:1080" -F "socks5+tls://your_server_ip:443"
    

    
    gost -L "socks5://:1080" -F "socks5+tls://your_server_ip:443?secure=true"
    

    (默认 secure=true,会验证证书)。如果你的证书是自签发的但想验证,需要指定 CA 证书路径:?ca=/path/to/ca.crt

b) SOCKS5 over WebSocket Secure (SOCKS5+WSS)

WSS 隧道通常被用于伪装成普通网页流量,因为它运行在 443 端口,并且使用 HTTPS 协议。

服务器端:

  
gost -L "socks5+wss://:443?cert=/path/to/server.pem&key=/path/to/server.key"
  
  • 同样,你可以省略 certkey 参数让 gost 自动生成自签名证书。

客户端:

  
gost -L "socks5://:1080" -F "socks5+wss://your_server_ip:443?secure=false"
  
  • secure=false 的作用同上。

3.7 代理链 (Proxy Chain)

gost 允许你通过多个代理服务器进行连接,形成代理链。

客户端通过两个 SOCKS5 代理连接:

假设你有两个 SOCKS5 代理:proxy1_ip:port1proxy2_ip:port2

  
gost -L "socks5://:1080" -F "socks5://proxy1_ip:port1/socks5://proxy2_ip:port2"
  
  • 这表示本地 SOCKS5 代理(1080端口)的请求,会先转发到 proxy1_ip:port1,然后由 proxy1 转发到 proxy2_ip:port2,最后 proxy2 访问目标网站。

  • 注意 -F 参数中协议链的写法:协议1://地址1/协议2://地址2/...

3.8 透明代理 (Transparent Proxy) - 较复杂,通常用于网关

透明代理允许将网络流量透明地重定向到 gost 代理,而无需在应用程序中手动配置代理。这通常涉及防火墙(如 iptables)规则。

服务器端 (假设在网关设备上):

首先,启动一个透明 SOCKS5 服务器 (或 HTTP 服务器)。

  
gost -L "tproxy+socks5://:1080"
  

然后,配置 iptables 规则将流量重定向到 gost 监听的端口。

这部分配置因网络环境而异,且风险较高,请谨慎操作,并确保你理解 iptables 的工作原理。

简单示例 (仅供参考,不推荐直接使用于生产环境):

  
# 假设你的局域网接口是 eth0, Gost 监听在 1080 端口
  
# 开启 IP 转发
  
echo 1 > /proc/sys/net/ipv4/ip_forward
  

  
# 转发 TCP 流量到 Gost
  
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 1080
  
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-ports 1080
  
# 还需要配置 OUTPUT 链,防止 gost 本身陷入循环
  
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 1080
  
sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 1080
  

4. 使用配置文件 (推荐复杂场景)

对于更复杂的配置,例如同时监听多个协议,或者有多个转发规则,使用配置文件会更清晰方便。gost 支持 YAML、JSON 和 TOML 格式的配置文件。

config.yaml 示例:

  
# 监听服务配置
  
services:
  
  - name: my-socks5-server  # 服务名称
  
    addr: ":1080"          # 监听地址和端口
  
    handler:               # 处理程序配置
  
      type: socks5         # 协议类型
  
      auth:                # 认证信息
  
        username: user
  
        password: password
  
    listener:
  
      type: tcp
  

  
  - name: my-http-client-to-remote-socks5
  
    addr: ":8100"
  
    handler:
  
      type: http
  
    listener:
  
      type: tcp
  
    # 转发链配置
  
    chain:
  
      name: remote-socks5-chain # 链名称
  
      hops:                     # 转发路径,可以有多跳
  
        - name: hop1
  
          nodes:
  
            - addr: "your_remote_server_ip:remote_socks5_port"
  
              protocol: socks5
  
              auth:
  
                username: remote_user
  
                password: remote_password
  
              # transport:
  
              #   type: tls # 如果远程是 socks5+tls,这里配置
  

  
# 转发链配置 (可以独立于 service 定义)
  
chains:
  
  - name: another-socks5-chain
  
    hops:
  
      - name: hop-to-ss
  
        nodes:
  
          - addr: "your_ss_server_ip:8388"
  
            protocol: ss
  
            secret:
  
              cipher: aes-256-cfb
  
              password: your_ss_password
  
            transport:
  
              type: tcp
  

  

保存为 config.yaml,然后运行:

  
gost -C config.yaml
  

5. 常用命令行参数

  • -L <addr>: 定义一个或多个监听器 (listener)。

  • -F <addr>: 定义一个或多个转发器 (forwarder) 或转发链。

  • -C <file>: 指定配置文件路径。

  • -D: 以后台守护进程模式运行。

  • -V-v: 显示版本信息。

  • -verbose: 打印详细日志。


6. 运行在后台 (Linux)

在 Linux 系统上,为了让 gost 持续运行在后台,可以使用 nohupsystemd

使用 nohup (简单,但管理不便):

  
nohup gost -L "socks5://user:password@:1080" &
  

这会将 gost 进程放到后台,并将其输出重定向到 nohup.out 文件。

使用 systemd (推荐,便于管理):

  1. 创建一个 systemd 服务文件,例如 /etc/systemd/system/gost.service

    
    [Unit]
    Description=GO Simple Tunnel
    After=network.target
    
    [Service]
    Type=simple
    # 将 /usr/local/bin/gost 替换为你的 gost 可执行文件路径
    # 将 -L 参数替换为你的实际配置,或使用 -C 参数指定配置文件
    ExecStart=/usr/local/bin/gost -L "socks5://user:password@:1080"
    Restart=always
    User=nobody # 推荐使用非特权用户运行
    Group=nobody # 推荐使用非特权用户运行
    
    [Install]
    WantedBy=multi-user.target
    
  2. 重新加载 systemd 配置:

    
    sudo systemctl daemon-reload
    
  3. 启动 gost 服务:

    
    sudo systemctl start gost
    
  4. 设置开机自启:

    
    sudo systemctl enable gost
    
  5. 查看服务状态:

    
    sudo systemctl status gost
    

7. 注意事项

  • 防火墙: 确保服务器的防火墙(如 ufwfirewalld)允许外部流量访问 gost 监听的端口。例如,放行 1080 端口:

    
    sudo ufw allow 1080/tcp
    
  • 安全性:

    • 始终使用强密码,特别是公共服务器。

    • 优先使用 TLS/WSS 等加密传输,而不是裸的 SOCKS5 或 HTTP。

    • 定期更新 gost 到最新版本。

  • 日志: 使用 -verbose 参数可以查看详细日志,便于排查问题。

  • 官方文档: 遇到复杂问题或需要了解更多高级功能时,请查阅 gost 的官方 GitHub 仓库和文档:https://github.com/go-gost/gost

gost 功能强大且灵活,通过掌握上述基本用法,你就可以满足绝大多数代理需求。