31 个版本 (9 个重大更新)

0.10.2 2024 年 7 月 7 日
0.9.3 2024 年 4 月 21 日
0.9.1 2024 年 3 月 23 日
0.5.0 2023 年 12 月 6 日
0.1.6 2023 年 7 月 5 日

#907网络编程

Download history 16/week @ 2024-04-23 7/week @ 2024-04-30 5/week @ 2024-05-21 130/week @ 2024-06-04 8/week @ 2024-06-11 90/week @ 2024-06-18 53/week @ 2024-06-25 98/week @ 2024-07-02 31/week @ 2024-07-09 55/week @ 2024-07-30

每月 55 下载量

MIT 许可证

81KB
1.5K SLoC

Quincy

Crates.io Documentation Build status codecov License: MIT Matrix

Quincy 是一个基于 QUIC 协议的 VPN 客户端和服务器实现。

设计

Quincy 使用 quinn 实现的 QUIC 协议创建客户端和服务器之间的加密隧道。

此隧道有两个作用

  • 使用可靠的双向流进行身份验证
  • 使用不可靠的数据报进行数据传输(以降低延迟并避免多个可靠性层)

在建立连接并验证客户端后,使用服务器提供的 IP 地址创建一个 TUN 接口。

一切准备就绪后,会启动一个连接任务,它处理 TUN 接口和 QUIC 连接的 IO,有效地在这两者之间中继数据包。

使用 tokio 运行时提供高效且可扩展的实现。

支持的平台

  • Windows (x86_64),使用 Wintun
  • Linux (x86_64, aarch64)
  • FreeBSD (x86_64, aarch64)
  • MacOS (aarch64)

安装

目前为每个官方版本提供了 Windows、Linux (x86_64) 和 MacOS (aarch64) 的二进制文件。

使用 cargo,可以通过简单命令安装任何已发布版本

cargo install quincy

从源码构建

由于 Quincy 不依赖任何非 Rust 库,因此构建过程非常简单

cargo build

如果您想以发布模式构建 Quincy 并启用优化,请添加 --release 开关

cargo build --release

生成的二进制文件可以在 target/debugtarget/release 目录中找到。

Quincy可以可选地使用jemalloc内存分配器以略微提高性能。要启用它,请在--features jemalloc切换到build/install命令中。

cargo build --release --features jemalloc

使用方法

Quincy分为3个二进制文件

  • quincy-client:VPN客户端
  • quincy-server:VPN服务器
  • quincy-users:一个用于管理users文件的实用程序二进制文件

客户端

Quincy客户端需要一个单独的配置文件,示例可以在examples/client.toml中找到。客户端配置文件字段的文档可以在这里找到。

配置文件就绪后,可以使用以下命令启动客户端

quincy-client --config-path examples/client.toml

默认情况下,路由设置为从服务器接收的地址和子网掩码。现在必须手动设置任何额外的路由。

服务器

Quincy服务器需要一个单独的配置文件,示例可以在examples/server.toml中找到。服务器配置文件字段的文档可以在这里找到。

配置文件就绪后,可以使用以下命令启动客户端

quincy-server --config-path examples/server.toml

请注意,在examples/cert/server_cert.pem中预生成的证书是自签名的,并使用主机名quincy。它应该替换为适当的证书,该证书可以使用证书管理部分中的说明生成。

用户

用户实用程序可以用来管理users文件中的条目。users文件包含用户名和密码散列,格式类似于/etc/shadow(示例可在examples/users中找到)。

可以使用以下命令将用户添加到该文件中

quincy-users --add examples/users

提示符将类似于以下内容

Enter the username: test
Enter password for user 'test':
Confirm password for user 'test':

可以使用类似的命令从文件中删除用户

quincy-users --remove examples/users

提示符将再次类似于以下内容

Enter the username: test

证书管理

在设置Quincy使用的证书方面有几个选项。

由受信任的CA签名的证书

这是管理Quincy证书的正确方式。

您可以从具有全球受信任CA的服务(Let's Encrypt、GoDaddy等)请求/付费证书,或生成自己的CA并签发端点证书。

如果您有一个由全球受信任CA签名的证书,您可以简单地将其添加到服务器配置文件中并运行Quincy。客户端将信任证书,因为签名证书很可能在系统的受信任根证书存储中。

如果您有一个由自己的(自签名的)CA签名的证书,请遵循上面的步骤,并另外将您的CA证书添加到客户端配置文件中。

您可以使用mkcert生成自己的CA证书,并使用它来签发端点证书。

自签名证书

这是一个更简单的设置,可能被家庭实验室管理员或用于本地测试。

生成可用于Quincy的自签名证书的步骤

  1. 生成私钥(我使用ECC为我证书,但RSA也可以)
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -out <your_certificate_key_file>
  1. 生成证书请求
openssl req -new -key <your_certificate_key_file> -out <your_certificate_request_file>
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:XX
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (e.g. server FQDN or YOUR name) []:quincy
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
  1. 创建一个包含以下内容的 v3 扩展配置文件(将客户端将要连接到的主机名/IP 填入 subjectAltName 字段)
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer:always
basicConstraints       = CA:FALSE
keyUsage               = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign
subjectAltName         = DNS:quincy
issuerAltName          = issuer:copy
  1. 签名您的证书
openssl x509 -req -in cert.csr -signkey <your_certificate_key_file> -out <your_certificate_file> -days 365 -sha256 -extfile <your_v3_ext_file>
  1. 将证书添加到您的服务器和客户端配置文件中。

服务器

# Path to the certificate used for TLS
certificate_file = "server_cert.pem"
# Path to the certificate key used for TLS
certificate_key_file = "server_key.pem"

客户端

[authentication]
# A list of trusted certificates the server can use or have its certificate signed by
trusted_certificates = ["server_cert.pem"]

依赖项

~25–37MB
~667K SLoC