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
62KB
866 行
riptun
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 平台上具有 root
或 Administrator
权限。
请参阅 示例目录 以获取有关可用示例程序的更多信息。
开发
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