前言
最近的外网连线成功率好像比较一般(有点感觉是遇到了ws重放,然后被阻断),基于玄学(因为阻断的方式可以很简单,按域名备案分黑白名单,按传输方式,按端口等等)的角度考虑,不妨换一下连接的方式。不使用Websocket的连接,采用近来比较流行的grpc。
准备
本文的步骤是,先在本地机器上,模拟服务端和客户端,还有Nginx,从而一步一步地勾勒出具备可行的配置。
本地环境篇
1. Nginx 配置
本地从最简单的Nginx开始配置起。这里有几点是需要注意的。
http2
开启http2模式- 假如没有开启,客户端可能会显示如下错误:
failed to find an available destination > common/retry: [transport/internet/grpc: failed to dial Grpc > transport/internet/grpc: Cannot dial grpc > rpc error: code = Unavailable desc = connection closed before server preface received] > common/retry: all retry attempts failed
- 假如没有开启,客户端可能会显示如下错误:
- 注意
/abc/Tun
这个位置,文档里面有醒木的提示(TIPs) - 其他参数部分,参考准备一则里面的Nginx介绍
server {
listen 443 http2;
server_name localhost;
location /abc/Tun {
# 网上参考级配置
client_max_body_size 0;
client_body_timeout 60m;
send_timeout 60m;
lingering_close always;
keepalive_time 2h;
keepalive_timeout 30s;
keepalive_requests 256;
grpc_socket_keepalive on;
# 实践级配置
grpc_read_timeout 3m;
grpc_send_timeout 2m;
grpc_set_header Host $host;
grpc_set_header X-Real-IP $remote_addr;
grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
grpc_pass grpc://127.0.0.1:33322;
}
}
2. 服务端配置
服务端的配置很简单,配一个用户,配一下传输方式就完事了。这里以VLESS
为例子作为协议。而官方的文档推荐的是VLESS
需要在可靠信道,如TLS里面使用。由于是本地测试,所以不需要太讲究。有几点需要注意的。
- 是
grpcSettings
里面的serviceName
,这里跟上面的Nginx是不一样的,少了Tun
{
"log": {
"loglevel": "debug"
},
"inbounds": [
{
"protocol": "vless",
"listen": "127.0.0.1",
"port": 33322,
"settings": {
"clients": [
{
"id": "1a37fd9b-aa0a-49ef-9788-3d52cd3b4ca6"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "grpc",
"grpcSettings": {
"serviceName": "abc"
},
"security": "none"
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}
3. 客户端配置
客户端这部分,关注
- 是security这个位置,呆会儿在VPS上就会有所不一样
- 是
grpcSettings
,这点上面服务端已经提到了
{
"log": {
"loglevel": "debug"
},
"inbounds": [
{
"protocol": "socks",
"listen": "0.0.0.0",
"port": 1080,
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
}
}
],
"outbounds": [
{
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "localhost",
"port": 80,
"users": [
{
"encryption": "none",
"id": "1a37fd9b-aa0a-49ef-9788-3d52cd3b4ca6"
}
]
}
]
},
"streamSettings": {
"network": "grpc",
"security": "none",
"grpcSettings": {
"serviceName": "abc"
}
}
},
{
"tag": "Direct",
"protocol": "freedom"
}
]
}
至此,本地的测试环境已经准备好了。直接启动nginx和两个V2ray实例就行(服务端和客户端),然后本地通过端口1080走socks5协议就可以试试,能不能正常上百度,京东之类的。可以的话,接下来就是部署到VPS上面去。
VPS环境篇
在本地环境篇的基础上,着重修改以下几个方面:
- 根据 gRPC 规范官方 (opens new window)规定,此字段不建议使用除英文大小写字母、数字、下划线及英文句号之外的字符组成。
- Nginx部分
listen 80 http2;
这个配置,根据实际情况可改成listen 443 ssl http2;
就是走443端口,https的方式,用证书访问网站。
- 服务端部分
- 由于走nginx proxy的,所以
streamSettings
的security
不用管,除非有更高级的需求。假如想做SSL Pin的话,这里就用得上了。 VLESS
可以考虑换成VMess
- 由于走nginx proxy的,所以
- 客户端部分
streamSettings
的security
,需要改成"security": "tls"
,其他保持跟本地环境篇里面的指引一样就行了。
- Cloudflare部分
- 在网站管理 —— Network里面,打开
gRPC
连接的设置,就像打开WebSockets
连接一样。
- 在网站管理 —— Network里面,打开
后记
本次简单研究了一下,如何配置Cloudflare(CDN)+gRPC+VMESS,从简单的本机调试,到部署到服务器,并测试连接。
稳定性需要运行一段时间才能有比较好的结论目前运行一周,一切都不错。不过我觉得可以通过tlsSettings
的设置,去配置更加严格(更似商业化)的传输,来尽量减少传输阻断的问题。
此外,Nginx可配置一个重试桶,拒绝失败过多的请求。