gost 初级用法

文章目录
[隐藏]
本文最后更新于 2020年12月21日 15:48 可能会因为没有更新而失效。如已失效或需要修正,请留言

gost GitHub:

https://github.com/ginuerzh/gost

下载gost

wget 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
mv gost-linux-amd64-2.11.1 gost
chmod +x gost

直接转发

./gost -L=tcp://:监听的IP/目标服务器域名或IP:目标服务器端口

以上转发类似iptables的转发。

下面为加密转发,gost自带tls证书。

加密转发

TLS 加密方式:

中转机:

./gost -L=tcp://:443 -F=forward+tls://落地机的域名或IP:端口

落地机:

./gost -L=tls://:443/127.0.0.1:本地服务的端口

wss 加密方式:

中转机:

./gost -L=tcp://:443 -F=forward+wss://落地机的域名或IP:端口

落地机:

./gost -L=wss://:443/127.0.0.1:本地服务的端口

使用 shadowsocks

直接运行 shadowsocks

./gost -L=ss://chacha20:password@:8338

之后直接使用shadowsocks的客户端连接就能使用。

Shadowsocks Over TLS:

./gost -L ss+tls://chacha20:123456@:8338

Shadowsocks Over WSS:

./gost -L ss+wss://chacha20:123456@:8338

Shadowsocks Over KCP:

./gost -L ss+kcp://chacha20:123456@:8338

运行原版 shadowsocks 并加密转发

中转机IP为1.1.1.1,落地机IP为2.2.2.2,均使用443端口。shadowsocks 运行在落地机的 8338 端口。

中转机:

./gost -L=tcp://:443 -F=forward+wss://2.2.2.2:443

落地机:

./gost -L=ss://chacha20:password@:8338
./gost -L=wss://:443/127.0.0.1:8338

shadowsocks 客户端连接 1.1.1.1 的IP,443的端口,加上加密方式及密码即可成功连接。

以上端口可随意指定,不是一定要用443。当然最好也是用443。

gost 使用自定义的SSL证书

使用 gost 自带的 tls 证书虽然很方便,但是存在安全隐患(详见:为什么Gost默认TLS隧道不安全)。

我们最好使用自己域名的证书。

操作起来略微有点麻烦,具体的步骤为:申请证书——转换证书——启用证书

申请证书

使用 acme.sh 脚本申请 SSL证书 是最好的方式。

安装 acme.sh:

curl https://get.acme.sh | sh

这条命令主要做了2件事情:

1、把 acme.sh 安装到你的用户目录下(比如你用 root 执行安装,就会在 /root/.acme.sh);

2、自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.

获取证书:

获取证书有很多种方式。这里我们选择合适 gost 的方式,即只需要获取证书。

有公网IP的VPS:

/root/.acme.sh/acme.sh --issue -d example.com --standalone

没有公网IP的 nat vps

/root/.acme.sh/acme.sh --issue -d example.com --standalone --httpport 88

–httpport 指定端口申请 SSL证书

或者,用 手动dns 的方式, 手动在域名上添加一条 txt 解析记录来获取证书:

/root/.acme.sh/acme.sh --issue -d example.com --dns \
 --yes-I-know-dns-manual-mode-enough-go-ahead-please

之后会出现提示,让你在域名解析那里添加 txt解析。

添加后继续执行:

/root/.acme.sh/acme.sh --renew -d example.com \
  --yes-I-know-dns-manual-mode-enough-go-ahead-please

如果 nat vps 指定了端口仍然申请不了证书,则使用 API 的方式,这里用 cloudflare 做演示。

cloudflare API 分两种方式:使用 Global API Key 或 API Token。一般推荐用 API Token,更安全。

API Token:

export CF_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Account_ID="xxxxxxxxxxxxx"
export CF_Zone_ID="xxxxxxxxxxxxx"

Token、Account ID、Zone ID的获取请看 使用CloudFlare做DDNS解析(API Token)

Account ID、Zone ID都是在一个地方查看。

注意这里API Token的权限应为:

cloudflare

Global API Key:

export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"

export CF_Email="[email protected]"

CF_Key 就是 Global API Key,CF_Email 就是你 cloudflare 的用户邮箱,如果不懂请见之前的文章:

使用CloudFlare做DDNS解析

选用上面其中一种方式并执行后,开始用 API 申请证书:

/root/.acme.sh/acme.sh --issue -d example.com --dns dns_cf --httpport 88

稍等片刻,证书就申请好了!

——————————-更多 acme.sh 的用法详见 Github

转换证书

申请的证书在 /root/.acme.sh 目录下,我们 copy 到 gost 所在的目录 /root,比如域名为 abc.com:

cp /root/.acme.sh/abc.com/abc.cer /root/
cp /root/.acme.sh/abc.com/abc.key /root/

将cer、key 两个证书转换成 pem 格式:

openssl x509 -in abc.cer -out cert.pem
openssl rsa -in abc.key -out key.pem

如果你的 key 文件是 EC 格式的,执行:

openssl ec -in abc.key -out key.pem

其他格式的以此类推。

启用证书

此时,gost 所在的目录已经有 cert.pem、key.pem 两个文件了,启动 gost,gost 就会自动使用证书。

如前面的例子,服务端执行:

./gost -L=wss://:443/127.0.0.1:8338

或者 如果有多个证书,可以直接指定证书位置来运行:

