gost GitHub:
https://github.com/ginuerzh/gost
下载gost
直接转发
以上转发类似iptables的转发。
下面为加密转发,gost自带tls证书。
加密转发
TLS 加密方式:
中转机:
落地机:
wss 加密方式:
中转机:
落地机:
使用 shadowsocks
直接运行 shadowsocks
之后直接使用shadowsocks的客户端连接就能使用。
Shadowsocks Over TLS:
Shadowsocks Over WSS:
Shadowsocks Over KCP:
运行原版 shadowsocks 并加密转发
中转机IP为1.1.1.1,落地机IP为2.2.2.2,均使用443端口。shadowsocks 运行在落地机的 8338 端口。
中转机:
落地机:
shadowsocks 客户端连接 1.1.1.1 的IP,443的端口,加上加密方式及密码即可成功连接。
以上端口可随意指定,不是一定要用443。当然最好也是用443。
gost 使用自定义的SSL证书
使用 gost 自带的 tls 证书虽然很方便,但是存在安全隐患(详见:为什么Gost默认TLS隧道不安全)。
我们最好使用自己域名的证书。
操作起来略微有点麻烦,具体的步骤为:申请证书——转换证书——启用证书
申请证书
使用 acme.sh 脚本申请 SSL证书 是最好的方式。
安装 acme.sh:
这条命令主要做了2件事情:
1、把 acme.sh 安装到你的用户目录下(比如你用 root 执行安装,就会在 /root/.acme.sh);
2、自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书.
获取证书:
获取证书有很多种方式。这里我们选择合适 gost 的方式,即只需要获取证书。
有公网IP的VPS:
没有公网IP的 nat vps:
–httpport 指定端口申请 SSL证书
或者,用 手动dns 的方式, 手动在域名上添加一条 txt 解析记录来获取证书:
之后会出现提示,让你在域名解析那里添加 txt解析。
添加后继续执行:
如果 nat vps 指定了端口仍然申请不了证书,则使用 API 的方式,这里用 cloudflare 做演示。
cloudflare API 分两种方式:使用 Global API Key 或 API Token。一般推荐用 API Token,更安全。
API Token:
Token、Account ID、Zone ID的获取请看 使用CloudFlare做DDNS解析(API Token)
Account ID、Zone ID都是在一个地方查看。
注意这里API Token的权限应为:
Global API Key:
CF_Key 就是 Global API Key,CF_Email 就是你 cloudflare 的用户邮箱,如果不懂请见之前的文章:
使用CloudFlare做DDNS解析
选用上面其中一种方式并执行后,开始用 API 申请证书:
稍等片刻,证书就申请好了!
——————————-更多 acme.sh 的用法详见 Github
转换证书
申请的证书在 /root/.acme.sh 目录下,我们 copy 到 gost 所在的目录 /root,比如域名为 abc.com:
将cer、key 两个证书转换成 pem 格式:
如果你的 key 文件是 EC 格式的,执行:
其他格式的以此类推。
启用证书
此时,gost 所在的目录已经有 cert.pem、key.pem 两个文件了,启动 gost,gost 就会自动使用证书。
如前面的例子,服务端执行:
或者 如果有多个证书,可以直接指定证书位置来运行:
之后再将 cert.pem、key.pem 传输到 gost 的客户端。
gost 的客户端执行:
secure=true 指定了必须验证证书。
ca=$PATH 锁定了证书,服务端传回的证书必须是它,否则断开连接。
上面是单向的证书认证,下面是更安全的双向证书认证。
启用双向证书校验
服务端:
客户端:
如果是通过 acme.sh 脚本申请的证书,可在 /root/.acme.sh/abc.com 下面找到 ca.cer,这个就是ca证书,复制过来转换成pem即可。
开启双向证书认证后,只要有一方的证书不对就无法建立连接。
如客户端使用自带或其他域名的证书,服务端就会提示:
tls: client didn't provide a certificate
OK,这样 gost 就用我们的域名证书跑起来了。
唯一的问题是3个月换一次证书???
gost 以配置文件方式运行
配置文件为标准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 开机启动
创建 /etc/systemd/system/gost.service 文件:
输入以下内容:
ExecStart gost 的启动命令,记得用绝对路径
WorkingDirectory 指定 gost 的工作目录,使 gost 能读取目录下的SSL证书
之后,如果这个 gost.service 有修改的话,需要执行刷新才能生效:
设置开机启动:
这样Linux重启,gost 也会跟着跑起来。
以后也能通过 systemctl 命令来控制 gost,如:
或者用 service 命令:
更多用法详见 gost 的GitHub。gost 远远不止这些用途。
openwrt 运行 gost
在 https://github.com/ginuerzh/gost/releases 下载对应的版本,这里以 斐讯N1 为例,下载 gost-linux-armv8-2.11.1.gz。
下载后通过 web 上传到 openwrt。如果需要使用到证书,也一起传进去。
启用
方式1:打开openwrt 的 Web页面, 找到启动项,在里面找到gost,点击启动即可
方式2:重启openwrt即可