0221-使用 TUN 来进行通信

环境

  • Time 2022-11-20
  • WSL-Ubuntu 22.04
  • Rust 1.65.0
  • pnet 0.31.0
  • tun-tap 0.1.3

前言

说明

参考:https://docs.rs/pnet_packet/latest/pnet_packet/index.html
参考:https://www.kernel.org/doc/html/latest/networking/tuntap.html

目标

数据链路层基本上就这样了,接下来看看三层的协议。
TUN 属于三层设备,可以模拟三层的数据交换。

新建 TUN 设备

root@jiangbo12490:~# ip tuntap add tun0 mode tun
root@jiangbo12490:~# ip addr add 172.24.51.244/20 dev tun0
root@jiangbo12490:~# ip link set up dev tun0
root@jiangbo12490:~# ip addr show tun0
22: tun0: <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 500
    link/none
    inet 172.24.51.244/20 scope global tun0
       valid_lft forever preferred_lft forever

main.rs

fn main() -> std::io::Result<()> {
    let iface = Iface::without_packet_info("tun0", Mode::Tun)?;

    let mut buffer = vec![0; 1500];

    loop {
        let size = iface.recv(&mut buffer)?;
        println!("{:?}", &buffer[..size]);
    }
}

Cargo.toml

[package]
edition = "2021"
name = "network"
version = "1.0.0"

[dependencies]
pnet = "0.31.0"
tun-tap = "0.1.3"

pnet_packet 和 pnet_datalink 统一到 pnet 包里。

发送回应

iface.send(eth.packet_mut()).unwrap();

抓包结果

使用 ping 命令抓包,ping -I tun0 172.24.51.243

root@jiangbo12490:~# tcpdump -X -i tun0
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes

21:44:12.370724 IP 172.24.51.244 > 172.24.51.243: ICMP echo request, id 46399, seq 306, length 64
        0x0000:  4500 0054 ad63 4000 4001 cd2d ac18 33f4  E..T.c@.@..-..3.
        0x0010:  ac18 33f3 0800 d5dd b53f 0132 2cd2 7c63  ..3......?.2,.|c
        0x0020:  0000 0000 fea7 0500 0000 0000 1011 1213  ................
        0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223  .............!"#
        0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233  $%&'()*+,-./0123
        0x0050:  3435 3637                                4567
21:44:13.410790 IP 172.24.51.244 > 172.24.51.243: ICMP echo request, id 46399, seq 307, length 64
        0x0000:  4500 0054 adbe 4000 4001 ccd2 ac18 33f4  E..T..@.@.....3.
        0x0010:  ac18 33f3 0800 4e40 b53f 0133 2dd2 7c63  ..3...N@.?.3-.|c
        0x0020:  0000 0000 8444 0600 0000 0000 1011 1213  .....D..........
        0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223  .............!"#
        0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233  $%&'()*+,-./0123
        0x0050:  3435 3637                                4567

总结

新增了三层的模拟设备 TUN,使用 ping 命令和抓包工具来验证了通信的正常。

附录

posted @   jiangbo4444  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-08-13 【JavaScript】Object 实例属性
点击右上角即可分享
微信分享提示