32个版本 (19个破坏性版本)
0.21.0 | 2024年8月1日 |
---|---|
0.20.0 | 2024年6月27日 |
0.19.0 | 2024年6月5日 |
0.14.1 | 2024年3月4日 |
0.0.2 | 2021年11月30日 |
#40 in 网络编程
每月下载量4,267
在18个crate中使用(15个直接使用)
5.5MB
85K SLoC
arti-client
作为客户端访问Tor网络的高级功能。
概述
arti-client
crate旨在为想要使用Tor网络匿名化其流量的应用程序提供安全、易于使用的API。
该crate是Arti项目的一部分,该项目旨在使用Rust实现Tor。它是Arti中最高级的库crate,几乎所有仅客户端的程序都应该使用它。其大部分功能由Arti中的底层crate提供。
API的结构和与其他crate的关系
如果您正在使用异步Rust构建应用程序并希望将Tor连接作为异步流(AsyncRead
/AsyncWrite
),这里的API非常棒。
如果您正在尝试将Arti连接到其他编程语言,目前最好的办法可能是作为子进程启动arti
CLI SOCKS代理。我们尚未提供通过FFI公开的API;我们打算在未来添加此功能。
⚠ 警告 ⚠
请注意,该crate的API并非全部都已完全稳定。我们将在没有充分理由的情况下尽量避免破坏东西,并在破坏时遵循语义版本化,但请预期在我们宣布arti-client
1.x之前,可能会发生一些破坏。
Arti中底层crate公开的API更加不稳定;它们会比arti-client
更频繁地破坏,原因更少。
使用arti-client
本crate的主要入口点是TorClient
,这是一个对象,允许您通过Tor网络进行连接。
连接到Tor
调用TorClient::create_bootstrapped
将建立与Tor网络的连接,并获取所需的网络共识状态。此状态将持久化到TorClientConfig
中指定的位置。
(此方法要求您在async fn
中初始化客户端。如果这不适合您,请考虑使用下面的构建器方法。)
// The client configuration describes how to connect to the Tor network,
// and what directories to use for storing persistent state.
let config = TorClientConfig::default();
// Start the Arti client, and let it bootstrap a connection to the Tor network.
// (This takes a while to gather the necessary directory information.
// It uses cached information when possible.)
let tor_client = TorClient::create_bootstrapped(config).await?;
创建客户端并在稍后连接
您可能希望立即创建Tor客户端,而不等待它启动(或不需要使用await
)。这可以通过使用TorClientBuilder
和TorClient::builder
来完成,并调用TorClientBuilder::create_unbootstrapped
。
返回的客户端在首次使用时可以启动(默认行为),也可以不启动;有关更多详细信息,请参阅BootstrapBehavior
。
// Specifying `BootstrapBehavior::OnDemand` means the client will automatically
// bootstrap when it is used. `Manual` exists if you'd rather have full control.
let tor_client = TorClient::builder()
.bootstrap_behavior(BootstrapBehavior::OnDemand)
.create_unbootstrapped()?;
使用客户端
然后可以使用TorClient::connect
通过Tor进行连接,该方法接受任何实现IntoTorAddr
的对象。这返回一个DataStream
,这是一个实现了AsyncRead
和AsyncWrite
的匿名化TCP流类型,如果启用了tokio
crate功能,还包括那些特质的Tokio版本。
示例:通过Tor进行连接
#
// Initiate a connection over Tor to example.com, port 80.
let mut stream = tor_client.connect(("example.com", 80)).await?;
use futures::io::{AsyncReadExt, AsyncWriteExt};
// Write out an HTTP request.
stream
.write_all(b"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n")
.await?;
// IMPORTANT: Make sure the request was written.
// Arti buffers data, so flushing the buffer is usually required.
stream.flush().await?;
// Read and print the result.
let mut buf = Vec::new();
stream.read_to_end(&mut buf).await?;
println!("{}", String::from_utf8_lossy(&buf));
#
桥接使用
桥和可插入传输(PT)可以用作绕过审查的工具,在Tor被阻止的地方连接到Tor。在arti中,它们通过config::BridgesConfig
进行配置。您需要启用pt-client
功能以支持PT。请注意,可插入传输需要单独安装,Arti本身不提供它们。您可以在TB手册中了解更多有关PT的信息。
更高级的使用
Arti的这个版本包括对“流隔离”的基本支持:确保不同的TCP连接(“流”)通过不同的Tor电路(从而通过不同的出口节点,使其来自不同的IP地址)。
这有助于避免通过关联性解匿匿名用户:例如,您可能希望为银行和在线论坛分别使用不同的Tor连接,以避免两个身份因具有相同的源IP而相互关联。
流可以以两种方式隔离
- 通过调用
TorClient::isolated_client
,这会返回一个新的TorClient
,其流将使用不同的电路 - 通过生成
IsolationToken
,并将它们通过StreamPrefs
传递给TorClient::connect
。
多运行时支持
Arti使用tor_rtcompat
crate来支持多个异步运行时;目前,既支持Tokio也支持async-std。
Arti用于TCP连接的后端(tor_rtcompat::TcpProvider
)和创建TLS会话(tor_rtcompat::TlsProvider
)也可以通过此crate进行配置。这可以用于将Arti嵌入到需要大量控制其网络使用情况的定制环境中。
查看tor_rtcompat
crate文档以了解更多关于这些功能的信息。
报告Arti错误
Arti经常输出非常长的调试消息,即使是对于开发者来说也很难理解。为了更好地了解您程序中出了什么问题,为每个Error
编写match
,并将err.report()
记录下来,其中err
是捕获到的错误。
例如,前面的示例可以修改为报告一个错误
// Initiate a connection over Tor to example.com, port 80.
// Note: here we try to handle the potential error using match
match tor_client.connect(("example.com", 80)).await {
Ok(mut stream) => {
eprintln!("sending request...");
stream
.write_all(b"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n")
.await?;
// IMPORTANT: Make sure the request was written.
// Arti buffers data, so flushing the buffer is usually required.
stream.flush().await?;
eprintln!("reading response...");
// Read and print the result.
let mut buf = Vec::new();
stream.read_to_end(&mut buf).await?;
println!("{}", String::from_utf8_lossy(&buf));
}
Err(err) => {
// Use .report() on an error to get a nicer error message
// Raw Debug output will be much harder to decipher for all parties involved
eprintln!("{}", err.report());
}
}
功能标志
增量功能
-
tokio
(默认)-- 带有Tokio支持构建 -
native-tls
(默认)-- 带有native-tls crate的TLS支持构建 -
async-std
-- 带有async-std支持构建 -
compression
(默认)-- 构建对下载压缩文档的支持。需要C编译器。 -
bridge-client
-- 带有对桥的支持构建 -
onion-service-client
-- 带有对连接到洋葱服务的支持构建。请注意,这还没有像C-Tor那样安全,不应用于安全敏感的目的。 -
onion-service-service
-- 带有运行洋葱服务的支持构建。请注意,这还没有像C-Tor那样安全,不应用于安全敏感的目的。 -
pt-client
-- 带有对插件传输的支持构建 -
anyhow
-- 带有从anyhow::Error中提取ErrorHint
的支持构建 -
full
-- 使用所有上述功能,以及来自其他 crate 的所有稳定的附加功能。(不包括实验性功能。它也不包括选择特定实现而排除其他实现的功能,或设置构建标志的功能。) -
rustls
-- 使用 rustls crate 进行 TLS 支持。这不包括在full
中,因为它使用了ring
crate,该 crate 使用旧的(3BSD/SSLEay)OpenSSL 许可证,这可能会引入许可兼容性问题。
注意,标志 tokio
、native-tls
、async-std
、rustls
和 static
将启用 tor_rtcompat
crate 上同名标志。
与构建标志相关的功能
static
-- 使用 Arti 系统依赖的静态版本链接,如 SQLite 和 OpenSSL(⚠ 警告 ⚠:此功能将包括对 native-tls 的依赖,即使您没有计划使用 native-tls。如果您只想使用静态 sqlite 库进行构建,请启用static-sqlite
功能。我们将在未来寻找更好的解决方案。)static-sqlite
-- 使用 sqlite 的静态版本链接。static-native-tls
-- 使用 native-tls 的静态版本链接。启用native-tls
。
加密加速功能
库不应默认启用这些功能,因为它们用另一种实现替换了另一种实现。
accel-sha1-asm
-- 如果可用,使用 SHA1 的汇编实现加速加密。accel-openssl
-- 使用 openssl 作为后端加速加密。
实验性和不稳定的功能
请注意,这些功能启用的 API 不受语义版本控制保证的覆盖:我们可能会在补丁版本之间破坏它们或删除它们。
experimental-api
-- 使用实验性、不稳定 API 支持进行构建。error_detail
-- 暴露arti_client::Error
内部错误类型。dirfilter
-- 暴露DirFilter
API,允许您在目录被使用之前对其进行修改。experimental
-- 使用上述所有实验性功能,以及来自其他 arti crate 的所有实验性功能。
[^1]: 请记住,语义版本控制是使各种 cargo
功能可靠工作的原因。明确地说:如果您希望 cargo update
仅执行安全更改,则不能启用这些功能。
许可证:MIT OR Apache-2.0
依赖项
~46–66MB
~1M SLoC