Linux内核网络设备——tun、tap设备

这篇文章中,主要给大家分享下在linux的tcp/ip协议栈中tap/tun设备所处的地位以及这种技术的使用和实验讲解。本文只讨论以太网的物理网卡,并且以linux 3.x内核的一个UDP包的发送过程作为示例,由于本人对协议栈的代码不熟,借鉴了网络资源学习相关流程和知识,有些地方可能理解有误,欢迎指正。

tcp/ip协议栈分层和netdevice子系统

1. socket层

  • 1.1 application通过各类的语言的套接字接口,再通过系统调用与内核进行交互,设置相关的套接字参数。
  • 1.2 进行发送数据时,进入协议栈的UDP协议层。

2. UDP层

  • 2.1 主要是根据目的ip查询路由表获取出接口、网卡信息,绑定socket和ip之间的关系。
  • 2.2 构造skb包,设置UDP、IP头部的信息。
  • 2.3 发往ip层。

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驱动)。

Device Driver

  • 5.1将skb放到对应的网卡队列中、发送数据。
  • 5.2发送中断给cpu,做相关清理工作。

tun设备的基本使用

1. tun设备的数据走向

  • 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. tun设备实验

  • 2.1我们将在基于amd设备上的Centos7进行实验。
  • 2.2代码
  • 2.3 现象如下:
2.3.1查看接口信息
2.3.2编译、运行程序
2.3.3 查看接口信息,生成了一个nsfocus_tun0接口
给这个接口配置一个ip,查看接口信息
2.3.4 ping地址192.168.3.12
tun程序收到了数据
2.3.5 使用tcpdump抓包,保存为tun.pcap
2.3.6使用wireshark包分析,如图的三个包都是ip包,每个ip包是84字节。

3. tun设备的场景应用

因为通过读写/dev/tun设备可以直接从协议栈的三层读写ip包,所以tun设备常用于vpn、tunnel、ipsec之类的。

tap设备的基本使用

1. tap设备的数据走向

  • 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. tun设备实验

  • 2.1我们将在基于amd设备上的Centos7进行实验。
  • 2.2代码如图
  • 2.3 现象如下。
2.3.1查看接口信息
2.3.1编译、运行程序
2.3.2 查看接口信息,生成了一个nsfocus_tun0接口
给这个接口配置一个ip,查看接口信息
2.3.3ping地址192.168.3.12
tap程序收到了数据
2.3.4使用tcpdump抓包,保存为tap.pcap
2.3.5使用wireshark包分析,图中的三个包都是arp请求的mac帧
2.3.6使用arp命令手动添加ip和mac的映射,重复上述操作
显示tap程序收到了3个包
2.3.7使用wireshark包分析,图中的三个包都是封装了icmp报文的mac帧,每个mac帧是98字节。

3. tun设备的场景应用

因为通过读写/dev/tun设备可以直接从协议栈的二层读写mac帧,所以tap设备常用语构建实现网桥、虚交换机等.
—————————————
如有意成为绿盟科技博客作者,欢迎进入作者群讨论!

绿盟科技博客作者QQ群:695158981

 

 

 

 

 

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

 

Spread the word. Share this post!

Meet The Author

Leave Comment