使用gost通过一条命令同时实现内网穿透及跨境代理的方法

使用gost通过一条命令同时实现内网穿透及跨境代理的方法

2023年11月9日 2565次阅读 2条评论
clawcloud
expressvpn best vpn
privado vpn
surfshark vpn
private vpn
pia vpn
nord vpn

当我们仅有一台具备公网IP的VPS时,会因为多种需求安装、部署各种软件,总体来看,大致两个方向:一是内网穿透,二是外网代理,site-to-site或者peer-to-peer之间是一条或多条加密隧道。有没有什么方法能够最大程度降低我们的部署开销,并使得整体方案更为简洁、两端更加可维护呢?当然有,本文从采用具备隧道建立与管理、代理转发两类核心功能的工具入手,使用gost部署我们的双向隧道并实现服务的相互转发。借助gost灵活、全面的特性,我们仅使用一条命令即可达成目标。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的情况下可以分别按版本点击下载「」、「」和「」,再通过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正式版发布后后再记录分享“二合一”进阶配置方法。

同时,支持端口转发的或同时支持正、反向代理的隧道工具进行适当配置,理论上都可以仅使用一个工具就实现内网穿透和流量代理的双重目标。