19 个版本

0.6.1 2023 年 10 月 10 日
0.5.5 2023 年 2 月 21 日
0.5.4 2022 年 8 月 30 日
0.5.3 2021 年 8 月 30 日
0.3.0 2017 年 6 月 2 日

#69 in 网络编程

Download history 5568/week @ 2024-04-30 5454/week @ 2024-05-07 7415/week @ 2024-05-14 5947/week @ 2024-05-21 5362/week @ 2024-05-28 5082/week @ 2024-06-04 4609/week @ 2024-06-11 5161/week @ 2024-06-18 3694/week @ 2024-06-25 3390/week @ 2024-07-02 2430/week @ 2024-07-09 4340/week @ 2024-07-16 6735/week @ 2024-07-23 5185/week @ 2024-07-30 5829/week @ 2024-08-06 6438/week @ 2024-08-13

25,185 每月下载量
12 个包中使用 (11 直接使用)

WTFPL 许可证

105KB
2.5K SLoC

TUN 接口 Crates.io tun WTFPL

此包允许创建和使用 TUN 接口,目标是使其跨平台。

使用方法

首先,将以下内容添加到您的 Cargo.toml

[dependencies]
tun = "0.6.1"

然后,将以下内容添加到您的包根目录

extern crate tun;

如果您想使用 mio/tokio 与 TUN 接口,需要启用 async 功能

[dependencies]
tun = { version = "0.6.1", features = ["async"] }

示例

以下示例创建并配置了一个 TUN 接口,并从中开始读取数据包。

use std::io::Read;

extern crate tun;

fn main() {
	let mut config = tun::Configuration::default();
	config.address((10, 0, 0, 1))
	       .netmask((255, 255, 255, 0))
	       .up();

	#[cfg(target_os = "linux")]
	config.platform(|config| {
		config.packet_information(true);
	});

	let mut dev = tun::create(&config).unwrap();
	let mut buf = [0; 4096];

	loop {
		let amount = dev.read(&mut buf).unwrap();
		println!("{:?}", &buf[0 .. amount]);
	}
}

平台

并非每个平台都受支持。

Linux

您需要加载 tun 模块,并且创建接口需要 root 权限。

macOS

它正常工作,但您需要手动设置路由。

iOS

您可以将 TUN 设备的文件描述符传递给 rust-tun 以创建接口。

以下是在 iOS 上创建 TUN 设备并传递 fdrust-tun 的示例

// Swift
class PacketTunnelProvider: NEPacketTunnelProvider {
    override func startTunnel(options: [String : NSObject]?, completionHandler: @escaping (Error?) -> Void) {
        let tunnelNetworkSettings = createTunnelSettings() // Configure TUN address, DNS, mtu, routing...
        setTunnelNetworkSettings(tunnelNetworkSettings) { [weak self] error in
            let tunFd = self?.packetFlow.value(forKeyPath: "socket.fileDescriptor") as! Int32
            DispatchQueue.global(qos: .default).async {
                start_tun(tunFd)
            }
            completionHandler(nil)
        }
    }
}
#[no_mangle]
pub extern "C" fn start_tun(fd: std::os::raw::c_int) {
    let mut rt = tokio::runtime::Runtime::new().unwrap();
    rt.block_on(async {
        let mut cfg = tun::Configuration::default();
        cfg.raw_fd(fd);
        let mut tun = tun::create_as_async(&cfg).unwrap();
        let mut framed = tun.into_framed();
        while let Some(packet) = framed.next().await {
            ...
        }
    });
}

Windows

您需要将与您的架构匹配的 wintun.dll 文件复制到与您的可执行文件相同的目录,并以管理员身份运行程序。

依赖项

~0.3–30MB
~392K SLoC