硬货 | 利用 Linux tap/tun 虚拟设备写一个 ICMP echo 程序
Posted bakari
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了硬货 | 利用 Linux tap/tun 虚拟设备写一个 ICMP echo 程序相关的知识,希望对你有一定的参考价值。
本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。
前面两篇文章已经介绍过 tap/tun 的原理和配置工具。这篇文章通过一个编程示例来深入了解 tap/tun 的程序结构。
01 准备工作
首先通过 modinfo tun
查看系统内核是否支持 tap/tun 设备驱动。
[[email protected] ~]# modinfo tun
filename: /lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/net/tun.ko.xz
alias: devname:net/tun
alias: char-major-10-200
license: GPL
author: (C) 1999-2004 Max Krasnyansky <[email protected]>
description: Universal TUN/TAP device driver
retpoline: Y
rhelversion: 7.5
srcversion: 50878D5D5A0138445B25AA8
depends:
intree: Y
vermagic: 3.10.0-862.14.4.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: E4:A1:B6:8F:46:8A:CA:5C:22:84:50:53:18:FD:9D:AD:72:4B:13:03
sig_hashalgo: sha256
在 linux 2.4 及之后的内核版本中,tun/tap 驱动是默认编译进内核中的。
如果你的系统不支持,请先选择手动编译内核或者升级内核。编译时开启下面的选项即可:
Device Drivers => Network device support => Universal TUN/TAP device driver support
tap/tun 也支持编译成模块,如果编译成模块,需要手动加载它:
[[email protected] ~]# modprobe tun
[[email protected] ~]# lsmod | grep tun
tun 31665 0
关于以上的详细步骤,网上有很多教程,这里就不再赘述了。
https://blog.csdn.net/lishuhuakai/article/details/70305543
上面只是加载了 tap/tun 模块,要完成 tap/tun 的编码,还需要有设备文件,运行命令:
mknod /dev/net/tun c 10 200 # c表示为字符设备,10和200分别是主设备号和次设备号
这样在 /dev/net
下就创建了一个名为 tun 的文件。
02 编程示例
2.1 启动设备
使用 tap/tun 设备,需要先进行一些初始化工作,如下代码所示:
int tun_alloc(char *dev, int flags)
{
assert(dev != NULL);
struct ifreq ifr;
int fd, err;
char *clonedev = "/dev/net/tun";
if ((fd = open(clonedev, O_RDWR)) < 0) {
return fd;
}
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = flags;
if (*dev != '