gost代理转发
在GOST中,GOST与其他代理服务都被看作是代理节点,GOST可以自己处理请求,或者将请求转发给任意一个或多个代理节点。
下载地址
https://github.com/ginuerzh/gost/releases
https://github.com/ginuerzh/gost/releases/download/v2.11.5/gost-linux-amd64-2.11.5.gz
开启代理服务
[root@vm ~]# gzip -d gost-linux-amd64-2.11.5.gz
[root@vm ~]# chmod +x gost-linux-amd64
[root@vm ~]# ls
gost-linux-amd64 nginx-1.20.2 nginx-1.20.2.tar.gz ngx_http_proxy_connect_module
[root@vm ~]# mv gost-linux-amd64 /usr/local/bin/gost
[root@vm ~]# gost -V
gost 2.11.5 (go1.19.2 linux/amd64)
[root@vm ~]# gost -L :80 #对于-L参数,协议层默认为是HTTP & SOCKS5
#nohup gost -L=admin:123456@0.0.0.0:3456 > ./gost.log &
流程如下
[root@vm ~]# vim /usr/lib/systemd/system/gost.service
[Unit]
Description=gost
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Type=simple
User=root
DynamicUser=true
ExecStart=/usr/local/bin/gost -L :80
[Install]
WantedBy=multi-user.target
[root@vm ~]# systemctl enable gost --now
[root@iZwz95d8h70xu0k6l86c9oZ ~]# ps -ef |grep gost
root 18879 1 1 13:40 ? 00:00:00 /usr/local/bin/gost -L :80
root 18883 1492 0 13:40 pts/0 00:00:00 grep --color=auto gost
[root@vm ~]# ss -antup | grep gost
tcp LISTEN 0 128 [::]:80 [::]:* users:(("gost",pid=18879,fd=6))
#指定代理服务器,访问
[root@vm2 ~]# curl -I http://www.baidu.com/ -v -x 10.1.0.11:80
一个GOST服务或节点被分为两层,数据处理层和数据通道层,每一层分别对应一种网络协议。两层之间相互独立,并可以任意组合使用(除了有部分限制)。
数据处理
数据处理分为代理和转发两种类型。详细见官网吧
https://v2.gost.run/getting-started/
https://gost.run/getting-started/quick-start/
代理
- http - HTTP协议
- http2 - HTTP2协议
- socks4 - SOCKS4/SOCKS4A协议
- socks,socks5 - SOCKS5协议
- ss - Shadowsocks协议
- ssu - Shadowsocks UDP relay协议
- sni - SNI
- relay - Relay协议
转发
- tcp - TCP端口转发
- udp - UDP端口转发
- rtcp - TCP远程端口转发
- rudp - UDP远程端口转发
数据通道
数据通道用于承载代理或转发协议数据,目前支持的数据通道协议有很多:
tcp - 原始TCP协议
udp - 原始UDP协议
tls - TLS协议
GOST目前有以下几个参数项:
-L - 指定本地服务配置,可设置多个。 协议层默认为是HTTP & SOCKS5
-F - 指定转发服务配置,可设置多个,构成转发链。
-C - 指定外部配置文件。
-D - 开启Debug模式,更详细的日志输出。
-V - 查看版本,显示当前运行的gost版本号。
转发代理
gost -L :8080 -F 10.1.0.1:8081
#监听在8080端口的HTTP/SOCKS5代理服务,使用10.1.0.1:8081作为上级代理进行转发。
多级转发代理
gost -L=:8080 -F=quic://10.1.0.1:8081 -F=socks5+wss://10.1.0.2:8082 -F=http2:N...
GOST按照-F设置的顺序通过代理链将请求最终转发给最后一个
实验环境准备
os1 10.2.0.11
os2 10.2.0.12
os3 172.17.0.2
vm 192.168.56.10(能连通os1-3)
[root@vm ~]# curl 10.2.0.11
os1
[root@vm ~]# curl 10.2.0.12
os2
[root@vm ~]# curl 172.17.0.2
os3
实验测试
端口转发 tcp/udp
一对一转发
gost -L tcp://:8080/:80 #将本地的TCP端口8080映射到本地的80端口
[root@os1 /]# gost -L tcp://:8080/:80
[root@vm ~]# curl 10.2.0.11:8080
os1
[root@os1 /]# gost -L=tcp://:8080/10.2.0.12:80 #映射到别的地址端口
[root@vm ~]# curl 10.2.0.11:8080
os2
一对多转发
gost -L tcp://:8080/10.2.0.11:80,10.2.0.12:80?strategy=round&maxFails=1&failTimeout=30s
[root@os1 /]# gost -L tcp://:8080/10.2.0.11:80,10.2.0.12:80?strategy=round
[root@vm ~]# for i in {1..10};do curl 10.2.0.11:8080 ;done
os1
os2
os1
os2
转发链
#将本地的TCP端口8080通过转发链1080映射到10.2.0.11的80端口。
gost -L=tcp://:8080/10.2.0.11:80 -F socks5://192.168.56.10:1080
[root@vm ~]# gost -L :1080
[root@os3 /]# gost -L=tcp://:8080/10.2.0.11:80 -F socks5://192.168.56.10:1080
[root@vm ~]# curl 172.17.0.2:8080
os1
带验证的http代理
[root@vm ~]# gost -L http://gost:gost@:8443
[root@os3 /]# curl -v -x 192.168.56.10:8443 http://10.2.0.12
...
< HTTP/1.1 407 Proxy Authentication Required
[root@os3 /]# curl -x 192.168.56.10:8443 -U gost:gost http://10.2.0.12
os2
带验证的socks代理
[root@vm ~]# gost -L socks5://gost:gost@:8443
[root@os3 /]# curl --socks5 gost:gost@192.168.56.10:8443 http://10.2.0.11
os1
代理上网
#国外某机 10.2.0.11
[root@os1 /]# gost -L ss+mwss://user:123456@:443
#国内某机 192.168.56.10 能通10.2.0.11
[root@vm ~]# gost -L :1080 -F ss+mwss://user:123456@10.2.0.11:443
#本机 172.17.0.2 只能通192.168.56.10
[root@os3 /]# curl http://10.2.0.12
curl: (7) Failed connect to 10.2.0.12:80; Connection timed out
#访问国外某网
[root@os3 /]# curl -x 192.168.56.10:1080 http://10.2.0.12 #指定代理192.168.56.10:1080
os2
ssh转发
#TCP端口转发可以借助于标准SSH协议的端口转发功能进行间接转发
[root@os2 /]# gost -L=sshd://user:123456@:2222
[root@vm ~]# gost -L=tcp://:8080/10.2.0.12:22 -F sshd://user:123456@10.2.0.12:2222
[root@os3 /]# ssh 192.168.56.10 -p 8080
[root@os2 ~]# hostname
os2
远程端口转发
感觉跟普通转发一样
#所有到本地8080端口的数据会被转发到192.168.1.1:80。
gost -L rtcp://:8080/10.2.0.11:80
gost -L rudp://:10053/192.168.1.1:53,192.168.1.2:53,192.168.1.3:53?ttl=5s
[root@vm ~]# gost -L rtcp://:8080/10.2.0.11:80
[root@os3 /]# curl 192.168.56.10:8080
os1
远程转发链
#监听8080端口。当收到请求后再通过转发链将数据转发给rtcp服务,rtcp服务再将请求转发到192.168.1.1:80端口
gost -L=rtcp://:8080/192.168.1.1:80 -F socks5://192.168.1.2:1080