前言

最近的外网连线成功率好像比较一般(有点感觉是遇到了ws重放,然后被阻断),基于玄学(因为阻断的方式可以很简单,按域名备案分黑白名单,按传输方式,按端口等等)的角度考虑,不妨换一下连接的方式。不使用Websocket的连接,采用近来比较流行的grpc。

准备

本文的步骤是,先在本地机器上,模拟服务端和客户端,还有Nginx,从而一步一步地勾勒出具备可行的配置。

本地环境篇

1. Nginx 配置

本地从最简单的Nginx开始配置起。这里有几点是需要注意的。

  1. 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
  2. 注意/abc/Tun这个位置,文档里面有醒木的提示(TIPs)
  3. 其他参数部分,参考准备一则里面的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里面使用。由于是本地测试,所以不需要太讲究。有几点需要注意的。

  1. 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. 客户端配置

客户端这部分,关注

  1. security这个位置,呆会儿在VPS上就会有所不一样
  2. 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的,所以streamSettingssecurity不用管,除非有更高级的需求。假如想做SSL Pin的话,这里就用得上了。
    • VLESS可以考虑换成VMess
  • 客户端部分
    • streamSettingssecurity,需要改成"security": "tls",其他保持跟本地环境篇里面的指引一样就行了。
  • Cloudflare部分
    • 在网站管理 —— Network里面,打开gRPC连接的设置,就像打开WebSockets连接一样。

后记

本次简单研究了一下,如何配置Cloudflare(CDN)+gRPC+VMESS,从简单的本机调试,到部署到服务器,并测试连接。

稳定性需要运行一段时间才能有比较好的结论目前运行一周,一切都不错。不过我觉得可以通过tlsSettings的设置,去配置更加严格(更似商业化)的传输,来尽量减少传输阻断的问题。
此外,Nginx可配置一个重试桶,拒绝失败过多的请求。

最后修改日期: 2023年6月4日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。