./gost -L="wss://:443/127.0.0.1:8338?cert=/root/cert.pem&key=/root/key.pem"

之后再将 cert.pem、key.pem 传输到 gost 的客户端。

gost 的客户端执行:

./gost -L=tcp://:443 -F="forward+wss://abc.com:443?secure=true&ca=/root/cert.pem"

secure=true  指定了必须验证证书。

ca=$PATH  锁定了证书,服务端传回的证书必须是它,否则断开连接。

上面是单向的证书认证,下面是更安全的双向证书认证。

启用双向证书校验

服务端:

./gost -L="wss://:443/127.0.0.1:8338?cert=/root/cert.pem&key=/root/key.pem&ca=/root/ca.pem"

客户端:

./gost -L=tcp://:443 -F="forward+wss://abc.com:443?cert=/root/cert.pem&key=/root/key.pem"

如果是通过 acme.sh 脚本申请的证书,可在 /root/.acme.sh/abc.com 下面找到 ca.cer,这个就是ca证书,复制过来转换成pem即可。

开启双向证书认证后,只要有一方的证书不对就无法建立连接。

如客户端使用自带或其他域名的证书,服务端就会提示:

tls: client didn't provide a certificate

OK,这样 gost 就用我们的域名证书跑起来了。

唯一的问题是3个月换一次证书???

 

gost 以配置文件方式运行

gost -C gost.json

配置文件为标准json格式:

{
    "Debug": true,
    "Retries": 0,
    "ServeNodes": [
        ":8080",
        "ss://chacha20:12345678@:8338"
    ],
    "ChainNodes": [
        "http://192.168.1.1:8080",
        "https://10.0.2.1:443"
    ],
    "Routes": [
        {
            "Retries": 1,
            "ServeNodes": [
                "ws://:1443"
            ],
            "ChainNodes": [
                "socks://:192.168.1.1:1080"
            ]
        },
        {
            "Retries": 3,
            "ServeNodes": [
                "quic://:443"
            ]
        }
    ]
}
  • Debug – 对应命令行参数-D。(2.4+)
  • Retries – 通过代理链建立连接失败后的重试次数。(2.5+)
  • ServeNodes – 必须项,等同于命令行参数-L。
  • ChainNodes – 等同于命令行参数-F。
  • Routes – 可选参数,额外的服务列表,每一项都拥有独立的转发链。(2.5+)

比如

./gost -L=wss://:443/127.0.0.1:8338

配置文件可以写成:

{
    "Debug": false,
    "Retries": 0,
    "ServeNodes": [
        "wss://:443/127.0.0.1:8338"
    ]
}

之后执行:

/root/gost -C /root/gost.config

就能运行了

gost 开机启动

创建 /etc/systemd/system/gost.service 文件:

vim /etc/systemd/system/gost.service

输入以下内容:

[Unit]
Description=gost daemon
After=network.target
Wants=network.target

[Service]
Type=simple
WorkingDirectory=/root
ExecStart=/root/gost -C /root/gost.config
Restart= always
RestartSec=1min
ExecStop=/usr/bin/killall gost

[Install]
WantedBy=multi-user.target

ExecStart  gost 的启动命令,记得用绝对路径
WorkingDirectory  指定 gost 的工作目录,使 gost 能读取目录下的SSL证书

之后,如果这个 gost.service 有修改的话,需要执行刷新才能生效:

systemctl daemon-reload

设置开机启动:

systemctl enable gost

这样Linux重启,gost 也会跟着跑起来。

以后也能通过 systemctl 命令来控制 gost,如:

systemctl start gost

systemctl stop gost

或者用 service 命令:

service gost start

service gost stop

更多用法详见 gost 的GitHub。gost 远远不止这些用途。


openwrt 运行 gost

https://github.com/ginuerzh/gost/releases 下载对应的版本,这里以 斐讯N1 为例,下载 gost-linux-armv8-2.11.1.gz。

下载后通过 web 上传到 openwrt。如果需要使用到证书,也一起传进去。

cd /tmp/upload/
gzip -d gost-linux-armv8-2.11.1.gz
mv gost-linux-armv8-2.11.1 gost
chmod +x gost
mkdir /etc/gost
cp gost cert.pem key.pem /etc/gost/
ln -sv /etc/gost/gost /sbin/gost
nano /etc/init.d/gost
#!/bin/sh /etc/rc.common
START=99
STOP=15 
  
start() {  
   /sbin/gost gost命令
}  
  
stop() {  
        killall $0
}
chmod +x /etc/init.d/gost
/etc/init.d/gost enable

启用

方式1:打开openwrt 的 Web页面, 找到启动项,在里面找到gost,点击启动即可
方式2:重启openwrt即可

参考自:openwrt进程启动项

打赏
欢迎转载,请注明出处:轻时代 » gost 初级用法

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    大佬,感谢大佬教学 就还有两个问题想请教下
    第一个,双向证书验证的ca.pem是用什么生成的,还说是就是cert.pem改个名字?
    第二个,本地转发一条数据 可能为tcp 可能为udp 用socks5还是用ssh?

    1122332年前 (2021-12-24)回复
  2. #2

    openwrt x86_64应该下载哪个版本?

    wtz3332年前 (2022-03-05)回复

打赏一下作者,鼓励他发表更多的精彩文章

支付宝扫一扫打赏

微信扫一扫打赏