NNetpath
实验预计 35 分钟

gost:一条命令搭出任意隧道

协议、传输、转发链三者自由组合。ssh 搞不定的形态,它基本都能拼出来。

学完这节你能做到

  • 用 -L 起代理服务、用 -F 串出多级转发链
  • 写出 TCP/UDP 端口转发与反向(rtcp)转发的命令
  • 按需求选传输层:裸 TCP、TLS、WebSocket、gRPC

建议先学跳过这几节会看不懂本节的部分推导

一个统一的心智模型

gost 的参数看着杂,其实只有四个角色,而且是对称的:

        入口侧                              出口侧
   ┌──────────────────┐            ┌──────────────────┐
   │ Listener  收连接 │            │ Dialer    建连接 │
   │ Handler   懂协议 │  ────────► │ Connector 懂协议 │
   └──────────────────┘            └──────────────────┘
        由 -L 定义                      由 -F 定义
  • Listener / Dialer传输:裸 TCP、TLS、WebSocket、gRPC、QUIC、KCP……
  • Handler / Connector协议:HTTP、SOCKS5、Relay、SS……
  • -L 起一个服务(我在这儿收),-F 指定下一跳(我从那儿出去)
  • 多个 -F 串起来就是转发链(chain),按参数出现顺序逐跳走

理解这四个角色之后,gost 的能力就变成一道组合题:任意协议 × 任意传输 × 任意跳数

起一个代理服务:-L

# HTTP 代理
gost -L http://:8080

# 两个服务同时起:HTTP 8080 + SOCKS5 1080
gost -L http://:8080 -L socks5://:1080

# 省略协议名 = auto,同一个端口自动识别 HTTP / SOCKS4 / SOCKS5
gost -L :8080

最后那个 auto 很实用:一个端口同时伺候三种协议,相当于 Clash 里的 mixed-port, 客户端配 HTTP 还是 SOCKS5 都能用。

认证信息写在 URL 的 userinfo 部分:

gost -L "http://user:pass@:8080"
iURL 就是配置

gost 的每个 -L / -F 都是一个完整 URL:协议+传输://用户:密码@地址:端口?参数=值。 协议特有的开关都走 query 参数,比如后面会用到的 bypass=。 参数清单按协议不同,查官方的 listener / handler 参考页最快。

命令行适合临时验证;长期跑的服务建议转成 YAML 配置文件(gost 支持把等价的 YAML 打印出来)。

串成转发链:-F

# 本地 8080 收,经 192.168.1.1:8080 这个上游代理出去
gost -L http://:8080 -F http://192.168.1.1:8080

# 两跳:先 HTTP 代理,再 SOCKS5 代理,最终从 192.168.1.2 出网
gost -L :8080 -F http://192.168.1.1:8080 -F socks5://192.168.1.2:1080

-F 的顺序就是流量经过的顺序,最后一个 -F 是真正的出口。这是 ssh 隧道做不到的: ssh -J 只能串 SSH,gost 能把不同协议混在一条链上。

端口转发

语法是在监听地址后面直接跟目标:协议://:本地端口/目标:端口

# TCP:本地 8080 → 192.168.1.1:80
gost -L tcp://:8080/192.168.1.1:80

# UDP:本地 10053 → 192.168.1.1:53(DNS 转发)
gost -L udp://:10053/192.168.1.1:53

# 经转发链做端口转发
gost -L=tcp://:8080/192.168.1.1:80 -F socks5://192.168.1.2:1080

对照 SSH:gost -L tcp://:8080/目标:80ssh -L 8080:目标:80, 但 gost 这条多了 UDP 支持——这是 SSH 端口转发的硬缺口。

反向转发:内网穿透

rtcp / rudp 把监听端口开在链路对端,等于 ssh -R,但不需要对端开 GatewayPorts

# 在内网机器上执行:把本机 22 端口暴露到 192.168.1.2 的 2222 上
gost -L=rtcp://:2222/:22 -F socks5://192.168.1.2:1080

流量方向:外面的人连 192.168.1.2:2222 → 经隧道回到内网机器 → 落到它的 :22

什么时候该从 ssh 换到 gost
场景用什么
临时看一眼远端服务、手上只有 sshssh -L
一次性 SOCKS5 代理ssh -D
需要转发 UDPgost(ssh 不支持)
要长期挂着的内网穿透gost rtcp(不依赖 GatewayPorts,重连逻辑更完善)
要串多种协议的多级链gost -F
要换传输层伪装成 HTTPS 流量gost wss / mwss / h2
要按域名分流gost bypass

