当我们仅有一台具备公网IP的VPS时,会因为多种需求安装、部署各种软件,总体来看,大致两个方向:一是内网穿透,二是外网代理,site-to-site或者peer-to-peer之间是一条或多条加密隧道。有没有什么方法能够最大程度降低我们的部署开销,并使得整体方案更为简洁、两端更加可维护呢?当然有,本文从采用具备隧道建立与管理、代理转发两类核心功能的工具入手,使用gost部署我们的双向隧道并实现服务的相互转发。借助gost灵活、全面的特性,我们仅使用一条命令即可达成目标。gost v3的详细用法见「gost v3项目仓库」。
1.先决条件与假设环境
1.1 先决条件
- 一台具有公网IP地址的VPS
- VPS作为服务端开放了入站80、8080端口
- 如需通过域名访问内网服务,需添加DNS A记录,名称随意、内容/值为VPS公共P地址
1.2 假设
以下为本文部署环境的假设,使用处不做说明。
- VPS的ip地址为22.33.44.55
- 在gost程序文件所在目录运行gost,未添加path
- 客户端开放了入站1080、8096端口,1080端口提供socks5转发服务、8096端口提供媒体服务
2.配置
首先在服务端(VPS)及客户端(本地主机)上下载、解压gost 3.0 rc10。以下为从Github下载、解压的指令。无法连接github的情况下可以分别按版本点击下载「windows amd64」、「Linux amd64」和「Linux arm64」,再通过sftp上传至服务端。
#linux amd64版本 wget https://github.com/go-gost/gost/releases/download/v3.0.0-rc10/gost_3.0.0-rc10_linux_amd64.tar.gz tar zxvf gost_3.0.0-rc10_linux_amd64.tar.gz #linux arm64版本 wget https://github.com/go-gost/gost/releases/download/v3.0.0-rc10/gost_3.0.0-rc10_linux_arm64.tar.gz tar zxvf gost_3.0.0-rc10_linux_arm64.tar.gz
接下来,在服务端运行如下一条命令。
./gost -L relay+wss://:8080?bind=true #Windows下命令相同,仅路径分隔符不同 .\gost -L relay+wss://:8080?bind=true
客户端(Linux或Windows)使用如下一条命令后,愉快地去测试吧。
./gost -L socks5://:1080?udp=true -L rtcp://:80/:8096 -F relay+wss://22.33.44.55:8080 #Windows下命令相同,仅路径分隔符不同 .\gost -L socks5://:1080?udp=true -L rtcp://:80/:8096 -F relay+wss://22.33.44.55:8080
以上配置中,采用的Websocket Secure隧道相对中庸,并不是速度导向的,如果需要充分利用带宽,可替换为kcp协议。本配置方案兼容gost2,在使用relay协议并应用隧道时,需要开启bind,在服务端开启bind的前提下,客户端配置可省略服务端IP。
3.开机自启动与管理
Linux系统下,可以通过systemd守护并管理gost服务单元。本文示例服务端配置文件/etc/systemd/system/dualtunnel.service内容如下:
[Unit] Description=A dual-tunnel by gost After=network.target [Service] Type=simple ExecStart=</path/to/yourgost> -L relay+wss://:8080?bind=true Restart=on-failure RestartSec=10s [Install] WantedBy=multi-user.target
客户端配置文件/etc/systemd/system/dualtunnel.service内容如下:
[Unit] Description=A dual-tunnel by gost After=network.target [Service] Type=simple ExecStart=<path/to/yourgost> -L socks5://:1080?udp=true -L rtcp://:80/:8096 -F relay+wss://22.33.44.55:8080 RestartSec=10s [Install] WantedBy=multi-user.target
通过nano或vi/vim编辑、保存好dualtunnel.service文件后,顺序使用systemctl命令完成开机自启动、启动、状态查看等工作。
systemctl daemon-reload systemctl enable dualtunnel.service systemctl start dualtunnel.service #查看服务状态 systemctl status dualtunnel.service
Windows客户端可使用sc命令(需要管理员权限)将gost注册、添加为系统服务。
sc create gost binpath= "<path/to/gost> -L socks5://:1080?udp=true -L rtcp://:80/:8096 -F relay+wss://22.33.44.55:8080" start= auto #对应删除服务命令 sc delete gost
4.后续
以上配置方式并非利用了gost v3版本的特性,使用v2版本同样可以实现。尽管达成了目标,但可以看到实际控制都是在客户端完成的,这显然不够规范严谨,具有公网IP地址的服务端在这样的配置案例中理应拥有更多的控制,包括隧道建立、路由、管理等方面。gost实际依托于扩展的端口转发功能实现了内网穿透隧道的建立,新的gost v3进一步加强了内网穿透方面的功能,待其3.0正式版发布后后再记录分享“二合一”进阶配置方法。
同时,支持端口转发的或同时支持正、反向代理的隧道工具进行适当配置,理论上都可以仅使用一个工具就实现内网穿透和流量代理的双重目标。
文章评论
老E您好,有幸拜讀你的gost 設定指引,尤其是用命令行直接運行以及創建service的兩種方法對比,解決了我的疑惑。請教你一下,按你的經驗,如果客戶端在 國內, VPS在國外,這樣子用這個ghost的操作,會不會有問題? 或者說這種從國外反代到國內的情況,你推薦gost還是其他的逆向方法嗎?謝謝
@Charles Wong 回国流量不在于协议、工具,方向敏感,你可以考虑反向shell的方式