Diniboy1123/usque

GitHub: Diniboy1123/usque

一个基于 MASQUE 协议的开源 Cloudflare WARP 客户端实现,解决在受限网络中隐蔽传输与绕过审查的需求。

Stars: 803 | Forks: 86

# usque 🥚➡️🍏🍎 Usque 是 Cloudflare WARP 客户端 MASQUE 模式的一个开源重新实现。它利用 [Connnect-IP (RFC 9484)](https://datatracker.ietf.org/doc/rfc9484/) 协议,并提供了多种运行模式,包括原生隧道(目前仅限 Linux)、SOCKS5 代理和 HTTP 代理。 ## 目录 - [usque](#usque) - [Table of Contents](#table-of-contents) - [Installation](#installation) - [Building from source](#building-from-source) - [Docker](#docker) - [Usage](#usage) - [Registration](#registration) - [Enrolling](#enrolling) - [Native Tunnel Mode (for Advanced Users, Linux and Windows only!)](#native-tunnel-mode-for-advanced-users-linux-and-windows-only) - [On Linux](#on-linux) - [On Windows](#on-windows) - [Routes on Linux](#routes-on-linux) - [Routes on Windows](#routes-on-windows) - [SOCKS5 Proxy Mode (easy, cross-platform)](#socks5-proxy-mode-easy-cross-platform) - [HTTP Proxy Mode (easy, cross-platform)](#http-proxy-mode-easy-cross-platform) - [Port Forwarding Mode (for Advanced Users, cross-platform)](#port-forwarding-mode-for-advanced-users-cross-platform) - [TCP and HTTP/2 Support](#tcp-and-http2-support) - [HTTP/2 Configuration](#http2-configuration) - [Configuration](#configuration) - [Fields](#fields) - [ZeroTrust support](#zerotrust-support) - [Performance](#performance) - [Performance Tuning](#performance-tuning) - [Linux/BSD](#linuxbsd) - [DNS](#dns) - [Using this tool as a library](#using-this-tool-as-a-library) - [Known Issues](#known-issues) - [Miscellaneous](#miscellaneous) - [Censorship circumvention](#censorship-circumvention) - [Should I replace WireGuard with this?](#should-i-replace-wireguard-with-this) - [Why would you still switch?](#why-would-you-still-switch) - [Protocol \& research details](#protocol--research-details) - [Why was this built?](#why-was-this-built) - [Why did you fork connect-ip-go?](#why-did-you-fork-connect-ip-go) - [Why the name?](#why-the-name) - [Contributing](#contributing) - [Acknowledgements](#acknowledgements) - [Disclaimer](#disclaimer) ## 安装 你可以从 [发布页面](https://github.com/Diniboy1123/usque/releases) 下载最新版本。目前提供的二进制文件支持 Android (`arm64`)、Linux (`armv5`, `armv6`, `armv7`, `arm64`, `amd64`)、Windows (`arm64`, `amd64`) 和 Darwin (`arm64`, `amd64`)。**但目前仅测试了 Linux 的 `amd64` 二进制文件**。如果你使用其他平台,可以从源码编译。 解压归档文件后,你会在根目录找到一个名为 `usque` 的二进制文件。你可以将该二进制文件移动到 `PATH` 中的某个目录,以便在任何位置访问。 ## 从源码构建 由于该工具使用 Go 编写,构建过程非常简单。 1. 确保你的系统已安装 Go。你可以从 [这里](https://golang.org/dl/) 下载。至少需要 Go 1.25.5。 2. 克隆此仓库并切换到项目根目录 3. 使用以下命令构建项目: ``` CGO_ENABLED=0 go build -ldflags="-s -w" . ``` 这将在当前目录生成一个 `usque` 二进制文件。 如果你希望交叉编译,请相应设置 `GOOS` 和 `GOARCH` 环境变量。例如,在 Linux 系统上为 Windows 构建: ``` GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" . ``` ### Docker 你可以使用 Docker 部署该工具。仓库中提供了 [Dockerfile](Dockerfile)。要构建镜像,请运行: ``` docker build -t usque:latest . ``` 示例用法(启动一个 SOCKS 代理并暴露 1080 端口): ``` docker run -it --rm -p 1080:1080 usque:latest socks ``` ## 用法 ``` $ ./usque --help An unofficial Cloudflare Warp CLI that uses the MASQUE protocol and exposes the tunnel as various different services. Usage: usque [command] Available Commands: completion Generate the autocompletion script for the specified shell enroll Enrolls a MASQUE private key and switches mode help Help about any command http-proxy Expose Warp as an HTTP proxy with CONNECT support nativetun Expose Warp as a native TUN device portfw Forward ports through a MASQUE tunnel register Register a new client and enroll a device key socks Expose Warp as a SOCKS5 proxy Flags: -c, --config string config file (default is config.json) (default "config.json") -h, --help help for usque Use "usque [command] --help" for more information about a command. ``` 在开始之前,你需要先 *注册*。 ### 注册 有一个便捷的 `register` 子命令,用于创建一个新的 Warp 账户并准备就绪。它还会处理设备注册和 MASQUE 设备注册。只需运行一次,它会为后续模块创建一个可用的配置。 一个简单的示例如下: ``` $ ./usque register ``` 如果没有遇到限流或其他错误,你应该会看到 `Successful registration` 消息和一个可用的配置。如果遇到限流等问题,可能需要稍等片刻再重试。 ### 注册设备 虽然注册命令也处理设备注册,但在某些情况下,你可能需要重新注册配置中旧的密钥。这在从一台设备迁移到另一台设备时很有用(服务器仍保留旧客户端密钥),或者如果你的账户启用了 WireGuard 并希望切换到 MASQUE。 ``` $ ./usque enroll ``` ### 原生隧道模式(高级用户,仅限 Linux 和 Windows!) 原生隧道可能是目前 **效率最高** 的运行模式。 #### 在 Linux 上 它**需要系统中有 `TUN` 设备**。这意味着你的内核必须支持加载 `tun.ko` 模块。此外还需要 `iproute2`。虽然它仍运行在用户态,但流量会直接注入内核网络栈,因此你会看到一个真实的网络接口,并能隧道化任何 IP(第三层)流量。由于它创建了真实网络接口并尝试设置 IP 地址,**很可能需要 root 权限**。 #### 在 Windows 上 它需要 [wintun.dll](https://www.wintun.net/) 文件与 `usque.exe` 二进制文件位于同一目录。随后它会自动创建接口并设置 IP 地址。通常这也需要管理员权限。 要启动原生隧道,请执行: ``` $ sudo ./usque nativetun ``` 除非另有说明,你应该会在 Linux 上看到 `tun0`(或 `tun1`、`tun2` 等)接口出现。在 Windows 上,接口通常命名为 `usque`。如果你未使用 CLI 参数禁用隧道内的 IPv4 和 IPv6,也应该能看到预先分配的 IPv4 和 IPv6 地址。这足以让支持通过特定网络接口路由流量的应用程序正常运行。例如 `ping`: ``` $ ping -I tun0 1.1 ``` 或者 `curl`: ``` $ curl --interface tun0 https://cloudflare.com/cdn-cgi/trace ``` 应该可以正常工作。但**该工具不会设置任何路由**。如果需要,你需要手动完成。例如,要将所有流量路由到隧道,你需要确保用于隧道通信的地址被路由到你的常规网络接口。为此,打开 `config.json` 并检查端点地址。如果你计划通过 IPv4 连接到 Cloudflare 端点,很可能会看到如下内容: ``` "endpoint_v4": "162.159.198.1" ``` 请记住这一点以便后续操作。 #### Linux 上的路由 假设你的常规网络接口是 `eth0`,网关地址是 `192.168.1.1`,你可以添加如下路由: ``` $ sudo ip route add 162.159.198.1/32 via 192.168.1.1 dev eth0 ``` 之后,为 `tun0` 接口添加 IPv4 和 IPv6 的默认路由: ``` $ sudo ip route add default dev tun0 && sudo ip -6 route add default dev tun0 ``` #### Windows 上的路由 首先,通过运行以下命令确定常规网络适配器的接口索引: ``` route print ``` 在 **接口列表** 中查找正确的索引号。 在添加默认路由之前,确定隧道接口的网关地址: ``` ipconfig ``` 查找名为 `usque`(或你设置的隧道接口名称)的适配器并记下其网关地址。 假设: * 隧道端点:`162.159.198.1` * 网关:`192.168.1.1` * 接口索引:`12` * 隧道接口:`usque`(请替换为你实际的隧道接口名称或索引) 在**提升的命令提示符**(以管理员身份运行)中执行以下命令: ``` route add 162.159.198.1 mask 255.255.255.255 192.168.1.1 metric 1 if 12 ``` 然后添加默认路由以将所有流量通过隧道转发: ``` route add 0.0.0.0 mask 0.0.0.0 [TUNNEL_GATEWAY] metric 1 if [TUN_INTERFACE_INDEX] route add ::/0 [TUNNEL_GATEWAY] metric 1 if [TUN_INTERFACE_INDEX] ``` ### SOCKS5 代理模式(简单,跨) 如果你只想将隧道作为快速部署的代理使用,并且你的客户端支持 SOCKS5,这个模式非常适合。它**同时支持 IPv4 和 IPv6**,**支持 TCP 和 UDP**。它也是**跨平台**的,不需要任何特殊内核模块或 root 权限。但它会模拟一个完整用户态网络栈,因此可能比较消耗资源。 要启动 SOCKS5 代理,可以运行: ``` $ ./usque socks ``` 默认情况下,这将在 `0.0.0.0:1080` 上启动一个 SOCKS5 代理,**无需身份验证**。你可以通过 `-b` 和 `-p` 分别指定绑定的地址和端口。你也可以通过 `-u` 和 `-w` 指定用户名和密码以启用身份验证。例如: ``` $ ./usque socks -b 127.0.0.1 -p 8080 -u myuser -w mypass ``` 这将启动一个仅可通过 `127.0.0.1:8080` 访问的 SOCKS5 代理,用户名为 `myuser`,密码为 `mypass`。 使用 `curl` 测试代理: ``` curl -x socks5://myuser:mypass@localhost:8080 https://cloudflare.com/cdn-cgi/trace ``` ### HTTP 代理模式(简单,跨平台) 另一种容易“启动并运行”的模式是 HTTP 代理模式。**几乎所有客户端都支持 HTTP 代理**。普通 HTTP 未加密流量发送到该代理时会被直接转发到 WARP 网络。对于 HTTPS 及其他 **TCP 流量**,代理会公开一个 HTTP `CONNECT` 方法。该模式是**跨平台**的,不需要特殊内核模块或 root 权限。但它同样会模拟一个完整用户态网络栈,因此可能比较消耗资源。 要启动 HTTP 代理,可以运行: ``` $ ./usque http-proxy ``` 默认情况下,这将在 `0.0.0.0:8000` 上启动一个 HTTP 代理,**无需身份验证**。你可以通过 `-b` 和 `-p` 指定绑定的地址和端口。你也可以通过 `-u` 和 `-w` 启用用户名和密码。例如: ``` $ ./usque http-proxy -b 127.0.0.1 -p 8080 -u myuser -w mypass ``` 这将启动一个仅可通过 `127.0.0.1:8080` 访问的 HTTP 代理,用户名为 `myuser`,密码为 `mypass`。 使用 `curl` 测试代理: ``` curl -x http://myuser:mypass@localhost:8080 https://cloudflare.com/cdn-cgi/trace ``` ### 端口转发模式(高级用户,跨平台) 与其他大多数暴露隧道的方式不同,此模式面向更高级的用例。可以把它想象成 SSH 转发。它允许你将特定端口从主机转发到 WARP 网络,或从 WARP 网络转发到主机。 *你为什么要这么做?* 对于普通 WARP,这个功能几乎无用。事实上,该工具的 `registration` 命令甚至无法正确设置它。但结合手动配置,并且假设你有一个 ZeroTrust 网络,你可以配置 WARP 设备进行设备间通信。每台设备会有一个内部的 IPv4 和 IPv6 地址,它们可以通过这种方式互相访问。但这并不是开箱即用的工作方式,因此[请参考官方指南](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/private-net/warp-to-warp/)进行设置。设置完成后,你可以使用此功能将端口转发到或来自 WARP 网络。 此模式是**跨平台**的,不需要特殊内核模块或 root 权限。但它同样会模拟一个完整用户态网络栈,因此可能比较消耗资源。 关于设置,假设你的配置如下: ``` "ipv4": "100.96.0.3" ``` 这意味着你的设备内部 IPv4 地址是 `100.96.0.3`。你在主机上运行一个监听 `8080` 端口的 Web 服务器。另一台设备的内部 IPv4 地址是 `100.96.0.2`,也暴露了一个 `8081` 端口的 Web 服务器。你希望将主机的端口 `8080` 转发到 WARP 网络,并将 WARP 网络的端口 `8081` 转发到主机。为此,可以运行: ``` $ ./usque portfw -R 100.96.0.3:8080:localhost:8080 -L localhost:8081:100.96.0.2:8081 ``` ### TCP 与 HTTP/2 支持 虽然 `usque` 最初专注于 **QUIC** 和 **HTTP/3**,但 Cloudflare 的官方客户端已引入 TCP 回退支持。`usque` 现在通过 `--http2` 支持这种连接方式。 有关完整说明和故障排除,请参阅 Wiki 页面:[HTTP/2 支持](https://github.com/Diniboy1123/usque/wiki/HTTP-2-support)。 #### HTTP/2 配置 要通过 TCP/HTTP/2 连接,请使用 `--http2` CLI 参数。 由于端点无法从 API 可靠获取,你可以使用以下方式管理 HTTP/2 连接: - `endpoint_h2_v4`:HTTP/2 模式使用的 IPv4 地址。 - `endpoint_h2_v6`:HTTP/2 模式使用的 IPv6 地址。 默认行为: - 如果未设置 `endpoint_h2_v4`,`usque` 将使用 `162.159.198.2`。 - `endpoint_h2_v6` 默认留空,必须手动配置才能启用 IPv6 的 HTTP/2。 ### 配置 为简化使用,该工具使用 JSON 配置文件。默认文件为当前目录下的 `config.json`。你可以使用 `-c` 参数指定其他文件。所有子命令都会读取该配置。如果没有任何配置文件,只有 `register` 子命令可以工作。 示例配置: ``` { "private_key": "M...redacted...==", "endpoint_v4": "162.159.198.1", "endpoint_v6": "2606:4700:103::", "endpoint_h2_v4": "162.159.198.2", "endpoint_h2_v6": "", "endpoint_pub_key": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIaU7MToJm9NKp8YfGxR6r+/h4mcG\n7SxI8tsW8OR1A5tv/zCzVbCRRh2t87/kxnP6lAy0lkr7qYwu+ox+k3dr6w==\n-----END PUBLIC KEY-----\n", "license": "A...redacted...Z", "id": "00000000-0000-0000-0000-000000000000", "access_token": "00000000-0000-0000-0000-000000000000", "ipv4": "172.16.0.2", "ipv6": "2606:redacted:1" } ``` #### 字段说明 - `private_key`:NIST P-256 曲线上 ASN.1 DER 格式的 ECDSA 私钥。**敏感信息**。用于设备认证。 - `endpoint_v4`:Cloudflare WARP IPv4 地址。**公开信息**。用于连接 WARP 网络。 - `endpoint_v6`:Cloudflare WARP IPv6 地址。**公开信息**。用于连接 WARP 网络。 - `endpoint_h2_v4`:`--http2` 使用的 IPv4 地址。默认为 `162.159.198.2`(未设置时)。**公开信息**。 - `endpoint_h2_v6`:`--http2` 使用的 IPv6 地址。默认留空,使用时需手动配置。**公开信息**。 - `endpoint_pub_key`:NIST P-256 曲线上 PEM 格式的 ECDSA 公钥。**公开信息**。用于验证我们确实在与 Cloudflare WARP 端点通信,而非遭受 [中间人攻击](https://en.wikipedia.org/wiki/Man-in-the-middle_attack)。 - `license`:服务器返回的许可证。**敏感信息**。可用于将多个设备绑定到同一账户。 - `id`:服务器分配的设备 ID。**公开信息**。用于设备识别和 API 调用。 - `access_token`:注册/登录后服务器返回的访问令牌。**敏感信息**。用于 API 调用。 - `ipv4`:Cloudflare WARP 网络分配的设备内部 IPv4 地址。**公开信息**。分配给设备接口,并用于设备间通信。 - `ipv6`:Cloudflare WARP 网络分配的 设备内部 IPv6 地址。**公开信息**。分配给设备接口,并用于设备间通信。 ## 零信任支持 在我看来,ZeroTrust 是 Cloudflare 企业版的 WARP。详细解释超出了本 README 的范围。 虽然该工具无法让你登录到 ZeroTrust(因为需要 SSO),但实践表明,如果你真的想,可以建立连接。为此,你需要运行 `./usque register --jwt ` 或手动组合配置文件。建议使用 `register` 命令获取个人 WARP 配置,然后保留所有字段不变,仅修改 `access_token` 和 `id`。至于如何获取这些值,可以发挥创意。例如,这两个值都可以从 `/var/lib/cloudflare-warp/reg.json` 中提取(如果使用 Linux 上的官方 WARP 客户端),或者在 ZeroTrust 仪表板中列出已有设备 ID。配置完成后,可以使用 `enroll` 命令刷新配置。你会发现 `license` 字段为空。这是正常的,因为 ZeroTrust 不使用许可证(据我所知)。 只要正确设置,所有模式都支持该工具与 Warp 到 Warp 的通信。代理和隧道可以访问其他设备上暴露的服务,并且[端口转发](#port-forwarding-mode-for-advanced-users-cross-platform)可用于在 WARP 网络和主机之间转发端口。 ## 性能 该项目仍处于开发早期阶段(我很高兴它能工作),性能并非首要考虑。事实上我对 Go 并不太熟悉。官方客户端(在 Linux 和 Android 上)是用 Rust 实现的,并借助了出色的 [quiche](https://github.com/cloudflare/quiche) 项目。相比之下,本工具使用 Go 编写,并依赖维护良好的 [quic-go](https://github.com/quic-go/quic-go) 库,提供了对 QUIC 协议的广泛支持。然而它仅支持 `reno` 拥塞控制,且并非最理想的实现,尤其是在高延迟网络环境中。 许多其他功能(如 [happy eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs))也缺失。 因此,性能可能不是最优的。然而,我在使用 SOCKS5 代理模式配合 Firefox 和 [speedtest.net](https://www.speedtest.net/ 的情况下,在 1 Gbps 连接上获得了 833.60 Mbps 下载和 772.88 Mbps 上传。测试环境为 `AMD Ryzen 7 5700U`、`16 GB` 内存、`Arch Linux`。这对我来说已经足够好了。当然还有改进空间。但请记住,这完全是用户态;SOCKS 模式甚至模拟了自己的网络栈。CPU 使用率约为 26%。 我听说 Windows 上的性能更差。我没有 Windows 设备可供测试。如果你有,请告诉我你的体验。 ### 性能调优 #### Linux/BSD 如果设置过小,`quic-go` 会友好地发出警告。但 Linux 上默认的 UDP 缓冲区大小较小。你可以通过运行以下命令来增加它: ``` $ sudo sysctl -w net.core.rmem_max=7500000 $ sudo sysctl -w net.core.wmem_max=7500000 ``` 有关更详细的解释,请参考 [quic-go 文档](https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes)。 #### DNS 默认情况下,除了原生隧道模式外,所有模式都会使用 [Quad9](https://quad9.net/) 来解析 DNS 流量。虽然这对于一个 Cloudflare 客户端来说似乎有些奇怪,但我更倾向于它们而不是 `1.1.1.1`,因为它们对隐私的承诺。我认为这是一个不错的默认设置。但 `1.1.1.1` 通常性能更好。你可以自由通过 `-d` 参数指定工具使用的 DNS 服务器。 例如: ``` $ ./usque socks -d 1.1.1.1 -d 1.0.0.1 -d 2606:4700:4700::1111 -d 2606:4700:4700::1001 ``` 原生隧道不会自定义 DNS。系统设置优先。DNS 数据包路由到隧道或其他位置也完全由你决定。 ## 作为库使用 目前这主要是一个 CLI 工具。然而已经做出一些努力来记录并公开某些函数,以便构建你自己的应用程序。**我不推荐这样做**,因为实现尚不稳定,且 API 可能会变更。我也未做好最佳抽象工作,因为我首要目标是让它工作,其次是可读性。因此,与其直接用作库,不如人们可以 fork 并根据需要集成额外功能。我欢迎能提高代码模块化并使其更易于作为库使用的 PR。 作为起点,你可以访问 [`api/`](api/) 包。示例可以参考 [`cmd/`](cmd/) 包。 ## 已知问题 - **远程端断开连接**:如果你长时间不活动,远程端可能会以 `H3_NO_ERROR` 错误断开你。类似行为在之前研究完善的 `WireGuard` 实现中也观察到,连接长时间无活动会被断开。官方应用会自动重连,因此我实现了类似行为。因此如果你看到断开,请不用担心,很可能是远程端问题。工具会在你产生出站流量后自动重连。 - **与 Cloudflare API 交互有限**:这是有意为之。该工具的主要重点是 MASQUE。如果需要更好支持,建议使用官方客户端或 [wgcf](https://github.com/ViRb3/wgcf)。 - **不支持 WireGuard**:这是一个 MASQUE 客户端。如果需要 WireGuard,请使用官方客户端或 [wgcf](https://github.com/ViRb3/wgcf)。 - **不支持 DoH 等**:是的,官方客户端暴露了诸多 DNS 相关功能。我想保持轻量化。这些功能可能不会由我实现。如果你需要,可以自由使用第三方 DoH 客户端并配置其使用隧道接口。除原生隧道模式外,所有模式上的 DNS 查询都应该可以工作(除非你使用 `-l` 参数)。 - **初始速度较慢**:打开新连接时可能会经历较慢的速度,随后逐渐提升。这是由于 `quic-go` 使用的 `reno` 拥塞控制算法。它并非最理想的实现,尤其是在高延迟环境中。我们需要等待对不同拥塞控制算法的支持并观察其表现。例如有一个关于 [BBR](https://github.com/quic-go/quic-go/issues/4565) 的开放问题。 - **原生隧道仅支持 Linux**:这是因为依赖 `TUN` 设备。虽然在 Android 上也存在,但没有 root 权限很难使用。Windows 支持是可行的,但我没有 Windows 相关的经验。BSD 和 macOS 支持不确定。目前所有这些平台都未支持,因为我无法测试,也没有意愿发布未经验证的代码。欢迎 PR。 ## 其他信息 ### 绕过审查 几乎没有办法区分 MASQUE 流量与其他 HTTP/3 流量。然而 QUIC 强制要求 TLS v1.3,因此我们在 SNI 字段中发送 `client-masque.cloudflareclient.com`。某些防火墙可能会阻止此操作。你可以通过 `-s` 参数指定任意域名(根据我的经验)来更改 SNI,连接仍然可以工作。请注意,这肯定不是 Cloudflare 的预期用途(只是一个不错的副作用)。在进行任何绕过尝试之前,请确保你没有违反任何法律。就我个人而言,我只将其视为一种优势,用于掩盖我们正在连接 Warp 的事实,以抵御中间人攻击。 ## 我应该用这代替 WireGuard 吗? 这取决于你的需求。😊 WireGuard 是一个优秀的协议,其现代/快速的加密以及内核模式支持都是很棒的功能。如果它对你有效,我不认为你应该切换。 MASQUE 是用户态,QUIC(底层协议)也是用户态,使得实现更慢。虽然它也有一些优势,例如完整的 TLS 支持(WireGuard 使用固定的一组加密套件)、可调节的拥塞控制、更高级的调参参数,但它也更复杂。 归根结底,如果你对 WireGuard 满意,我没有理由切换。如果你对 Warp 满意,但需要使用没有官方支持的平台,这个工具可能适合你。 ### 你为什么仍然会切换? - **最近出现报告称 WARP+ 在 WireGuard 上无法工作**:我看到过相关报告,虽然我无法确认,但读到过一些人遇到这种情况([参见](https://github.com/ViRb3/wgcf/issues/459#issuecomment-2645319671))。它对我有效,所以我认为这是一个可行的替代方案。 - **你希望在没有官方支持的平台使用 WARP**:该工具是跨平台且开源的,因此你可以在任何支持 Go 的平台上自由使用。这包括 Windows、macOS、BSD、Linux、Android、iOS 等。我希望它能在所有平台上工作。 - **某些网络会屏蔽 WireGuard**:某些网络会屏蔽 WireGuard,但不会屏蔽 QUIC。 - **你是一个好奇的人**:你对新技术感到好奇,MASQUE 是一种新且有趣的方法……为什么不呢?😊 ## 协议与研究细节 如果包含所有关于协议和我所做研究的细节,本文档将对普通读者来说过于冗长和可怕。如果你对某些细节感兴趣,请参考 [RESEARCH.md](RESEARCH.md) 文件。那份文件以博客形式总结了我所做的研究和协议细节。未来我计划编写一份清晰简洁的协议文档并链接在此。目前只包含了 HTTP/3。 ## 为什么要构建这个? 主要是因为我想尝试酷炫的新技术,而 MASQUE 引起了我的注意。我惊讶地发现几乎没有开源实现,实际上我还没有看到任何 `connect-ip` 的实用开源实现。我想改变这一点并“宣传”一下。 其次,我经常依赖 WARP 来访问 Cloudflare 代理的网站,因为我的 ISP 与常规 Cloudflare 保护的网站之间的对等连接并不理想。使用 WARP+ 后,我获得了更好的路由和更快的速度。然而,官方客户端的 WireGuard 实现运行在用户态,所以我改用 `wgcf` 来以内核模式运行。它最近行为异常;出于某种原因,我每次想使用时都必须多次重连。它有时在几次尝试后开始工作,但这很烦人。有几个关于 `wgcf` 仓库的问题与此相关,例如[这个](https://github.com/ViRb3/wgcf/issues/158)和[这个](https://github.com/ViRb3/wgcf/issues/50)。WireGuard 在本地列车 WiFi 上也被屏蔽,但 MASQUE 没有。 然后我切换到了官方客户端和 MASQUE,它工作得更加稳定。然而整个应用程序相当庞大(Android 上压缩后为 260 MiB)。*Cloudflare One,企业版要轻得多...* 但无论如何,我发现应用程序使用了太多内存,这还不是最糟糕的。 当我随意坐在火车上浏览网络时,Warp 有时会崩溃并断开整个 VPN 配置,导致我的流量暴露在本地 WiFi 上。这非常不愉快,也是让我开始这个项目的主要原因。 虽然它还没有完全解决重连问题,但这是计划中的。通过开源这个项目,我希望社区能帮助我让这个工具更好、更可靠。 ## 为什么 fork connect-ip-go? 因为 Cloudflare 的实现并不完全符合 RFC 9484,如果不直接 monkey-patching 库就无法工作。找到我丑陋但(希望)可用的版本[这里](https://github.com/Diniboy1123/connect-ip-go)。 ## 为什么起这个名字? 显然我没有计划命名为 `warp`、`cloudflare` 或任何类似名称以减少冲突或避免用户因我糟糕的实现尝试而敲错门。 由于底层技术是 MASQUE,我想想一个简短、难忘且独特的名称,但仍与底层技术相关。我在高中学了四年拉丁语,所以我认为完美的名称是 `usque`。如果我信任我生疏的记忆,它的意思是 `all the way`。我认为这是一个很好的契合,因为它是一个能将所有流量隧道传输到 Cloudflare 网络的工具。我们还有很长的路要走才能让它稳定。你明白我的意思……😊 它也(希望)足够独特,不会与其他项目冲突。 ## 贡献 欢迎贡献。事实上,我是一名大学生,时间和资源都非常有限。目前该工具主要实现了我自己的需求和想法,但我希望它能成长并变得更加稳定许多令人兴奋的新功能。如果你有任何想法、建议、错误报告甚至代码贡献,请随时打开 issue 或 pull request。我会尽力回复。 ## 感谢 没有以下令人惊叹的项目,这个工具不会存在。请都去给它们点 star! - [Cloudflare Blogs](https://blog.cloudflare.com/) - 他们有一些有趣的博客内容。我从中学习了一些零散的知识。 - [cobra](github.com/spf13/cobra) - Go 的强大 CLI 库。用于 CLI 界面。我非常喜欢它。 - [connect-ip-go](https://github.com/quic-go/connect-ip-go) - ~~目前能找到的唯一一个 `RFC 9484` 开源实现。~~(这已不再正确,[参见](RESEARCH.md#interesting-other-connect-ip-related-projects))我们的整个 IP 隧道都依赖于此。我们严重依赖我的这个 fork。 - [Frida](https://frida.re/) - 这对动态分析官方客户端帮助很大。我能够看到应用程序中的实时操作并转储某些值。 - [frida-interception-and-unpinning](https://github.com/httptoolkit/frida-interception-and-unpinning/tree/4d477da) - 非常擅长解除证书固定,这样我就可以探索应用程序如何进行 API 调用。 - [friTap](https://github.com/fkie-cad/friTap) - 一个编写精良且易于使用的 Frida 脚本,可以轻松转储 TLS 密钥。 - [Go](https://go.dev/) - 编程语言 Go。我不是专业开发者,但我用 Go 让它运行了起来。它是一门伟大的语言。 - [go-socks5](github.com/things-go/go-socks5) - 一个很棒的 Go SOCKS5 库。用于 SOCKS5 代理模式。让我学到了很多关于 SOCKS 协议的知识。 - [gvisor](https://gvisor.dev/) - gvisor 是一个出色的工具,用于以安全环境运行不受信任的代码。它们还实现了完整用户态网络栈。这使得所有代理模式无需 root 即可跨平台运行。 - [IDA Free](https://hex-rays.com/ida-free) - 优秀的工具,用于处理 Rust 二进制文件。帮助我理解官方客户端。 - [JADX-GUI](https://github.com/skylot/jadx) - 优秀的工具,用于处理 Android APK。帮助我理解官方客户端。 - [masque-go](https://github.com/quic-go/masque-go) - 虽然我最终没有使用它(它是用于 `connect-udp` 风格的 `RFC 9298` 兼容 MASQUE 服务器),但它在我研究阶段是一个很好的起点。 - [mitmproxy](https://mitmproxy.org/) - 对于拦截官方客户端的 API 调用非常有用。 - [netlink](github.com/vishvananda/netlink) - 一个用于使用 `iproute2` 与 Linux 网络栈交互的优秀库。用于 Linux 上的原生隧道模式。 - [quic-go](https://github.com/quic-go/quic-go) - 强大的 Go QUIC 库,用于从建立连接到维持连接的各种操作。 - [uritemplate](github.com/yosida95/uritemplate) - 一个用于解析 URI 模板的优秀库。用于将正确的端点 URI 传递给 `connect-ip-go`。 - [water](https://github.com/songgao/water) - 用于 TUN/TAP 设备的 Go 库。用于原生隧道模式。让我了解了 TUN/TAP 设备的一切。 - [wireguard-go](golang.zx2c4.com/wireguard) - 一个用于 Go 的 WireGuard 库。广泛用于该项目,以实现无根虚拟隧道网络,因为其 `netstack` 实现非常容易使用。 - [wireshark](https://www.wireshark.org/) - 我用它来调试官方客户端和本工具在初始开发过程中的问题。它是网络调试的瑞士军刀。 特别鸣谢 [**@monkeywave**](https://github.com/monkeywave),[friTap](https://github.com/fkie-cad/friTap) 的贡献者之一,帮助我解开了理解官方客户端所需信息的最后部分。事实上,如果没有他们,我可能早就放弃这个项目了。他们帮助我并耐心地指导我完成从官方客户端转储 TLS 密钥的过程。这个问题值得一读([如果感兴趣](https://github.com/fkie-cad/friTap/issues/38))。我在开源社区中最好的体验之一。非常感谢! 另外特别鸣谢 [**@marten-seemann**](https://github.com/marten-seemann),他维护着整个 quic-go 生态系统。我也在那里打开了一些 issue,都得到了有帮助的回复。谢谢你! ## 免责声明 请不要将此工具用于滥用行为。毕竟你伤害的是 Cloudflare,这可能不公平,因为你免费获得了这些内容,其次你很可能让此工具被封禁并毁了所有人的乐趣。 该工具模仿官方客户端的某些特性,这些特性主要是出于稳定性和兼容性考虑。我从未打算让此工具与官方客户端无法区分。这意味着如果他们想检测此工具,他们可以。这绝对是你自己的责任。我不对使用此工具可能产生的任何后果负责。这完全是你的责任。我不对任何可能对你的系统或网络造成的损害负责。此工具按原样提供,没有任何保证。请自行承担风险使用。 虽然该工具在设计时考虑了安全性,但我不是安全专家,也不是 IT 专业人士。我只是一个爱好者,这只是一个爱好项目。同样,请自行承担风险。然而欢迎安全报告。请随时打开一个 issue 并提供你的联系方式,以便我私下回复你,这样你就可以私下分享你的发现。**一旦有足够的时间修复该问题,我将在发布说明中为你署名,并且这些发现可以公开。** 我感谢任何帮助让此工具更安全。 **此工具在任何方面都不与 Cloudflare 关联。该工具既未得到 Cloudflare 的认可,也未经过 Cloudflare 的审查。这是一个独立的研究项目。Cloudflare Warp、Warp+、1.1.1.1™、Cloudflare Access™、Cloudflare Gateway™ 和 Cloudflare One™ [均为 Cloudflare, Inc. 的注册商标/文字商标](https://www.cloudflare.com/trademark/)。如果你是 Cloudflare 员工,并且认为此项目以任何方式有害,请打开一个 issue,我将尽力联系你并解决问题。** WireGuard™ 是 [Jason A. Donenfeld](https://wireguard.com/) 的注册商标。
标签:Censorship Circumvention, Cloudflare WARP, Connnect-IP, DNS, EVTX分析, HTTP/2, HTTP代理, IETF, Masque, RFC 9484, SOCKS5, TCP, 中间件, 代理, 协议实现, 原生隧道, 安全通信, 客户端, 开源, 性能优化, 无文件攻击, 日志审计, 服务端, 检测绕过, 端口转发, 绕过审查, 网络穿透, 请求拦截, 隐私, 隧道