一句话:ssh 是随手就有,gost 是专门为此而生。 临时排障用 ssh,长期服务用 gost。

换传输层

同一个协议可以跑在不同传输之上,这是 gost 最有价值的能力之一。写法是 协议+传输

写法含义适用
http://裸 HTTP内网,无需伪装
http+tls:// / https://HTTP over TLS需要加密
relay+wss://Relay over WebSocket over TLS要穿过只放 HTTP(S) 的网络
relay+mwss://同上,多路复用要经 CDN 前置(复用能显著降低握手开销)
http2:// / grpc://HTTP/2 / gRPC长连接多路复用,特征自然
kcp:// / quic://UDP 基础上的可靠传输高丢包链路

选择依据很实际:看你的网络放什么过去。只放 443 的环境用 wss; 需要经 CDN 就得用 WebSocket 系(CDN 只代理 HTTP 语义的流量); 链路丢包严重才考虑 kcp/quic

分流:bypass

不是所有流量都该走隧道。bypass 让指定目标直连:

# 这些域名不走上游链路,直接本地出网
gost -L :8080 -F "socks5://1.2.3.4:1080?bypass=*.cn,*.internal,10.0.0.0/8"

# 反过来:只有匹配的才绕过(~ 前缀表示取反)
gost -L :8080 -F "socks5://1.2.3.4:1080?bypass=~*.example.com"

企业内网场景里这个几乎必配:内网域名和私网段必须直连, 否则请求绕一圈出去再回来,慢且经常失败——和上一节 NO_PROXY 是同一个道理, 只是这次由代理自己判断。

一个真实的服务端形态

社区里流传较广的自建方案(见 haoel 的科学上网笔记) 大致是这个形状:

# 服务端:HTTP/2 over TLS,用真实证书,带主动探测抵抗
docker run -d --name gost --restart=always --net=host \
  -v /etc/letsencrypt:/etc/letsencrypt:ro \
  gogost/gost \
  -L "http2://user:pass@:443?cert=/etc/letsencrypt/live/example.com/fullchain.pem\
&key=/etc/letsencrypt/live/example.com/privkey.pem&probe_resist=file:/var/www/index.html"
# 客户端:本地 mixed 端口,转发到服务端
gost -L :1080 -F "http2://user:pass@example.com:443"

三个要点:

  • 用真实域名和真实证书(Let's Encrypt + certbot 自动续期),别用自签
  • probe_resist 决定"别人直接用浏览器访问这个端口时看到什么"—— 返回一个正常网页比返回错误更不引人注意,这属于下一节流量特征的话题
  • 服务端顺手把 BBR 打开(net.ipv4.tcp_congestion_control=bbr), 长肥链路上的收益很直接(L0 讲过原因)
!别把认证省了

-L http://:8080 不带认证,就是一个开放代理。挂在公网上几小时内就会被扫到并滥用, 你的 IP 会被拿去发垃圾邮件、扫端口,最后账号被云厂商封禁。

三条底线:加认证、只监听需要的地址、用安全组把端口收到必要来源。 临时测试也别偷懒——gost -L socks5://:1080 绑的是 0.0.0.0

检查点

检查点单选

gost -L :8080 -F http://A:8080 -F socks5://B:1080 这条命令,流量最终从哪台机器出网?

检查点单选

需要把内网一台机器的 UDP 服务(比如 DNS)转发给外部访问,长期挂着。用什么?

检查点单选

在企业内网部署 gost 代理,为什么几乎一定要配 bypass?

这节课的落点

  • 四个角色:Listener/Dialer 管传输,Handler/Connector 管协议;-L 起服务,-F 指下一跳
  • -L :8080 的 auto 模式让一个端口同时支持 HTTP 与 SOCKS5
  • 多个 -F 按顺序串成转发链,最后一个是出口
  • 端口转发 -L tcp://:8080/目标:80,反向 rtcp / rudp 做内网穿透
  • gost 相对 ssh 的三个优势:UDP 转发、长期穿透、多协议混合链 + 传输层可换
  • 传输层按"网络放什么过去"选:只放 443 用 wss,经 CDN 必须 WebSocket 系
  • bypass 必配,内网域名与私网段一律直连
  • 公网上的代理一定要加认证,否则很快会被扫到滥用

延伸资料