[root@localhost ~]# vim /etc/yum.repos.d/nux-misc.repo

    [nux-misc]
    name=Nux Misc
    baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
    enabled=0
    gpgcheck=1
    gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
    ubuntu 是 apt-get install uml-utilities。

    [root@node-10-120-13-236 ~]# tunctl
    Set ‘tap3’ persistent and owned by uid 0
    [root@node-10-120-13-236 ~]# tunctl -n
    Set ‘tun0’ persistent and owned by uid 0
    [root@node-10-120-13-236 ~]# tunctl -n
    Set ‘tun1’ persistent and owned by uid 0

    tcp/ip协议栈分层和netdevice子系统
    原文在 http://blog.nsfocus.net/linux-tun-tap/

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

    1. tun设备的场景应用
      因为通过读写/dev/tun设备可以直接从协议栈的三层读写ip包,所以tun设备常用于vpn、tunnel、ipsec之类的。
      tap设备的基本使用
    2. 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字节。

    1. tun设备的场景应用 (注: 这里应该是 原文错误,应该是 tap)
      因为通过读写/dev/tun设备可以直接从协议栈的二层读写mac帧,所以tap设备常用语构建实现网桥、虚交换机等.