#tun-tap #cross-platform #devices #queue #async #structs #packet

riptun

riptun 是一个跨平台库,用于创建、管理和利用同步和异步 TUN/TAP 设备

5 个版本

0.1.4 2021年11月21日
0.1.3 2021年11月21日
0.1.2 2021年11月14日
0.1.1 2021年10月29日
0.1.0 2021年10月25日

#7 in #tun-tap

MIT 许可证

62KB
866

riptun

linux codecov version license

riptun 是一个用于创建、管理和利用 TUN/TAP 设备的库。

实现通过 [Tun] 和 [Queue] 结构体暴露了同步接口,同时也通过一系列功能标志结构体暴露了异步接口。请参阅 功能示例 部分,以获取有关异步实现及其使用的更多信息。

入门指南

开始使用 riptun 的最简单方法是管理单个队列同步 TUN 设备

让我们先禁用异步支持,因为我们不会使用它

riptun = { version = "0.1", default-features = false, features = [] }

以下示例程序将创建一个名为 rip%d 的新 TUN 设备,其中 %d 将由操作系统替换为适当的值。然后,将返回确切的设备名称以及实际的 TUN 设备以供使用。然后,我们无限循环读取数据包并将其打印到 stdout

use riptun::Tun;

// First lets create a new single queue tun.
let tun = match Tun::new("rip%d", 1) {
    Ok(tun) => tun,
    Err(err) => {
        println!("[ERROR] => {}", err);
        return;
    }
};

// Lets make sure we print the real name of our new TUN device.
println!("[INFO] => Created TUN '{}'!", tun.name());

// Create a buffer to read packets into, and setup the queue to receive from.
let mut buffer: [u8; 1500] = [0x00; 1500];
let queue = 0;

// Loop forever reading packets off the queue.
loop {
    // Receive the next packet from the specified queue.
    let read = match tun.recv_via(queue, &mut buffer) {
        Ok(read) => read,
        Err(err) => {
            println!("[ERROR] => {}", err);
            return;
        }
    };

    // Print out the amount of data received and the bytes read off the queue.
    println!(
        "[INFO] => Received packet data ({}B): {:?}",
        read,
        &buffer[..read]
    );
}

一旦创建了 rip%d 设备,您需要向其添加一个 IP 地址。在 Linux 上,可以像这样操作

sudo ip addr add 203.0.113.2/24 brd 203.0.113.255 dev rip0
sudo ip link set dev rip0 up

示例

包含一系列示例,展示了 riptun 的功能。请注意,以下示例将需要提升权限以配置和创建实际的 Tun 接口。这通常意味着在 Unix 和 Windows 平台上具有 rootAdministrator 权限。

请参阅 示例目录 以获取有关可用示例程序的更多信息。

开发

riptun 库是用以下工具开发的

  • GNU Make
  • Rust 1.53+
  • Docker (仅限 Linux)

Make 用于简化构建/测试/打包命令。Makefile 将自动针对用于构建 riptun 的本地操作系统进行操作,并将自动构建该平台的所有配置目标。这意味着,为了在平台间构建和开发 riptun,只需确保具有 rust 和为配置目标提供的必需的 C 编译器即可。

编译

在本地操作系统上编译,请运行以下命令

$ make

这将编译所有本地操作系统目标,并以 debug 模式编译所有示例。要在 release 模式下构建,请运行以下命令

$ make BUILD=release

测试

测试 riptun 需要管理员权限,这是因为跨操作系统创建虚拟接口需要此级别的权限。

Linux

为了在 Linux 上运行端到端测试套件,请运行以下命令

# First ensure the `/dev/net/tun` virtual file exists.
$ sudo bash dist/bin/create-tun.sh
# Then go ahead and run the test suite.
$ sudo make check

Windows

TODO(csaide): 实现Windows支持。

Darwin

TODO(csaide): 实现Darwin支持。

BSD

TODO(csaide): 实现open/net/freebsd支持。

功能

异步支持默认启用,并且 riptun 可以直接用于 mio、tokio、async-std 和 smol。但是为了减小库的大小,您可以使用功能标志来启用或禁用每个集成。

  • async-std-impl 功能公开了 [AsyncStdQueue]/[AsyncStdTun] 结构体。
  • tokio-impl 功能公开了 [TokioQueue]/[TokioTun] 结构体。
  • mio-impl 允许在 mio 选择注册表中注册 [Queue] 结构体。

平台支持

《riptun》库旨在尽可能实现平台无关性。不幸的是,每个平台都需要特殊处理,因此每个平台都必须手动实现。当前和计划中的平台支持如下详细说明。

平台/架构支持矩阵

目标 同步支持 异步支持
x86_64-unknown-linux-gnu
aarch64-unknown-linux-gnu
armv7-unknown-linux-gnueabihf
armv7-unknown-linux-gnueabi
arm-unknown-linux-gnueabihf
arm-unknown-linux-gnueabi
x86_64-pc-windows-msvc
aarch64-pc-windows-msvc
x86_64-apple-darwin
aarch64-apple-darwin
x86_64-unknown-freebsd
aarch64-unknown-freebsd
x86_64-unknown-netbsd
aarch64-unknown-netbsd
x86_64-unknown-openbsd
aarch64-unknown-openbsd

© 版权所有 2021 Christian Saide

依赖关系

~2–13MB
~161K SLoC