这篇文章中,主要给大家分享下在linux的tcp/ip协议栈中tap/tun设备所处的地位以及这种技术的使用和实验讲解。本文只讨论以太网的物理网卡,并且以linux 3.x内核的一个UDP包的发送过程作为示例,由于本人对协议栈的代码不熟,借鉴了网络资源学习相关流程和知识,有些地方可能理解有误,欢迎指正。
- 1.1 application通过各类的语言的套接字接口,再通过系统调用与内核进行交互,设置相关的套接字参数。
- 1.2 进行发送数据时,进入协议栈的UDP协议层。
- 2.1 主要是根据目的ip查询路由表获取出接口、网卡信息,绑定socket和ip之间的关系。
- 2.2 构造skb包,设置UDP、IP头部的信息。
- 2.3 发往ip层。
- 3.1 设置ip头部的信息。
- 3.2做netfilter的hook函数,进行一些访问控制、nat之类的策略,然后重新查询路由的操作。
- 3.3做ip分片。
- 3.4做arp查询,构造skb的二层头部数据。
4. netdevice子系统
- 4.1处理对应设备的qdisc(loopbackp或者ip tunnels设备没有)。
- 4.2处理traffic control,进行一些过滤和优先级处理。
- 4.3在dev_hard_start_xmit中做一次数据包的旁路处理(tcpdump就是在这里通过原始套接字抓包)。
- 4.4通过ndo_start_xmit发送到具体的驱动(如果是tun、tap设备就是对应的tun驱动)。
- 5.1将skb放到对应的网卡队列中、发送数据。
- 5.2发送中断给cpu,做相关清理工作。
- 1.1User Application A通过套接字(socket A)发数据发给使用与eno16777736处于同一个网段ip的应用程序,数据走向为通过socket A发给协议栈,最后通过netdevice子系统中的eno16777736的设备驱动(以太网驱动)发送出去,这个是通过真实的物理网卡发送出去。
- 1.2User Application B通过套接字(socket B)发送数据给使用与nsfocus_tun0处于同一个网段ip的应用程序,数据走向为通过socket B发送给协议栈,最后通过netdevice子系统中的nsfocus_tun0的设备驱动(tun驱动)发送出去。由于tun设备没有对应真实的物理网卡,所以nsfocus_tun0对端收取数据的是User Application C。User Application C通过读写/dev/tun设备文件进行数据的收发。
- 2.1我们将在基于amd设备上的Centos7进行实验。
- 2.2代码
2.3.3 查看接口信息,生成了一个nsfocus_tun0接口
2.3.5 使用tcpdump抓包,保存为tun.pcap
2.3.6使用wireshark包分析,如图的三个包都是ip包,每个ip包是84字节。
因为通过读写/dev/tun设备可以直接从协议栈的三层读写ip包,所以tun设备常用于vpn、tunnel、ipsec之类的。
- 1.1User Application A通过套接字(socket A)发数据发给使用与eth处于同一个网段ip的应用程序,数据走向为通过socket A发给协议栈,最后通过netdevice子系统中的eno16777736的设备驱动(以太网驱动)发送出去,这个是通过真实的物理网卡发送出去
- 1.2User Application B通过套接字(socket B)发送数据给使用与nsfocus_tap0处于同一个网段ip的应用程序,数据走向为通过socket B发送给协议栈,最后通过netdevice子系统中的nsfocus_tap0的设备驱动(tun驱动)发送出去。由于tun设备没有对应真实的物理网卡,所以nsfocus_tap0对端收取数据的是User Application C。User Application C通过读写/dev/tun设备文件进行数据的收发。
- 2.1我们将在基于amd设备上的Centos7进行实验。
- 2.2代码如图
2.3.2 查看接口信息,生成了一个nsfocus_tun0接口
2.3.4使用tcpdump抓包,保存为tap.pcap
2.3.5使用wireshark包分析,图中的三个包都是arp请求的mac帧
2.3.6使用arp命令手动添加ip和mac的映射,重复上述操作
2.3.7使用wireshark包分析,图中的三个包都是封装了icmp报文的mac帧,每个mac帧是98字节。
因为通过读写/dev/tun设备可以直接从协议栈的二层读写mac帧,所以tap设备常用语构建实现网桥、虚交换机等.
如有意成为绿盟科技博客作者,欢迎进入作者群讨论!
绿盟科技博客作者QQ群:695158981

绿盟科技博客作者微信群:
