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 在 网络编程
每月 55 下载量
81KB
1.5K SLoC
Quincy
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/debug
和 target/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的自签名证书的步骤
- 生成私钥(我使用ECC为我证书,但RSA也可以)
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp384r1 -out <your_certificate_key_file>
- 生成证书请求
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 []:
- 创建一个包含以下内容的 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
- 签名您的证书
openssl x509 -req -in cert.csr -signkey <your_certificate_key_file> -out <your_certificate_file> -days 365 -sha256 -extfile <your_v3_ext_file>
- 将证书添加到您的服务器和客户端配置文件中。
服务器
# 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