大背景
大陆网络出境环境日益恶劣,很多人都利用了国内的服务器来中转流量,比如采用阿里云、腾讯云等国内 BGP 线路中转流量落地到香港 PCCW、日本 NTT 等线路,相对于直接采购一条 CN2 线路有时候成本更低。
基本上大多数人都用的最简单的 iptables 或者 socat 转发,直接将收到的包转到落地节点,本来这并没有什么问题,但自 2020 年以来,墙不断发威,SS/SSR 直连会被非常迅速的识别并封禁。尤其是上月的五中全会期间更为严重。此时,构建一条加密中转隧道就成了必要的选择。
利用GOST自建安全隧道中转加密流量实现科学上网
1、隧道中转机场的诞生
众所周知,GFW对SS/SSR流量的识别已经越来越精准,几乎是想封就封,且V2Ray也逐渐被针对,受到GFW的严重干扰,而使用IPLC/IEPL内网专线的成本太高,于是就出现了使用虚拟专线替代物理的IPLC/IEPL内网专线,通过高强度的加密和混淆,以绕过GFW的检测封锁。与此同时,常规的科学上网代理服务器与国内用户的连接速度受当地的网络环境影响比较大,速度极不稳定,而在国内入口使用BGP多线机房服务器就可以有效缓解这一难题,而且价格相较于物理专线便宜很多。其实,这种技术就类似于VPN,只不过VPN注重的是加密,而机场的隧道中转线路侧重于混淆。于是,机场的隧道中转线路就迅速走上了对抗GFW的舞台中央,而且变得越来越受欢迎。
2、什么是隧道中转?
隧道是把一种网络协议封装进另外一种网络协议进行传输的技术,而隧道中转是在用户端和终端之间建立的一种虚拟专用通道,把用户和服务器之间的通信数据通过隧道加密,以绕过GFW的检测。隧道中转技术可以使用各种安全的协议进行流量转发,如HTTP/HTTPS/HTTP2/SOCKS4(A)/SOCKS5等。隧道中转技术比普通的科学上网协议技术多了一次流量转发(增加了中转服务器,提高了成本),而且在此过程中可以对流量进行再次加密和混淆,有效缓解了GFW对SS/SSR/V2Ray代理流量的识别概率,提高了数据传输效率。
3、自建隧道转发的原理和类型
虽然隧道转发技术这么好,但是并不是每个小伙伴都会搭建,而且成本也比以前增加了不止一倍。机场所用的隧道中转线路结构原理为:用户 – [国内BGP多线服务器 – 非中国大陆地区的服务器] – 目标网站。其中,“[国内BGP多线服务器 – 非中国大陆地区的服务器]”之间的通信线路也就是我们今天所说的隧道,隧道中转比以往的科学上网代理服务增加了国内BGP多线服务器作为中转跳板,所以增加成本,但是速度和稳定性提升都很明显。
隧道中转 与 iptables 等流量转发的区别:
一般情况下,我们所接触到的中转服务器大体是使用 iptables 或者 socat 等工具,直接转发数据包(流量)到落地服务器。 在这种转发方式中,中转服务器没有对数据包进行任何操作(如加密、混淆等),仅仅将数据包原封不动地转发到落地服务器。而隧道中转服务器会对数据包进行再次处理(如加密、混淆等)。如下图所示:
使用隧道转发流量和使用iptables转发流量,谁的效率更高?据有大佬说,隧道中转流量速度更快,但我没有做实际测试对比,另外,国内环境是不建议使用 UDP 协议传输的,同时隧道中转流量的安全性要高于iptables,毕竟至少多一层加密,但需要配合混淆骗过GFW,效果会更好。
目前,关于隧道转发的实现方式主要有以下两种:
(1)TLS 加密隧道,通过 TLS 或其他加密方式,将数据包加密传输,在落地节点上解密转发到最后的出口,如 Stunnel、GOST、Brook、Ehco 等。
(2)VPN组网形式,将异地的两台机器组成一个内网,然后在内网中直接进行数据转发,此时数据会由组网工具进行加密处理,如 Zerotier、WireGuard 等。
由于VPN是特定的加密协议,特征明显,且 WireGuard 基于 UDP 协议,而中国大陆的网络环境对 UDP 协议不友好,所以我们只有选择基于 TCP 协议的 TLS 加密隧道方案。
4、一键搭建GOST隧道教程
(1)搭建GOST隧道准备工作
1)购买2台VPS服务器
一般情况下,我们选择的两台VPS,其中一台与本地网络连通性良好,另外一台与目标服务器之间的网络通畅,然后两台VPS服务器之间的网络也要通畅。如果你是要搭建中转隧道实现科学上网的话,你必须保证一台VPS服务器是在非中国大陆地区,另外一台VPS服务器在国内(优先选择BGP多线机房,至少要保证与你本地网络连通性良好)。
2)选择搭建隧道中转的工具
搭建隧道最常用的工具有Ehco、Stunnel、GOST、Brook等,我们这里选用GOST,这个是目前机场使用最多的一款安全隧道工具。
GOST是一款使用GO语言实现的安全隧道转发工具,功能非常丰富,支持多端口监听、多级转发代理、支持TCP/UDP协议方式和多种传输协议。
GOST项目地址:https://github.com/ginuerzh/gost
GOST官方文档:https://docs.ginuerzh.xyz/gost
(2)手动搭建GOST隧道教程
1)在中转服务器和落地服务器上均安装GOST并赋予权限,执行以下命令:
wget -N --no-check-certificate https://github.com/ginuerzh/gost/releases/download/v2.11.1/gost-linux-amd64-2.11.1.gz && gzip -d gost-linux-amd64-2.11.1.gz #此时你会得到一个gost-linux-amd64-2.11.1,将它命名为你喜欢的名字,比如gost mv gost-linux-amd64-2.11.1 gost chmod +x gost
由于国内服务器访问 github 的速度太慢,导致无法顺畅拉取 gost 的下载文件,所以我这里选择使用空白网络的网盘文件进行下载。执行以下命令:
wget -N --no-check-certificate https://pan.aihoom.com/Down/gost-linux-amd64-2.11.1.gz && gzip -d gost-linux-amd64-2.11.1.gz mv gost-linux-amd64-2.11.1 gost chmod +x gost
2)国内中转服务器设置:按提示把“括号和内容”改成相应的IP和端口,传输协议建议relay+tls 或者用 relay+mwss、游戏加速则socks5+tls,回车生效,服务器重启后失效(建议加入开机自启动配置);
nohup ./gost -L udp://:(本地监听公网端口) -L tcp://:(本地监听公网端口) -F relay+tls://(落地国外服务器IP):(落地gost监听端口) >> /dev/null 2>&1 &
3)国外落地服务器设置:把“括号和内容”改成相应的端口,上网工具端口为SSR/v2ray使用端口,回车生效,服务器重启后失效(建议加入开机自启动配置);
nohup ./gost -L relay+tls://:(落地gost监听端口)/127.0.0.1:(上网工具端口) >> /dev/null 2>&1 &
注意事项:如果是Gost普通端口转发,则无需在落地服务器安装GOST,只需要在中转鸡上安装GOST,执行下列命令,把“括号和内容”修改为相应的IP和端口,其余不变;
nohup ./gost -L=tcp://:(本地gost监听端口)/(落地服务器IP):(上网工具端口) -L=udp://:(本地gost监听端口)/(落地服务器IP):(上网工具端口) >> /dev/null 2>&1 &
结束或删除端口,利用Linux系统kill命令结束进程;
yum install lsof ##安装lsof命令 lsof -i:8090 ##利用lsof命令查看端口占用的进程号,此处的8090为端口号 kill -9 8888 ##此处的8888为进程PID号
由于GOST的运行机制问题,需要窗口化运行,如果我们关了SSH窗口,中转也会瞬间崩塌。我这里有以下2种方法解决这个问题(我在上述中转和落地服务器设置使用的方法2)。
1)方法一: 安装 screen 打开新窗口运行命令。直接执行 screen -S gost 命令,即可打开新窗口,然后在新窗口中执行中转服务器和落地服务器的命令。
apt install screen #Debian/Ubuntu系统 yum install screen #centos系统 screen -S gost #创建新窗口 ./gost -L ws:/080 #测试服务器端运行
2)方法二:使用 nohup 命令,实现gost隧道监听。我在设置中转和落地服务器的时候已经使用了nohup命令,但重启后仍然会失效,需要再次开启。
(3)GOST隧道一键搭建教程
在GOST隧道教程演示过程中,我们假定中国大陆境内的中转服务器IP地址为 1.1.1.1 ,非中国大陆地区的落地服务器的IP地址为 2.2.2.2 ,请知悉!另外,在自建GOST隧道中转时,请您勿将所有数据直接照搬,应先理清隧道转发逻辑后再操作。
1)使用Xshell分别远程连接国内外的两台VPS,并执行GOST一键安装脚本,执行命令如下:
wget --no-check-certificate -O gost.sh https://raw.githubusercontent.com/BlueSkyXN/EasyGost/master/gost.sh && chmod +x gost.sh && ./gost.sh
执行“gost 一键安装配置脚本”命令备用地址(以上命令执行失败时使用):
wget --no-check-certificate -O gost.sh https://raw.githubusercontent.com/CloudSolo/EasyGost/master/gost.sh && chmod +x gost.sh && ./gost.sh
注意事项:不管是在中转服务器,还是落地服务器安装GOST,均使用这个“gost 一键安装配置脚本”。
2)我们输入数字“1”,选择“1. 安装 gost”,稍等片刻,看到“gost安装成功”的提示,即安装完成。然后,执行命令“./gost.sh”,即可再次打开“gost 一键安装配置脚本”的菜单界面,此时我们选择“7. 新增gost转发配置”,输入数字“7”,回车后进入选择转发协议界面。如下图所示:
如果你是在非中国大陆地区的中转服务器上增加GOST转发配置,请选择 “[1] tcp+udp流量转发, 不加密” 或 “[2] relay+tls加密流量转发” ,即“1”表示仅使用gost普通转发,“2”表示使用隧道加密;如果你是在非中国大陆地区的落地服务器上增加GOST转发配置,那么请选择 “[3] 解密由gost传输而来的流量并转发” 。
3)中转服务器GOST转发配置
我们选择“[2] relay+tls加密流量转发”,然后输入本地监听端口(如“6666”)、落地服务器的IP地址(如“2.2.2.2”)和监听端口(如“8888”)。如下图所示:
转发过程:使用GOST隧道的“relay+tls加密”方式进行流量转发,也就是将中转服务器(如IP地址为“1.1.1.1”)的“6666”端口接收的流量转发至落地服务器(如IP地址为“2.2.2.2”)的“8888”端口。
4)落地服务器GOST转发配置
在落地服务器上执行“gost 一键安装配置脚本”,依次选择“1. 安装 gost”-“7. 新增gost转发配置”,然后输入本地监听端口(如“8888”)、转发至本地IP地址(一般输入“127.0.0.1”,本地端口转发流量)和监听端口(如“1688”,即科学上网代理服务器的本地上网端口,也就是SS/SSR/V2Ray端口),确认无误后回车。最终完成落地服务器配置,如下图所示:
转发过程:由落地服务器(如IP地址为“2.2.2.2”)的“8888”端口监听从中转服务器(如IP地址为“1.1.1.1”)的“6666”端口转发过来的流量并解密,然后将解密后的流量转发至本地服务器(即落地服务器,本地IP地址为“127.0.0.1”)的“1688”端口(即 SS/SSR/V2Ray等科学上网代理的监听端口)。
5、GOST客户端使用教程
(1)普通配置
gost -L relay+tls://username:password@:443 #加用户认证
gost -L relay+tls://:443 #不加用户认证
客户端配置:gost -L :1080 -F relay+tls:/rver_ip:443
(2)游戏配置
服务端:gost -L socks5+tls://:443
客户端配置: gost -L :1080 -F socks5+tls://server_ip:443
(3)拯救被墙 IP 配置
服务端配置 : gost -L mws:/0
客户端配置 : gost -L :1080 -F mwss:/rver_name://443
需要注意的是:你需要去 cloudflare 绑定好被墙 IP 的域名,然后客户端连接的时候 server_name 替换成域名。
(3)Shadowrocket小火箭
1)socks5 服务端配置
gost -L mws://:443
gost -L mwss://:443
gost -L mtls://:443
其中443是端口,大家可以自己去选择。客户端配置中,如果你没有加入 user:passwd 认证环节,那么只需要地址跟端口就可以了。在小火箭里面添加一个 socks5 配置。
2)SS服务端配置
如果你使用的是 SS 那么你的服务端可能是这样的
gost -L ss+mws(mws/mwss/mtls中的一个):/acha20:password@:8338
其中 chacha20 是加密 password 是密码 8338 是端口。
温馨提醒:GOST隧道中转的确很稳定,但成本也很高,个人使用非常不划算,除非你就是喜欢折腾而已。
【GOST相关知识科普】
GOST是一款使用GO语言实现的安全隧道转发工具,功能非常丰富,支持多端口监听、多级转发代理、支持TCP/UDP协议方式和多种传输协议。
GOST项目地址:https://github.com/ginuerzh/gost
GOST官方文档:https://docs.ginuerzh.xyz/gost
GOST功能特性:
- 多端口监听
- 可设置转发代理,支持多级转发(代理链)
- 支持标准HTTP/HTTPS/HTTP2/SOCKS4(A)/SOCKS5代理协议
- Web代理支持探测防御
- SOCKS5代理支持TLS协商加密
- 支持多种隧道类型
- Tunnel UDP over TCP
- 本地/远程TCP/UDP端口转发
- TCP/UDP透明代理
- 支持Shadowsocks(TCP/UDP)协议
- 支持SNI代理
- 权限控制
- 负载均衡
- 路由控制
- DNS解析和代理
- TUN/TAP设备
GOST 的配置分为两部分:协议层和传输层,且可以任意组合使用。
协议层类型:
- 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+)
传输层类型:
- 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+)
配置格式:
[scheme://][user:pass@host]:port[?param1=value1¶m2=value2]
举例说明:
(1)创建一个具有 TLS
加密的 Websocket
隧道,科学上网中最常见的用途就是用来中转 SS/SSR/V2Ray,可有效防止 GFW
的封锁
中转服务器:
gost -L=tcp://:1080 -F=wss://1.1.1.1:8080
落地服务器:
gost -L=wss://:8080/:1234
以上命令中 1.1.1.1
为落地服务器的 IP,落地服务器 SS/SSR/V2Ray 服务端监听 1234
端口。用户只需要用 SSR 客户端连接中转服务器 1080
端口即可,所有 SSR 流量将会通过 WSS
隧道转发到国外落地服务器。
(2)创建一个监听在 8080
端口,使用 Websocket
作为传输方式的 Shadowsocks
代理服务
gost -L=ss+ws://aes-128-gcm:password@:8080?path=/proxy
该代理兼容 Shadowsocks
+ v2ray-plugin
(关闭 mux,即设置 mux=0),以及 v2ray
的 Shadowsocks
+ Websocket
模式,而且可以部署在 Nginx/Caddy
等 HTTP
服务器后面,以达到伪装的效果,并将 TLS
加解密的工作交给 HTTP
服务器。