Skip to content

Instantly share code, notes, and snippets.

@rinex20
Last active May 17, 2022 15:27
Show Gist options
  • Save rinex20/4ca38419b09e3daa8eb21b9cb60d55d6 to your computer and use it in GitHub Desktop.
Save rinex20/4ca38419b09e3daa8eb21b9cb60d55d6 to your computer and use it in GitHub Desktop.
Gost应用--Tun/Tap篇

GOST tun/tap 应用指南

准备工作

  1. 需要有一台VPS作为服务端,Linux发行版都可以,没特别要求,但是要确认支持tun/tap驱动,至于如何确认,后面会讲到。
  2. Windows和Linux/Mac上都可以运行客户端。其中tap模式,不支持Mac。

工作原理

以tun模式为例。 服务端运行后,创建P2P的tun网卡,IP为10.168.10.1. 客户端运行后,创建P2P的tun网卡,IP为10.168.10.x

此时,可以在客户端,ping通网关10.168.10.1,也可以ping通其他客户端10.168.10.x

以上使用的V3 beta 2版本。参考指南为 gost v2 guide 不过,按照官方的模式,一般跑下来,只有1MB的速度,本文有改进。

安装步骤-服务端

下载gost

下载gost, 参考 官方指南

下载得到的文件名为:gost-freebsd-amd64-3.0.0-beta.2.gz ,

解压:sudo gunzip -d gost-freebsd-amd64-3.0.0-beta.2.gz

加运行权限:sudo chmod +x gost-freebsd-amd64-3.0.0-beta.2

把gost移到系统目录:sudo mv gost-freebsd-amd64-3.0.0-beta.2 /usr/local/bin/gost

此时输入以下命令确认版本: gost -V

如果返回正确的版本号,说明安装正确。

配置

配置文件夹

配置文件建议放在gost要求的目录下,我这里放在 /etc/gost下。

首先,创建文件夹 sudo mkdir /etc/gost

配置文件

配置文件,这里建议用yaml格式。

gost可以把命令生成为yaml格式,这里示例如下: 参考 官方指南

命令行创建服务端如下: sudo gost -L="tun://:8421?net=10.168.10.1/24&gw=10.168.10.1&route=10.168.10.0/24"

把该命令生成yaml文件:

sudo gost -L="tun://:8421?name=gost0&net=10.168.10.1/24&gw=10.168.10.1&route=10.168.10.0/24" -O yaml >>/etc/gost/gost.yaml

此时,会在/etc/gost目录下创建一个gost.yaml文件,内容如下:

# /etc/gost/gost.yaml
services:
- name: service-0
  addr: :8421
  handler:
    type: tun
    metadata:
      gw: 10.168.10.1
      name: gost0
      net: 10.168.10.1/24
      route: 10.168.10.0/24
  listener:
    type: tun
    metadata:
      gw: 10.168.10.1
      name: gost0
      net: 10.168.10.1/24
      route: 10.168.10.0/24

如果需要修改该文件,输入命令打开进行修改: sudo vim /etc/gost/gost.yaml

注意,这里的端口号8421,记得在防火墙打开,tcp和udp都打开。 也可以改为其他端口号,同样的防火墙打开就好了。

启动服务systemd

创建用于启动gost的服务

把以下拷贝粘贴到命令行运行即可。

cat > /etc/systemd/system/gost.service <<EOF
[Unit]
Description=Gost tun private network
After=network.target network-online.target nss-lookup.target
[Service]
Type=simple
StandardError=journal
ExecStart=/usr/local/bin/gost -C /etc/gost/gost.yaml
Restart=on-failure
RestartSec=3s
[Install]
WantedBy=multi-user.target
EOF

启动gost

启动gost sudo systemctl start gost

开启系统自动启动 sudo systemctl enable gost

确认开启的状态 sudo systemctl status gost

安装-客户端

以Windows 10为例。

Tun/Tap驱动

Windows下依赖于Tun/Tap驱动,这里我们安装OpenVPN开发的Tun/Tap驱动。

Tun/Tap驱动下载找到自己对应的版本进行安装。

安装完以后,会在本机网络适配器列表中,出现属性为 TAP Windows Adapter V9的适配器,修改适配器名称为“gost-Tun”。

下载gost

Gost下载页面,下载amd64版本的gost文件,解压然后得到gost.exe文件。 把gost.exe文件放在C:\gost目录下,gost.exe的完整路径为 c:\gost\gost.exe

命令行启动gost

然后,在c:\gost目录下,创建一个文件为 startgost.bat 编辑c:\gost\startgost.bat文件,输入:

start gost.exe -L "tun://:8421/SERVER_IP:8421?net=10.168.10.2/24&name=gost-tap&gw=10.168.10.1&route=10.168.10.0/24" 

配置文件启动

创建一个配置文件为 c:\gost\gost.yaml 编辑,输入:

# c:\gost\gost.yaml
services:
- name: service-tun
  addr: :8421
  handler:
    type: tun
    metadata:
      gw: 10.168.10.1
      name: gost-tap
      net: 10.168.10.2/24
      route: 10.168.10.0/24
  listener:
    type: tun
    metadata:
      gw: 10.168.10.1
      name: gost-tap
      net: 10.168.10.2/24
      route: 10.168.10.0/24
  forwarder:
    targets:
    - SERVER_IP:8421

如果是配置文件启动,则 c:\gost\startgost.bat 内容如下: start gost.exe

启动gost

右键点击左下角 “开始” 按钮,打开管理员模式的cmd或者powershell,

然后输入回车运行 c:\gost\startgost.bat

