5个版本 (3个破坏性版本)

0.4.0 2024年8月24日
0.3.0 2024年7月5日
0.2.1 2024年3月15日
0.2.0 2024年3月15日
0.1.0 2023年12月3日

#992 in 网络编程

Download history 76/week @ 2024-07-01 14/week @ 2024-07-08 15/week @ 2024-07-29 72/week @ 2024-08-19

每月87次下载
gosling中使用

BSD-3-Clause

200KB
4K SLoC

托尔接口

面向开发者的crate,提供连接到Tor网络的功能以及与Tor特定加密类型交互的功能。

此crate的目的不是为了成为一个通用的Tor控制器,也不是旨在公开底层Tor实现的所有功能。此crate本身也不实现任何Tor网络功能,而是封装了底层实现。

概述

tor-interface crate提供了带有3个具体实现的TorProvider trait

  • ArtiClientTorClient:围绕arti-client crate的实验性包装器;使用arti-client-tor-provider功能标志启用。
  • LegacyTorClient:围绕一个所有者或系统提供的旧版c-tor守护进程(即'小tor')的包装器,具有一些基本配置选项;使用legacy-tor-provider功能标志启用。
  • MockTorClient:一个进程内的模拟实现,不会在本地主机之外建立任何实际连接;使用mock-tor-provider功能标志启用。

TorProvider trait定义了连接到各种类型的目标地址(IP、域名和洋葱服务)以及创建洋葱服务的方法。

⚠警告⚠

arti-client-tor-provider功能是实验性的,并未完全实现。它还依赖于仍在积极开发的arti-client crate,并且目前还不适合生产使用。

用法

以下代码片段创建了一个LegacyTorClient,它启动了一个捆绑的tor守护进程,引导,并尝试连接到www.example.com

# use std::str::FromStr;
# use std::net::TcpStream;
# use tor_interface::legacy_tor_client::{LegacyTorClient, LegacyTorClientConfig};
# use tor_interface::tor_provider::{OnionStream, TargetAddr, TorEvent, TorProvider};
# return;
// construct legacy tor client config
let tor_path = std::path::PathBuf::from_str("/usr/bin/tor").unwrap();
let mut data_path = std::env::temp_dir();
data_path.push("tor_data");

let tor_config = LegacyTorClientConfig::BundledTor {
    tor_bin_path: tor_path,
    data_directory: data_path,
    proxy_settings: None,
    allowed_ports: None,
    pluggable_transports: None,
    bridge_lines: None,
};
// create client from config
let mut tor_client = LegacyTorClient::new(tor_config).unwrap();

// bootstrap tor
let mut bootstrap_complete = false;
while !bootstrap_complete {
    for event in tor_client.update().unwrap().iter() {
        match event {
            TorEvent::BootstrapComplete => {
                bootstrap_complete = true;
            },
            _ => {},
        }
    }
}

// connect to example.com
let target_addr = TargetAddr::from_str("www.example.com:80").unwrap();
let mut stream: OnionStream = tor_client.connect(target_addr, None).unwrap();
// and convert to a std::net::TcpStream
let stream: TcpStream = stream.into();

依赖关系

~15–33MB
~501K SLoC