v2ray/xray Websocket Caddy2 CDN

#前言

最近北方的电信连接博客服务器的速度很慢,上午速度也只有 500 - 700 Kbps 左右。我打算套一下 CDN 试试。都说 Cloudflare 的 CDN 是减速器,可是只有 500 Kbps 的网络应该不能更慢了吧。

套了 CDN 的网站加载起来很奇怪,给人一种莫名的不流畅,链接点了没有反应,没有进度条,过了一会突然就跳过去了……

其实,我是想让代理的速度快一些,现在看个 360p 视频都卡。

目前 Cloudflare 免费用户可以中转 Websocket 流量,所以要把配置换到 ws。xray 已经三个半月没有更新了,这篇配置既可以用 xray 也可以用 v2ray。

#准备

需要带有 dns.providers.cloudflare 模块的 Caddy,详细情况看 另一篇日记

#两种反代 ws 方式

一种是 Caddy/Nginx 反代,一种是 xray 反代。

#Caddy/Nginx 等反代

优点:

  • Caddy 监听 80,443端口,这是一个完整的现代网站,只有特定 url 的流量会被转发到 v2ray 。

  • tls 完全由 Caddy 处理,不需要 xray 参与。

  • 服务器对外可以只暴露 443 端口,反代端口由 Caddy 转发,不需要对外开放。

缺点:

  • 增加调试的难度,连接出现问题要查看两个程序的日志。
#xray 反代

优点:

  • 降低整个代理系统的耦合,甚至可以没有 Caddy/Nginx 等。

缺点:

  • 如果搭配 Cloudflare 的 CDN,可选端口有限,Cloudflare 只支持少数几个端口转发[1]

 

#配置

本文介绍 Caddy 反代 ws 的配置,用 xray 反代的样例配置在样例中已经存在。

#服务器 xray 配置:
{
  "log": {
    "loglevel": "error"
  },
  "inbounds": [
    {
      "port": 12345,            // 与 Caddy 配置中的端口相同
      "listen": "127.0.0.1",    // 不需要对外暴露
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "xxxx...xxxx",
            "level": 0,
            "email": "[email protected]"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "ws",
        "security": "none",
        "wsSettings": {
          "path": "/echo"       // 与 Caddy 配置中的路径相同
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom"
    }
  ]
}
#服务器 Caddy2 配置:
your.domain.com {
    root * /home/local_user/site_dir
    file_server
    log {
        output file /home/local_user/log/access.log
    }
    tls {
        dns cloudflare 3jd7w_Awe5ybpqG6zxXr6nRT&ywQyR_EfQtKoRe(你的API token)
        protocols tls1.2 tls1.3
        ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
        curves x25519
    }
    @mywebsocket {
        path /echo
        header Connection *Upgrade*
        header Upgrade websocket
    }
    reverse_proxy @mywebsocket localhost:12345
}

dns cloudflare xxx...xxx(你的API token) 通过 DNS challenge 申请证书。

反代部分的 mywebsocket 是一个 named matcher,详细配置可以去查看 caddy 文档 matchers

注意 caddy 的执行用户以及权限,确保日志文件正常创建。

这时,你已经可以通过域名或 ip,以 websocket + tls 直连方式,使用代理了。

#本地 xray 配置
{
  "log": {
    "loglevel": "error"
  },
  "inbounds": [
    {
      "port": 10800,
      "listen": "127.0.0.1",
      "protocol": "socks",
      "settings": {
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "your.domain.com", // 这里填你的 ip 地址也可以
            "port": 443,
            "users": [
              {
                "id": "xxxx...xxxx",
                "encryption": "none",
                "level": 0
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "serverName": "your.domain.com"
        },
        "wsSettings": {
          "path": "/echo"
        }
      }
    }
  ]
}
#本地 AnXray 配置截图

wss 方式与以前介绍的 tcp + xtls 方式,网速接近,都在 500 - 700 Kbps,接下来套上 CDN 试试。

#Cloudflare CDN 配置

为了代理的 CDN 设置与正常网站用 CDN 加速的设置完全相同,不需要额外设置任何东西,没有workers那些。

Caddy 搭配 Cloudflare 使用有 TLS 证书问题要处理,详细步骤看 CDN 加速网站,Caddy 与 Cloudflare 搭配使用,配置 TLS

防火墙要增加一条规则:允许中国。有的博客上说如果不这样设置,部分连接会被阻断。虽然我没有遇到过,但还是设置了。

等几分钟 DNS 记录更新,期间可以使用 nslookup 或者 ping 等手段查看 DNS 是否更新。Windows 下可能要清除 DNS 缓存? 我不常用 Windows,但是在 Windows 下遇到过类似问题。

等到 DNS 记录更新,如果上面的本地配置中你用了域名信息,那么现在再连接,就已经使用了 CDN 中转了。

#后记

使用 Cloudflare CDN 中转,延迟大了一些,在我这里(北方的电信)的确有加速效果。相同的 xray 配置,相近的时间,多次交替测速,直连是 500 - 700 Kbps; CDN 中转,能跑到 30 - 60 Mbps ,最高能到 90 Mbps。

用 traceroute 查看路由,发现前半程都是走 AS4134 ( 163 骨干网)从北京出口直连洛杉矶。到了洛杉矶电信后直接能进 Cloudflare 机房,看来 Cloudflare 接入了洛杉矶电信,而直连是走 AS64050 BGP 转到 AS 35916 ,服务器所在的 MC 机房。

那么问题出现了。到洛杉矶都是一样的线路,却跑出了这么大的差距,是 MC 机房到电信的线路太烂,还是电信预留给 Cloudflare 一定的带宽呢?


7.23 更新测速

测试了几天,同一时间段的速度并不稳定,但是基本都在 50 Mbps 以上。延迟令人难受。

走 CDN 能到 100 Mbps, 真是奇怪。直连还是 700 Kbps。