GO Simple Tunnel————GO语言实现的安全隧道
功能特性
多端口监听
可设置转发代理,支持多级转发(代理链)
支持标准HTTP/HTTPS/HTTP2/SOCKS4(A)/SOCKS5代理协议
Web代理支持探测防御
SOCKS5代理支持TLS协商加密
支持多种隧道类型
Tunnel UDP over TCP
本地/远程TCP/UDP端口转发
TCP/UDP透明代理
支持Shadowsocks(TCP/UDP)协议
支持SNI代理
权限控制
负载均衡
路由控制
DNS解析和代理
TUN/TAP设备
下载安装
二进制文件
https://github.com/ginuerzh/gost/releases
源码编译
git clone https://github.com/ginuerzh/gost.git |
Docker
docker pull ginuerzh/gost |
Shadowsocks Android插件
问题建议
提交Issue: https://github.com/ginuerzh/gost/issues
Telegram讨论群: https://t.me/gogost
Google讨论组: https://groups.google.com/d/forum/go-gost
快速开始
代理节点
在GOST中,GOST与其他代理服务都被看作是代理节点,GOST可以自己处理请求,或者将请求转发给任意一个或多个代理节点。
启动运行
开启代理服务
启动一个监听在8080端口的HTTP/SOCKS5代理服务:
gost -L :8080 |
开启多个代理服务
gost -L http2://:443 -L socks5://:1080 -L ss://aes-128-cfb:123456@:8338 |
使用转发代理
gost -L :8080 -F 192.168.1.1:8081 |
监听在8080端口的HTTP/SOCKS5代理服务,使用192.168.1.1:8081作为上级代理进行转发。
使用多级转发代理(代理链)
gost -L=:8080 -F=quic://192.168.1.1:8081 -F=socks5+wss://192.168.1.2:8082 -F=http2://192.168.1.3:8083 ... -F=a.b.c.d:NNNN |
GOST按照-F设置的顺序通过代理链将请求最终转发给a.b.c.d:NNNN处理。
启动参数
GOST目前有以下几个参数项:
-L - 指定本地服务配置,可设置多个。
-F - 指定转发服务配置,可设置多个,构成转发链。
-C - 指定外部配置文件。
-D - 开启Debug模式,更详细的日志输出。
-V - 查看版本,显示当前运行的gost版本号。
配置文件
除了通过命令行直接配置服务外,也可以通过-C参数指定外部配置文件来设置参数:
gost -C gost.json |
配置文件为标准json格式:
{ |
格式说明:
Debug - 对应命令行参数-D。(2.4+)
Retries - 通过代理链建立连接失败后的重试次数。(2.5+)
ServeNodes - 必须项,等同于命令行参数-L。
ChainNodes - 等同于命令行参数-F。
Routes - 可选参数,额外的服务列表,每一项都拥有独立的转发链。(2.5+)
节点配置
逻辑分层
在GOST中一个代理服务逻辑上被分成两层:协议层(Protocol)和传输层(Transport),每层有若干可选的类型,两层之间相互独立,并可以任意组合使用。
当GOST去连接一个代理节点时,会先按照传输层设置的传输类型进行交互,当传输层建立以后,再按照协议层设置的协议类型进行交互。
协议类型(Protocols)
支持的协议类型有:
http - HTTP
http2 - HTTP2
socks4 - SOCKS4 (2.4+)
socks4a - SOCKS4A (2.4+)
socks5 - SOCKS5
ss - Shadowsocks
ss2 - Shadowsocks with AEAD support (2.8+)
sni - SNI (2.5+)
forward - Forward
relay - TCP/UDP relay (2.11+)
传输类型(Transports)
支持的传输类型有:
tcp - 原始TCP
tls - TLS
mtls - Multiplex TLS,在TLS上增加多路复用功能 (2.5+)
ws - Websocket
mws - Multiplex Websocket,在Websocket上增加多路复用功能 (2.5+)
wss - Websocket Secure,基于TLS加密的Websocket
mwss - Multiplex Websocket Secure,在基于TLS加密的Websocket上增加多路复用功能 (2.5+)
kcp - KCP (2.3+)
quic - QUIC (2.4+)
ssh - SSH (2.4+)
h2 - HTTP2 (2.4+)
h2c - HTTP2 Cleartext (2.4+)
obfs4 - OBFS4 (2.4+)
ohttp - HTTP Obfuscation (2.7+)
otls - TLS Obfuscation (2.11+)
配置格式
端口转发相关的节点配置格式请参考端口转发。
在GOST中节点的配置为类URL格式(适用于-L和-F参数):
[scheme://][user:pass@host]:port[?param1=value1¶m2=value2] |
scheme
scheme可以是单独的协议类型或传输类型,或是二者的组合,也可以是空。
不指定任何类型
传输层默认为是原始TCP类型。
对于-L参数,协议层默认为是HTTP & SOCKS5,对于-F参数,协议层默认为是HTTP类型。
gost -L :8080 -F :8888 |
仅指定协议类型
当仅指定协议类型时,传输层默认为原始TCP类型。
gost -L http://:8080 -F socks5://:1080 |
仅指定传输类型
当仅指定传输类型时,对于-L参数,协议类型默认为HTTP+SOCKS5。对于-F参数,协议层默认为是HTTP类型。
gost -L tls://:443 -F ws://:1443 |
组合使用
gost -L http+tls://:443 -F socks5+wss://:1443 |
特殊的schemes
除了上述的类型外,有几个比较特殊的shemes:
https - 简写形式,等同于http+tls
redirect - TCP透明代理 (2.3+)
gost -L redirect://:12345 |
ssu - Shadowsocks UDP relay
gost -L ssu://chacha20:123456@:8338 |
节点认证
user:pass
通过user:pass指定服务的认证信息。对于shadowsocks,user为加密类型。
gost -L admin:123456@:8080 -F ss://chacha20:123456@:8338 |
auth参数 (2.9.2+)
如果认证信息中包含特殊字符,则可以通过auth参数来设置:
gost -L :8080?auth=YWRtaW46MTIzNDU2 -F ss://:8338?auth=Y2hhY2hhMjA6QWEjJiEkMTIzNEA1Njc4 |
auth的值为user:passbase64编码值
secrets参数
也可以通过secrets参数来设定多组认证信息:
gost -L=:8080?secrets=secrets.txt |
secrets.txt文件格式为按行分割的认证信息,每一行认证信息为用空格分割的user-pass对,以 # 开始的行为注释行。
# period for live reloading |
reload - 此配置文件支持热更新。此选项用来指定文件检查周期,默认关闭热更新。
注意: 当secrets参数用于shadowsocks协议时,仅会使用第一项作为认证信息。
所有的认证信息都是用于协议层(Protocol)。
HTTPS(S)
HTTP是GOST支持的一种协议类型(Protocol),配合各种传输类型(Transport)可以很灵活的构建代理服务:
标准HTTP代理服务
gost -L http://:8080 |
这是一种最基本的也是最普遍使用的代理服务类型,本身没有任何加密机制。
标准HTTPS代理服务
gost -L https://:443 |
使用了TLS加密的HTTP代理服务。
HTTP Over Websocket
gost -L http+ws://:8080 |
或
gost -L http+wss://:443 |
使用Websocket (secure)作为传输类型。
HTTP Over KCP
gost -L http+kcp://:8388 |
使用KCP作为传输类型。
HTTP2
在GOST中HTTP2有两种模式:代理模式和隧道模式。
代理模式
在代理模式中,HTTP2被用作协议类型,传输类型必须为空。
gost -L http2://:443 |
443端口就是一个标准的HTTP2代理服务。
代理模式下仅支持使用TLS加密的HTTP2协议,不支持明文HTTP2传输。
隧道模式
在隧道模式中,HTTP2被用作传输类型:h2, h2c。
gost -L socks5+h2://:443 |
或
gost -L http+h2c://:443 |
隧道模式下支持加密(h2)和明文(h2c)两种模式。
参数说明
path - (2.9+) 可选,指定HTTP请求URI。
探测防御
GOST在2.7版本中增加了对HTTP/HTTPS/HTTP2代理的探测防御功能。当代理服务收到非法请求时,会按照探测防御策略返回对应的响应内容。
只有当代理服务开启了用户认证,探测防御功能才有效。
gost -L="http2://admin:123456@:443?probe_resist=code:400&knock=www.example.com" |
probe_resist
代理服务通过probe_resist参数来指定防御策略。参数值的格式为:type:value。
type可选值有:
code - 对应value为HTTP响应码,代理服务器会回复客户端指定的响应码。例如:probe_resist=code:404
web - 对应的value为URL,代理服务器会使用HTTP GET方式访问此URL,并将响应返回给客户端。例如: probe_resist=web:example.com/page.html
host - 对应的value为主机地址,代理服务器会将客户端请求转发给设置的主机地址,并将主机的响应返回给客户端,代理服务器在这里相当于端口转发服务。例如:probe_resist=host:example.com:8080
file - 对应的value为本地文件路径,代理服务器会回复客户端200响应码,并将指定的文件内容作为Body发送给客户端。例如:probe_resist=file:/path/to/file.txt
knock(2.8+)
开启了探测防御功能后,当认证失败时服务器默认不会响应407 Proxy Authentication Required,但某些情况下客户端需要服务器告知代理是否需要认证(例如Chrome中的SwitchyOmega插件)。通过knock参数设置一个私有地址,只有访问此地址时服务器才会发送407响应。
此功能可应用于HTTP,HTTPS和HTTP/2代理:
gost -L=http://admin:123456@:8080?probe_resist=code:403 |
gost -L=https://admin:123456@:443?probe_resist=host:www.example.com:8080 |
gost -L=http2://admin:123456@:443?probe_resist=file:/send/to/client/file.txt |
SCOKS
SOCKS是GOST支持的协议类型(Protocol),SOCKS协议有三个版本: SOCKS4, SOCKS4A和SOCKS5。
SOCKS4
gost -L socks4://:1080 |
标准的SOCKS4代理服务,同时兼容SOCKS4A协议。
SOCKS4A
gost -L socks4a://:1080 |
标准的SOCKS4A代理服务。
SOCKS4(A)当前仅支持CONNECT方法,不支持BIND方法。
SOCKS5
gost -L socks5://:1080 |
SOCKS5协商加密
GOST支持标准SOCKS5协议的no-auth(0x00)和user-pass(0x02)方法,并在此基础上扩展了两个:tls(0x80)和tls-auth(0x82),用于数据加密。
服务端
gost -L=socks5://:1080 |
客户端
gost -L=:8080 -F=socks5://server_ip:1080?notls=true |
如果两端都是GOST(如上)则数据传输会被加密(协商使用tls或tls-auth方法),否则使用标准SOCKS5进行通讯(no-auth或user/pass方法)。
notls - (2.9.1+) 通过此参数可以禁用协商加密,默认值:false。
SOCKS5 UDP Relay
GOST中SOCKS5同时也支持UDP Relay,并支持TCP-over-UDP特性。
不设置转发代理
GOST做为标准SOCKS5代理处理UDP数据。
设置转发代理
设置多个转发代理(代理链)
当设置转发代理时,GOST会使用UDP-over-TCP方式转发UDP数据。proxy1 - proxyN可以为任意类型代理。
如果要转发SOCKS5的BIND和UDP请求,代理链的末端(最后一个-F参数)必须是GOST SOCKS5类型代理。
SOCKS协议也可以与各种传输类型(Transport)组合使用
SOCKS5 Over TLS
gost -L socks5+tls://:1080 |
使用TLS加密的SOCKS5代理服务。
SOCKS5 Over QUIC
gost -L socks5+quic://:1080 |
Shadowsocks
Shadowsocks是GOST支持的一种协议类型(Protocol)。
GOST对shadowsocks的支持是基于shadowsocks/shadowsocks-go库。
使用说明
从2.10.1+开始加密变为可选。
TCP
参数说明
nodelay - true/false (默认值为false)。默认情况下ss协议会等待客户端的请求数据,当收到请求数据后会把协议头部信息与请求数据一起发给服务端。当此参数设为true后,协议头部信息会立即发给服务端,不再等待客户端的请求。
服务端
gost -L=ss://chacha20:password@:8338 |
客户端
gost -L=:8080 -F=ss://chacha20:password@server_ip:8338?nodelay=true |
AEAD加密
2.10.1+后,ss2功能已经合并到ss中,可以直接在ss中使用AEAD加密,ss2已废弃。
在2.8版本中,GOST基于shadowsocks/go-shadowsocks2增加了对AEAD加密的支持。
服务端
gost -L=ss2://AEAD_CHACHA20_POLY1305:password@:8338 |
客户端
gost -L=:8080 -F=ss2://AEAD_CHACHA20_POLY1305:password@server_ip:8338 |
组合传输层
Shadowsocks协议可以与各种传输类型(Transport)组合使用
Shadowsocks Over TLS
gost -L ss+tls://chacha20:123456@:8338 |
Shadowsocks Over KCP
gost -L ss+kcp://chacha20:123456@:8338 |
UDP
服务端
gost -L=ssu://method:password@:8338?ttl=60s |
ttl - (2.10+) 传输通道超时时间,默认为60s。
2.10+后的变化
客户端支持
ssu可以用在转发链中用来转发UDP数据:
gost -L udp://:5353/8.8.8.8:53 -F=ssu://method:password@:8338 |
加密方法
加密变为可选。
基于shadowsocks/go-shadowsocks2增加了对AEAD加密的支持,且兼容老版本中的加密方式。
当设置了加密,会优先使用(shadowsocks/shadowsocks-go)库,若加密方法不支持,则切换到(shadowsocks/go-shadowsocks2)库。
组合传输层
ssu在2.10版本中,变成了一种协议类型,可以与各种传输类型组合使用:
gost -L ssu+kcp://:8338 |
gost -L ssu+wss://:443 |
默认情况下ssu等同于ssu+udp,传输层为原始UDP协议。这种情况下,GOST会使用shadowsocks本身的UDP relay协议进行数据转发。
如果指定了其他传输类型,则会使用SOCKS5的UDP relay协议进行数据转发。
ssu仅能用于转发UDP数据,转发TCP数据的行为未定义。
当用在转发链中时,ssu必须为转发链的最后一个节点。
当ssu+udp用于转发链中时,转发链中不能存在其他节点。
SNI
SNI是GOST支持的一种协议类型(Protocol)。
使用说明
服务端
gost -L sni://:443 |
客户端
可以通过配置hosts直接使用,或使用GOST进行转发:
gost -L :8080 -F sni://server_ip:443 |
Host混淆
在GOST中SNI客户端可以通过host参数来指定Host别名:
gost -L :8080 -F sni://server_ip:443?host=example.com |
SNI客户端会将TLS握手或HTTP请求头中的Host替换为host参数指定的内容。
SNI协议可以与各种传输类型(Transport)组合使用
SNI Over TLS
gost -L sni+tls://:443 |
SNI Over Websocket
gost -L sni+ws://:443 |
TLS
TLS是GOST支持的一种传输类型(Transport)。
使用说明
标准TLS
服务端
gost -L tls://:443 |
客户端
gost -L :8080 -F tls://server_ip:443 |
多路复用TLS
GOST在TLS基础之上扩展出具有多路复用(Multiplex)特性的TLS传输类型(mtls)。
服务端
gost -L mtls://:443 |
客户端
gost -L :8080 -F mtls://server_ip:443 |
TLS证书
GOST内置了TLS证书,如果需要使用自定义TLS证书,有两种方法:
在GOST运行目录放置cert.pem(公钥)和key.pem(私钥)两个文件即可,GOST会自动加载运行目录下的cert.pem和key.pem文件。
使用key和cert参数指定证书文件路径:
gost -L="tls://:443?cert=/path/to/my/cert/file&key=/path/to/my/key/file" |
证书校验
对于客户端可以通过secure参数开启服务器证书和域名校验,默认不校验证书:
gost -L=:8080 -F="tls://server_domain_name:443?secure=true" |
当需要校验证书时,节点配置中的server_domain_name部分必须填写服务器的域名。
证书锁定
对于客户端可以通过ca参数指定CA证书进行证书锁定(Certificate Pinning):
gost -L=:8080 -F="tls://:443?ca=ca.pem" |
以上参数可以用于所有支持TLS的服务,例如HTTP2, QUIC, WSS, SSH, SOCKS5。
双向证书校验(2.11.1+)
服务端可以通过ca参数指定CA证书来对客户端证书进行强制校验:
gost -L="tls://:443?cert=certfile&key=keyfile&ca=cafile" |
此时客户端必须提供自己的证书:
gost -L=:8080 -F="tls://server_ip:443?cert=certfile&key=keyfile" |
Websocket
Websocket是GOST支持的传输类型(Transport)。
使用说明
gost -L "ws://:8080?path=/ws&rbuf=4096&wbuf=4096&compression=false" |
参数说明
path - 设置请求URI,默认值为/ws
rbuf - 接收缓冲区大小,默认值:4096
wbuf - 发送缓冲区大小,默认值:4096
compression - 是否使用压缩,默认值:false
GOST中的Websocket有四种类型:
标准Websocket
gost -L ws://:8080 |
未加密的websocket隧道。
Multiplex Websocket
gost -L mws://:8080 |
具有多路复用特性的未加密websocket隧道。
Websocket Secure
gost -L wss://:443 |
使用TLS加密的Websocket隧道。
Multiplex Websocket Secure
gost -L mwss://:443 |
具有多路复用特性并使用TLS加密的Websocket隧道。
KCP
KCP是GOST支持的一种传输类型(Transport)。
GOST对KCP的支持是基于xtaci/kcp-go和xtaci/kcptun库。
使用说明
服务端
gost -L=kcp://:8388 |
客户端
gost -L=:8080 -F=kcp://server_ip:8388 |
配置
GOST中内置了一套默认的KCP配置项,默认值与xtaci/kcptun中的一致。可以通过参数c指定外部配置文件:
gost -L=kcp://:8388?c=/path/to/conf/file |
配置文件格式:
{ |
配置文件中的参数说明请参考kcptun。
若要在代理链中使用KCP节点,则此代理链中只能有一个KCP节点,且此节点只能作为代理链的第一个节点。
Fake TCP (2.9.1+)
可以通过tcp参数或配置文件中的tcp项开启伪TCP模式。
此功能仅适用于Linux。
服务端
gost -L=kcp://:8388?tcp=true |
客户端
gost -L=:8080 -F=kcp://server_ip:8388?tcp=true |
QUIC
QUIC是GOST支持的一种传输类型(Transport)。GOST对QUIC的支持是基于lucas-clemente/quic-go库。
使用说明
服务端
gost -L=quic://:6121 |
客户端
gost -L=:8080 -F=quic://server_ip:6121 |
心跳
客户端可以通过keepalive参数开启心跳检测
gost -L=:8080 -F=quic://server_ip:6121?keepalive=true |
若要在代理链中使用QUIC节点,则此代理链中只能有一个QUIC节点,且此节点只能作为代理链的第一个节点。
SSH
SSH是GOST支持的一种传输类型(Transport)。
使用说明
服务端
gost -L=ssh://:2222 |
客户端
gost -L=:8080 -F=ssh://server_ip:2222?ping=60 |
客户端可以通过ping参数设置心跳包发送周期,单位为秒。默认不发送心跳包。
端口转发
GOST中的SSH也支持标准SSH协议的端口转发功能,具体使用方法请参考端口转发
PubKey认证 (2.11+)
服务端
gost -L="ssh://:2222?ssh_authorized_keys=/path/to/authorized_keys" |
ssh_authorized_keys - 客户端公钥列表文件
客户端
gost -L :8080 -F=ssh://server_ip:2222?ssh_key=/path/to/id_rsa" |
ssh_key - 客户端私钥文件
Simple-obfs
Simple-obfs是GOST支持的一种传输类型(Transport)。
Simple-obfs兼容shadowsocks/simple-obfs和Android上的Simple Obfuscation插件。
使用说明
obfs-http
服务端
gost -L=ss+ohttp://chacha20:123456@:8338 |
客户端
gost -L=:8080 -F=ss+ohttp://chacha20:123456@server_ip:8338?host=bing.com |
客户端可以通过host参数自定义请求Host。
obfs-tls (2.11+)
服务端
gost -L=ss+otls://chacha20:123456@:8338 |
客户端
gost -L=:8080 -F=ss+otls://chacha20:123456@server_ip:8338?host=bing.com |
客户端可以通过host参数自定义请求Host。
obfs-tls目前仅支持shadowsocks/shadowsocks-go库所支持的加密方式,不支持AEAD加密。
Obfs4
Obfs4是GOST支持的一种传输类型(Transport)。
首先要运行服务端,生成客户端访问的URL:
gost -L ss+obfs4://:18080 |
当正常启动后,会在控制台显示URL
ss+obfs4://:18080/?cert=06ss%2FlcDWVkTZLXLcRkH8tozyP0aUXmOm%2BuT5KtbkEP%2BTnCqNumFx9p218Vy0WityAM0Kg&iat-mode=0 |
然后再使用生成的参数启动客户端:
gost -L :8080 -F ss+obfs4://server_ip:18080/?cert=06ss%2FlcDWVkTZLXLcRkH8tozyP0aUXmOm%2BuT5KtbkEP%2BTnCqNumFx9p218Vy0WityAM0Kg&iat-mode=0 |
这里生成的URL不包含IP,所以如果客户端与服务端不是同一台主机,就要指定服务端的IP。
透明代理
GOST在2.3版本中增加了对TCP透明代理的支持,在2.10版本中增加了对UDP透明代理的支持。
透明代理仅支持Linux系统。
TCP
gost -L red://:12345 -F 192.168.1.1:1080 |
本地全局TCP代理:
设置iptables:
iptables -t nat -A OUTPUT -p tcp --match multiport ! --dports 12345,1080 -j DNAT --to-destination 127.0.0.1:12345 |
UDP (2.10+)
UDP透明代理是基于iptables的tproxy模块实现的。
gost -L redu://:12345?ttl=60s -F ssu://1.2.3.4:1080 |
ttl - 传输通道超时时间,默认为60s。
本地全局UDP代理
设置iptables规则
规则中的192.168.0.0/16为本机所在网络,1.2.3.4/32为转发服务端地址,请根据实际情况进行修改。
iptables -t mangle -N GOST |
设置路由表
ip rule add fwmark 1 table 100 |
端口转发
GOST从2.1版本开始增加了对端口转发的支持。
使用说明
端口转发服务节点的配置与普通的代理节点有所不同:
scheme://[bind_address]:port/[host]:hostport[,[host]:hostport]?ip=[host]:hostport][,[host]:hostport]] |
scheme - 端口转发模式, 本地端口转发: tcp, udp; 远程端口转发: rtcp, rudp; 转发隧道: tls, kcp等传输类型。
[bind_address]:port - 本地/远程绑定地址。
[host]:hostport[,[host]:hostport] - (可选, 2.6+) 目标访问地址,支持以逗号分割的多地址形式。
参数说明
ip - (可选, 2.8+) 也可以通过此参数来指定目标地址。
strategy - 指定节点选择策略,round - 轮询,random - 随机, fifo - 自上而下。默认值为round。
max_fails - (2.8.1+) 指定节点连接的最大失败次数,当与一个节点建立连接失败次数超过此设定值时,此节点会被标记为死亡节点(Dead),死亡节点不会被选择使用。默认值为1。
fail_timeout - (2.8.1+) 指定死亡节点的超时时间,当一个节点被标记为死亡节点后,在此设定的时间间隔内不会被选择使用,超过此设定时间间隔后,会再次参与节点选择。默认为30秒。
TCP本地端口转发
将本地的TCP端口A映射到指定的目标TCP端口B,所有到端口A的数据会被转发到端口B。此功能类似于SSH的本地端口转发功能。
gost -L=tcp://:2222/192.168.1.1:22 [-F=..] |
将本地TCP端口2222上的数据(通过代理链)转发到192.168.1.1:22上。
当代理链末端(最后一个-F参数)为forward+ssh类型时,GOST会直接使用SSH的本地端口转发功能:
gost -L=tcp://:2222/192.168.1.1:22 -F forward+ssh://:2222 |
服务端可以是标准的SSH程序,也可以是GOST的SSH转发模式:
gost -L forward+ssh://:2222 |
scheme必须是forward+ssh。
TCP远程端口转发
将目标TCP端口B映射到本地TCP端口A,所有到端口B上的数据会被转发到端口A。此功能类似于SSH的远程端口转发功能。
gost -L=rtcp://:2222/192.168.1.1:22 [-F=... -F=socks5://172.24.10.1:1080] |
将172.24.10.1:2222上的数据(通过代理链)转发到192.168.1.1:22上。
SOCKS5多路复用模式
在2.5版本中,SOCKS5的BIND方法增加了对多路复用的支持,远程端口转发可以利用这个特性提高传输效率。
gost -L rtcp://:8080/192.168.1.1:80 -F socks5://:1080?mbind=true |
客户端通过mbind=true参数开启SOCKS5的BIND多路复用模式。
SSH端口转发模式
当代理链末端(最后一个-F参数)为forward+ssh类型时,GOST会直接使用SSH的远程端口转发功能:
gost -L=rtcp://:2222/192.168.1.1:22 -F forward+ssh://:2222 |
服务端可以是标准的SSH程序,也可以是GOST的SSH转发模式:
gost -L forward+ssh://:2222
scheme必须是forward+ssh。
UDP本地端口转发
将本地的UDP端口A映射到指定的目标UDP端口B,所有到端口A的数据会被转发到端口B。
gost -L=udp://:5353/192.168.1.1:53?ttl=60s [-F=... -F=socks5://172.24.10.1:1080] |
将本地UDP端口5353上的数据(通过代理链)转发到192.168.1.1:53上。
每一个不同的客户端(不同的端口)对应一条转发通道,每条转发通道都有超时时间,当超过此时间且在此时间段内无任何数据交互,则此通道将关闭。 可以通过ttl参数来设置超时时间,默认值为60秒。
UDP远程端口转发
将目标UDP端口B映射到本地UDP端口A,所有到端口B上的数据会被转发到端口A。
gost -L=rudp://:5353/192.168.1.1:53?ttl=60s [-F=... -F=socks5://172.24.10.1:1080] |
将172.24.10.1:5353上的数据(通过代理链)转发到192.168.1.1:53上。
每一个不同的客户端(不同的端口)对应一条转发通道,每条转发通道都有超时时间,当超过此时间且在此时间段内无任何数据交互,则此通道将关闭。 可以通过ttl参数来设置超时时间,默认值为60秒。
转发UDP数据时,如果有代理链,则代理链的末端(最后一个-F参数)协议必须是GOST socks5类型,传输层可以任意选择。
2.10+后本地UDP端口转发也可以使用ssu进行转发。
转发隧道
在2.5版本中TCP本地端口转发可以配合传输类型一起使用:
服务端:
gost -L tls://:443/:1443 -L sni://:1443 |
对应的scheme为传输类型,协议类型必须为空。
客户端:
gost -L :8080 -F forward+tls://server_ip:443 |
对应的scheme为forward+transport格式,其中协议类型必须为forward。
使用场景
加密
gost -L tls://:443/:8080 -L http://:8080 |
将8080端口的HTTP代理服务转成443端口的HTTPS代理服务
加速
gost -L kcp://:8388/:8338 -L ss://chacha20:123456@:8338 |
将8338端口的shadowsocks代理服务转成使用KCP传输。
Relay
Relay是GOST(2.11+)支持的一种协议类型(Protocol)。
Relay协议本身不具备加密功能,如果需要对数据进行加密传输,可以配合加密隧道使用。
使用说明
Relay协议同时具有代理和转发功能,可同时处理TCP和UDP的数据,并支持用户认证。
参数说明
nodelay - true/false (默认值为false)。默认情况下relay协议会等待客户端的请求数据,当收到请求数据后会把协议头部信息与请求数据一起发给服务端。当此参数设为true后,协议头部信息会立即发给服务端,不再等待客户端的请求。
代理功能
Relay协议可以像HTTP/SOCKS5一样用作代理协议。
服务端
gost -L relay+tls://username:password@:12345 |
客户端
gost -L :8080 -F relay+tls://username:password@:12345?nodelay=false |
转发功能
Relay转发有两种模式,一种是配合端口转发使用,另一种是配合转发隧道使用。两种模式均可以同时转发TCP和UDP数据。
端口转发
服务端
gost -L relay://:12345 |
客户端
gost -L udp://:1053/:53 -L tcp://:1053/:53 -F relay://:12345 |
转发隧道
服务端
gost -L relay://:12345/:53 |
客户端
gost -L udp://:1053 -L tcp://:1053 -F relay://:12345 |
权限控制
服务端可以通过白名单whitelist参数和黑名单blacklist参数来控制客户端的请求是否允许被处理。 参数格式为: [actions]:[hosts]:[ports]
[actions]是一个由,分割的动作列表,可选值有: tcp(TCP转发), udp(UDP转发), rtcp(TCP远程转发), rudp(UDP远程转发), 或 *(所有动作)。
[hosts]是一个由,分割的Host列表,代表可以绑定到(rtcp,rudp)或转发到(tcp,udp)的目的主机,支持通配符(.google.com)和(所有主机)。
[ports]是一个由,分割的端口列表,代表可以绑定到(rtcp,rudp)或转发到(tcp,udp)的目的端口,可以是*(所有端口)。
多组权限可以通过+进行连接:
whitelist=rtcp,rudp:localhost,127.0.0.1:2222,8000-9000+udp:8.8.8.8,8.8.4.4:53(允许TCP/UDP远程端口转发绑定到localhost,127.0.0.1的2222端口和8000-9000端口范围,同时允许UDP转发到8.8.8.8:53和8.8.4.4:53)。
SSH远程端口转发只能绑定到127.0.0.1:8000
gost -L=forward+ssh://localhost:8389?whitelist=rtcp:127.0.0.1:8000 |
SOCKS5的TCP/UDP远程端口转发只允许绑定到大于1000的端口
gost -L=socks://localhost:8389?blacklist=rtcp,rudp:*:0-1000 |
SOCKS5的UDP转发只能转发到8.8.8.8:53
gost -L=socks://localhost:8389?whitelist=udp:8.8.8.8:53 |
负载均衡
节点组
一个节点组由一个或多个节点组成,每个节点可以是任意类型。 GOST代理链的每一层级都是一个节点组。
GOST在2.5版本中增加了对负载均衡的支持。负载均衡可以应用于代理链的所有层级节点。
负载均衡有两种,这里简单的称之为简单型和复杂型,两种类型可以组合使用。
简单型
简单型是一种类似于DNS负载均衡的功能,可以为代理节点指定多个地址:
gost -L=:8080 -F='http://localhost:8080?ip=192.168.1.1,192.168.1.2:8081,192.168.1.3:8082&strategy=round&max_fails=1&fail_timeout=30s' -F=socks5://localhost:1080?ip=172.20.1.1:1080,172.20.1.2:1081,172.20.1.3:1082 |
参数说明
ip - 指定实际的代理服务地址(以逗号分割的列表),地址格式可以是ip[:port]或hostname[:port],若没有指定port则默认使用URL中的port。
strategy - (2.6+) 指定节点选择策略,round - 轮询,random - 随机, fifo - 自上而下。默认值为round。
max_fails - (2.8.1+) 指定节点连接的最大失败次数,当与一个节点建立连接失败次数超过此设定值时,此节点会被标记为死亡节点(Dead),死亡节点不会被选择使用。默认值为1。
fail_timeout - (2.8.1+) 指定死亡节点的超时时间,当一个节点被标记为死亡节点后,在此设定的时间间隔内不会被选择使用,超过此设定时间间隔后,会再次参与节点选择。默认为30秒。
当设置了ip参数,URL中指定的地址将会被忽略。
当设置了peer参数(见下方说明),以上参数会被peer参数覆盖。
当为一个层级指定了多个节点,GOST会将这些节点按指定顺序放在同一个节点组中。
每次客户端发送请求,代理链会先确定一条路径,对每一个节点组执行节点选择(随机或轮询)。
相当于将上面的命令转化为:
gost -L=:8080 -F=http://192.168.1.3:8082 -F=socks5://172.20.1.2:1081 |
若地址比较多,可以使用外部配置文件:
gost -L=:8080 -F=http://localhost:8080?ip=iplist1.txt -F=socks5://localhost:1080?ip=iplist2.txt |
配置文件的格式为(按行分割的地址列表):
192.168.1.1 |
在简单型中要求每一层级的所有节点的类型和配置保持一致。
复杂型
复杂型克服了简单型中的限制,可以自由指定代理链中每一层级节点组中节点的类型。
gost -L=:8080 -F=kcp://192.168.1.1:8388?peer=peer1.txt -F=http2://172.20.1.1:443?peer=peer2.txt |
客户端通过peer参数指定额外的节点配置文件,配置文件格式为:
# strategy for node selecting |
格式说明:
strategy - 同strategy参数。
max_fails - 同max_fails参数。
fail_timeout - 同fail_timeout参数。
reload - 此配置文件支持热更新。此选项用来指定文件检查周期,默认关闭热更新。
peer - 指定节点列表。
每次客户端发送请求,代理链会确定一条路径,对每一个节点组执行节点选择(随机或轮询)。
简单型+复杂型
组合使用时,代理链会将每一层级上(通过ip和peer参数)指定的所有节点放在同一个节点组中,再对每一个节点组执行节点选择(随机或轮询),最终确定一条路径:
完整的示例配置
gost.json: |
peer.txt:
strategy random |
ips.txt:
host1[:port] |
路由控制
GOST在2.6版本中增加了路由控制功能,可以通过黑白名单来控制客户端的请求。路由控制可以应用于服务节点(-L参数)和代理链的所有层级节点(-F参数)。
gost -L=:8080?bypass=127.0.0.1,192.168.1.0/24,.example.net -F=:1080?bypass=172.10.0.0/16,localhost,*.example.com |
通过bypass参数来指定请求的目标地址列表(以逗号分割的IP,CIDR,域名或域名通配符地址)。
当执行代理链的节点选择时,每当确定一个代理链层级节点后,会应用此节点上的路由配置(bypass参数),若此次请求的目标地址包含在此配置中,则代理链终止于此节点(且不包含此节点)。
若地址比较多,可以使用外部配置文件:
gost -L :8080?bypass=bypass.txt -F :1080?bypass=bypass2.txt |
配置文件的格式为(地址列表和可选的配置项):
# options |
reload - 此配置文件支持热更新。此选项用来指定文件检查周期,默认关闭热更新。
reverse - 指定是否切换为白名单。
若要转换为白名单,则通过在bypass参数值前添加~前缀:
gost -L=:8080?bypass=~127.0.0.1,172.10.0.0/16,localhost,*.example.com,.example.org |
对于文件方式也是一样:
gost -L=:8080?bypass=~bypass.txt |
DNS解析
GOST在2.6版本中可以自定义DNS解析。DNS解析应用于服务节点。
每当节点收到请求时,会使用此节点上指定的DNS解析器对此请求的目标地址进行解析。
使用说明
gost -L=http://:8080?dns=8.8.8.8,1.1.1.1:53/tcp,1.1.1.1:853/tls,https://1.0.0.1/dns-query |
参数项
dns - 指定DNS服务列表(以逗号分割),每个DNS服务的格式为:ip[:port][/protocol],其中port默认为53,protocol可选值有:udp,udp-chain,tcp,tcp-chain,tls,tls-chain,https,https-chain。默认值为udp。
代理链(2.10.0+)
如果需要通过代理链来连接DNS服务器,则可以使用以下protocols:
udp-chain, tcp-chain, tls-chain, https-chain
gost -L=http://:8080?dns=8.8.8.8/udp-chain,1.1.1.1:853/tls-chain,https-chain://dns.google/dns-query -F=socks://:1080 |
如果要转发udp-chain,代理链的末端(最后一个-F参数)必须是GOST socks5或ssu类型代理。
配置文件
也可以使用外部文件来指定DNS服务列表:
gost -L=:8080?dns=dns.txt |
配置文件的格式为(按行分割的地址列表):
# options |
timeout - DNS请求超时时间,默认5秒。
ttl - DNS缓存有效期,默认使用DNS查询返回结果中的TTL。当设置为负值,则不使用缓存。
reload - 此配置文件支持热更新。此选项用来指定文件检查周期,默认关闭热更新。
prefer - (2.8.2+) AAAA(IPv6)优先于A(IPv4)。
ip - 2.10.1+,客户端IP,设置后会开启ECS(EDNS Client Subnet)扩展功能。
DNS服务项分为三列:
第一列为DNS服务器地址,格式为ip[:port],port默认为53.
第二列为协议类型,可选值有:udp,udp-chain,tcp,tcp-chain,tls,tls-chain,https,https-chain。 默认为udp。
第三列为DNS服务域名,当协议类型为tls,tls-chain,https,https-chain时有效,用于TLS证书校验。
自定义域名解析
除了可以自定义DNS服务用来解析域名外,还可以手动指定域名-IP映射关系,类似于Linux下的/etc/hosts文件功能。
gost -L=:8080?hosts=hosts.txt |
配置文件的格式:
# options |
reload - 此配置文件支持热更新。此选项用来指定文件检查周期,默认关闭热更新。
映射表项分为三列:
第一列为IP地址。
第二列为主机名或域名。
第三列为别名,可以有多个。
DNS代理
GOST在2.10版本中增加了DNS代理服务。
使用说明
gost -L="dns://:1053?mode=udp&dns=8.8.8.8,1.1.1.1:53/tcp,1.1.1.1:853/tls,https://1.0.0.1/dns-query" |
参数项
mode - 指定代理服务的运行模式,可选值:udp,tcp,tls,https。默认值为udp。
dns - 与DNS解析中的dns参数功能和使用方式相同。
ttl - 2.10.1+,缓存过期时间,设置负值则禁用缓存,默认使用查询结果中的过期时间。
timeout - 2.10.1+,请求超时时间,默认5s。
ip - 2.10.1+,客户端IP,设置后会开启ECS(EDNS Client Subnet)扩展功能。
TUN/TAP设备
GOST在2.9版本中增加了对TUN/TAP设备的支持。基于TUN/TAP设备可以简单的构建VPN。
Windows
Windows下需要安装tap驱动后才能使用,可以选择安装OpenVPN/tap-windows6或OpenVPN client。
TUN
使用说明
gost -L="tun://[method:[email protected]][local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tun0&mtu=1350&route=10.100.0.0/16&gw=192.168.123.1" |
method:password - 可选,指定UDP隧道数据加密方法和密码。所支持的加密方法与shadowsocks/go-shadowsocks2一致。
local_ip:port - 必须,本地监听的UDP隧道地址。
remote_ip:port - 可选,目标UDP地址。本地TUN设备收到的IP包会通过UDP转发到此地址。
net - 必须,指定TUN设备的地址。
name - 可选,指定TUN设备的名字,默认值为系统预设。
mtu - 可选,设置TUN设备的MTU值,默认值为1350。
route - 可选,逗号分割的路由列表:,例如:10.100.0.0/16,172.20.1.0/24,1.2.3.4/32
gw - 可选,设置TUN设备路由默认网关IP。
tcp - 可选,是否使用fake TCP隧道,默认false。
服务端路由(2.9.2+)
服务端可以通过设置路由表和网关,来访问客户端所在的网络。
默认网关
服务端可以通过gw参数设置默认网关,来指定route参数的路由路径。
gost -L="tun://:8421?net=192.168.123.1/24&gw=192.168.123.2&route=172.10.0.0/16,10.138.0.0/16" |
发往172.10.0.0/16和10.138.0.0/16网络的数据会通过TUN隧道转发给IP为192.168.123.2的客户端。
特定网关路由
如果要针对每个路由设置特定的网关,可以通过路由配置文件来指定:
gost -L="tun://:8421?net=192.168.123.1/24&route=route.txt" |
配置文件route.txt的格式为:
# Destination Gateway |
第一列为目标网络。
第二列为网关IP,若为空则使用gw参数设置的默认网关IP。
发往172.10.0.0/16网络的数据会通过TUN隧道转发给IP为192.168.123.2的客户端。 发往10.138.0.0/16网络的数据会通过TUN隧道转发给IP为192.168.123.3的客户端。
构建基于TUN设备的VPN (Linux)
net所指定的地址可能需要根据实际情况进行调整。
创建TUN设备并建立UDP隧道
服务端
gost -L tun://:8421?net=192.168.123.1/24 |
客户端
gost -L tun://:8421/SERVER_IP:8421?net=192.168.123.2/24 |
当以上命令运行无误后,可以通过ip addr命令来查看创建的TUN设备:
$ ip addr show tun0 |
可以通过在客户端执行ping命令来测试一下隧道是否连通:
$ ping 192.168.123.1 |
如果能ping通,说明隧道已经成功建立。
iperf3测试
服务端
$ iperf3 -s |
客户端
$ iperf3 -c 192.168.123.1 |
路由规则和防火墙设置
如果想让客户端访问到服务端的网络,还需要根据需求设置相应的路由和防火墙规则。例如可以将客户端的所有外网流量转发给服务端处理
服务端
开启IP转发并设置防火墙规则
$ sysctl -w net.ipv4.ip_forward=1 |
客户端
设置路由规则
以下操作会更改客户端的网络环境,除非你知道自己在做什么,请谨慎操作!
$ ip route add SERVER_IP/32 dev eth0 # 请根据实际情况替换SERVER_IP和eth0 |
TAP
目前不支持MacOS。
使用说明
gost -L="tap://[method:password@][local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tap0&mtu=1350&route=10.100.0.0/16&gw=192.168.123.1" |
基于TCP的TUN/TAP隧道
GOST中的TUN/TAP隧道默认是基于UDP协议进行数据传输。
如果想使用TCP传输,可以选择采用以下几种方式:
Fake TCP
Fake TCP不是标准的TCP,只是模拟了TCP协议。
此功能仅适用于Linux。
GOST中采用xtaci/tcpraw内置了对TCP的支持。通过tcp参数开启此功能。
服务端
gost -L "tun://:8421?net=192.168.123.1/24&tcp=true" |
客户端
gost -L "tun://:0/SERVER_IP:8421?net=192.168.123.2/24&tcp=true" |
代理链 (2.9.1+)
可以通过使用代理链进行转发,用法与UDP本地端口转发类似。
此方式比较灵活通用,推荐使用。
代理链的末端(最后一个-F参数)节点必须支持GOST socks5或ssu协议类型,传输层可以任意选择。
使用ssu需要2.10.1+版本。
服务端
gost -L tun://:8421?net=192.168.123.1/24" -L socks5://:1080 |
客户端
gost -L tun://:0/:8421?net=192.168.123.2/24 -F socks5://SERVER_IP:1080 |
端口转发
利用UDP端口转发配合代理链。
服务端
gost -L tun://:8421?net=192.168.123.1/24 -L socks5://:1080 |
客户端
gost -L tun://:8421/:8420?net=192.168.123.2/24 -L udp://:8420/:8421 -F socks5://server_ip:1080 |
第三方转发工具
udp2raw-tunnel。