40 个版本
0.11.5 | 2024 年 6 月 6 日 |
---|---|
0.11.2 | 2023 年 10 月 29 日 |
0.9.0 | 2023 年 7 月 9 日 |
0.7.0 | 2022 年 8 月 18 日 |
0.2.3 | 2020 年 10 月 28 日 |
#141 in 网络编程
9,985 每月下载量
用于 6 crates
33KB
715 代码行
Tokio TUN/TAP
使用 tokio
在 Rust 中异步分配 TUN/TAP 设备。对于 async-std
版本,请使用 async-tun。
入门
- 使用
Tun::builder()
创建 tun 设备,并在循环中读取它
#[tokio::main]
async fn main() {
let tun = Arc::new(
Tun::builder()
.name("") // if name is empty, then it is set by kernel.
.tap(false) // false (default): TUN, true: TAP.
.packet_info(false) // false: IFF_NO_PI, default is true.
.up() // or set it up manually using `sudo ip link set <tun-name> up`.
.try_build() // or `.try_build_mq(queues)` for multi-queue support.
.unwrap(),
);
println!("tun created, name: {}, fd: {}", tun.name(), tun.as_raw_fd());
let (mut reader, mut _writer) = tokio::io::split(tun);
// Writer: simply clone Arced Tun.
let tun_c = tun.clone();
tokio::spawn(async move{
let buf = b"data to be written";
tun_c.send_all(buf).await.unwrap();
});
// Reader
let mut buf = [0u8; 1024];
loop {
let n = tun.recv(&mut buf).await.unwrap();
println!("reading {} bytes: {:?}", n, &buf[..n]);
}
}
- 使用
sudo
运行代码
sudo -E $(which cargo) run
- 设置设备地址(也可以使用
TunBuilder
设置地址和网络掩码)
sudo ip a add 10.0.0.1/24 dev <tun-name>
- ping 来读取数据包
ping 10.0.0.2
- 显示设备并分析网络流量
ip tuntap
sudo tshark -i <tun-name>
支持的平台
- Linux
- FreeBSD
- Android
- OSX
- iOS
- Windows
示例
sudo -E $(which cargo) run --example read
sudo -E $(which cargo) run --example read-mq
依赖项
~4–13MB
~141K SLoC