然后另外打开一个cmd或者powershell,输入 ping 10.168.10.1 -n 3

正常应该是这样:

正在 Ping 10.168.10.1 具有 32 字节的数据:
来自 10.168.10.1 的回复: 字节=32 时间=7ms TTL=64
来自 10.168.10.1 的回复: 字节=32 时间=10ms TTL=64
来自 10.168.10.1 的回复: 字节=32 时间=9ms TTL=64
来自 10.168.10.1 的回复: 字节=32 时间=9ms TTL=64

10.168.10.1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 7ms,最长 = 10ms,平均 = 8ms

Tun/Tap配置优化

以上配置,客户端和服务端,客户端和客户端之间已经基本可以通讯,但是经过测试,性能不佳。 一般最多也就是2-5MB,跑不满。

基本的做法是在客户端和服务端之间,增加Relay协议。 目前经过测试,可以使用以下几种搭配: Relay+mtls,Relay+mwss,Socks5+tls协议。

同时,我们在这里将会增加用户名鉴权。

服务端

我们以Relay+mtls为例。修改服务端配置文件 gost.yaml

services:
- name: service-0
  addr: 127.0.0.1:7501
  handler:
    type: tun
    metadata:
      gw: 10.168.10.1
      name: gost0
      net: 10.168.10.1/24
      route: 10.168.10.0/24
  listener:
    type: tun
    metadata:
      gw: 10.168.10.1
      name: gost0
      net: 10.168.10.1/24
      route: 10.168.10.0/24
- name: service-mtls-tun
  addr: :8421
  handler:
    type: relay
    auth:
      username: gost
      password: "gost.123456"
    metadata:
      cert: /etc/keyfile/fullchain.pem
      key: /etc/keyfile/privkey.pem     
      bind: "true"
  listener:
    type: mtls
    metadata:
      cert: /etc/keyfile/fullchain.pem
      key: /etc/keyfile/privkey.pem     
      bind: "true"

注意:以上证书需要根据路径配置,也可以删除证书配置,使用gost自签名的证书。

然后重启gost服务 sudo systemctl restart gost

客户端优化

客户端同样优化gost.yaml文件。

优化后如下:

services:
- name: service-tun
  addr: :8421
  handler:
    type: tun
    chain: chain-tun
    metadata:
      gw: 10.168.10.1
      name: gost-tap
      net: 10.168.10.2/24
      route: 10.168.10.0/24
  listener:
    type: tun
    metadata:
      gw: 10.168.10.1
      name: gost-tap
      net: 10.168.10.2/24
      route: 10.168.10.0/24
  forwarder:
    targets:
    - 127.0.0.1:7501
- name: chain-tun
  hops:
  - name: hop-0
    nodes:
    - name: node-0
      addr: SERVER_IP:8421
      connector:
        type: relay
        auth:
          username: gost
          password: "gost.123456"
      dialer:
        type: mtls 

以上,配置完全结束。

Windows开机自动启动

Windows开机自动启动gost,可以借助“任务计划程序”。

iPerf3测速

服务端开启iperf3

输入 iperf3 -s 开启

客户端打开iperf3

输入 iperf3 -c 10.168.10.1 即可。

Connecting to host 10.168.10.1, port 5201
[  4] local 10.168.10.3 port 65300 connected to 10.168.10.1 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.01   sec  5.75 MBytes  48.0 Mbits/sec
[  4]   1.01-2.01   sec  5.50 MBytes  46.1 Mbits/sec
[  4]   2.01-3.00   sec  5.88 MBytes  49.4 Mbits/sec
[  4]   3.00-4.02   sec  5.88 MBytes  48.7 Mbits/sec
[  4]   4.02-5.00   sec  6.50 MBytes  55.2 Mbits/sec
[  4]   5.00-6.01   sec  5.50 MBytes  45.9 Mbits/sec
[  4]   6.01-7.00   sec  4.75 MBytes  40.1 Mbits/sec
[  4]   7.00-8.01   sec  4.75 MBytes  39.4 Mbits/sec
[  4]   8.01-9.01   sec  5.75 MBytes  48.4 Mbits/sec
[  4]   9.01-10.00  sec  4.62 MBytes  39.0 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec  54.9 MBytes  46.0 Mbits/sec                  sender
[  4]   0.00-10.00  sec  54.9 MBytes  46.0 Mbits/sec                  receiver

iperf Done.

在办公室测试,因为已经开了一级nat,所以速度有所下降,不过这个已经很不错了。

Linux客户端

Linux下安装比较简单,步骤和前面Linux服务端安装差不多。 只是配置文件 /etc/gost/gost.yaml 用和Windows下配置文件一样。 如下:

# /etc/gost/gost.yaml
services:
- name: service-tun
  addr: :8421
  handler:
    type: tun
    chain: chain-tun
    metadata:
      gw: 10.168.10.1
      name: gost-tap
      net: 10.168.10.2/24
      route: 10.168.10.0/24
  listener:
    type: tun
    metadata:
      gw: 10.168.10.1
      name: gost-tap
      net: 10.168.10.2/24
      route: 10.168.10.0/24
  forwarder:
    targets:
    - 127.0.0.1:7501
- name: chain-tun
  hops:
  - name: hop-0
    nodes:
    - name: node-0
      addr: SERVER_IP:8421
      connector:
        type: relay
        auth:
          username: gost
          password: "gost.123456"
      dialer:
        type: mtls 

然后启动gost服务 sudo systemctl start gost

并启用服务 sudo systemctl enable gost

Mac客户端

待续。。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment