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的权限应为:
Global API Key:
export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" export CF_Email="[email protected]"
CF_Key 就是 Global API Key,CF_Email 就是你 cloudflare 的用户邮箱,如果不懂请见之前的文章:
选用上面其中一种方式并执行后,开始用 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进程启动项
大佬,感谢大佬教学 就还有两个问题想请教下
第一个,双向证书验证的ca.pem是用什么生成的,还说是就是cert.pem改个名字?
第二个,本地转发一条数据 可能为tcp 可能为udp 用socks5还是用ssh?
openwrt x86_64应该下载哪个版本?