linux下TUN/TAP虚拟网卡的使用

 转载:http://wushank.blog.51cto.com/3489095/1306849

  tun/tap 驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中。
开源项目openvpn (http://openvpn.sourceforge.net)和Vtun(http://vtun.sourceforge.net)都是利用tun/tap驱动实现的隧道封装。

  一、Tun/Tap驱动程序工作原理

  做为虚拟网卡驱动,Tun/Tap驱动程序的数据接收和发送并不直接和真实网卡打交道,他在Linux内核中添加了一个TUN/TAP虚拟网络设备的驱动程序和一个与之相关连的字符设备 /dev/net/tun,字符设备tun作为用户空间和内核空间交换数据的接口。当内核将数据包发送到虚拟网络设备时,数据包被保存在设备相关的一个队列中,直到用户空间程序通过打开的字符设备tun的描述符读取时,它才会被拷贝到用户空间的缓冲区中,其效果就相当于,数据包直接发送到了用户空间。通过系统调用write发送数据包时其原理与此类似。

  在linux下,要实现内核空间和用户空间数据的交互,有多种方式:可以通用socket创建特殊套接字,利用套接字实现数据交互;通过proc文件系统创建文件来进行数据交互;还可以使用设备文件的方式,访问设备文件会调用设备驱动相应的例程,设备驱动本身就是内核空间和用户空间的一个接口,Tun/tap驱动就是利用设备文件实现用户空间和内核空间的数据交互。

  从结构上来说,Tun/tap驱动并不单纯是实现网卡驱动,同时它还实现了字符设备驱动部分。以字符设备的方式连接用户空间和内核空间。下面是示意图:

          

Tun/tap 驱动程序中包含两个部分,一部分是字符设备驱动,还有一部分是网卡驱动部分。利用网卡驱动部分接收来自TCP/IP协议栈的网络分包并发送或者反过来将接收到的网络分包传给协议栈处理,而字符驱动部分则将网络分包在用户空间和内核空间之间传送,模拟物理链路的数据接收和发送。Tun/tap驱动很好的实现了两种驱动的结合。

二、Tun/Tap网卡创建

  1. 确认内核是否支持tun/tap

1  [root@hunterfu]# modinfo tun
2   filename:       /lib/modules/2.6.34.7-56.fc13.i686.PAE/kernel/drivers/net/tun.ko
3   alias:          char-major-10-200
4   license:        GPL
5   author:         (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
6   description:    Universal TUN/TAP device driver
7   srcversion:     880DE258930FE60D765B735
8   depends:
9   vermagic:       2.6.34.7-56.fc13.i686.PAE SMP mod_unload 686 

 2.加载内核模块 -

   [root@hunterfu ~]# modprobe tun

   [root@hunterfu ~]# lsmod | grep tun

     tun 10548 1 

 执行以上命令后,出现如上输出,说明模块加载成功;

2. 创建和配置虚拟网卡

 

   确认是否有tunctl命令,如果没有通过yum安装即可

    [root@hunterfu ~]# yum install tunctl

   创建虚拟网卡设备

   [root@hunterfu ~]# tunctl -t tap0 -u root

   设置虚拟网卡

   [root@hunterfu ~]# ifconfig tap0 192.168.0.1 netmask 255.255.255.0 promisc

  经过如上操作后,虚拟网卡已经建立和配置好了。

3. 作为系统服务随系统自动启动创建虚拟网卡

  • 编写配置脚本(符合chkconfig规范)
  •  1 [root@hunterfu ~]# cat /etc/init.d/config_tap
     2   #!/bin/bash
     3   #
     4   # config_tap          Start up the tun/tap virtual nic
     5   #
     6   # chkconfig: 2345 55 25
     7
     8   USER="root"
     9   TAP_NETWORK="192.168.0.1"
    10   TAP_DEV_NUM=0
    11   DESC="TAP config"
    12
    13   do_start() {
    14     if [ ! -x /usr/sbin/tunctl ]; then
    15       echo "/usr/sbin/tunctl was NOT found!"
    16       exit 1
    17     fi
    18     tunctl -t tap$TAP_DEV_NUM -u root
    19     ifconfig tap$TAP_DEV_NUM ${TAP_NETWORK}  netmask 255.255.255.0 promisc
    20     ifconfig tap$TAP_DEV_NUM
    21   }
    22
    23   do_stop() {
    24     ifconfig tap$TAP_DEV_NUM down
    25   }
    26   do_restart() {
    27     do_stop
    28     do_start
    29   }
    30   check_status() {
    31     ifconfig tap$TAP_DEV_NUM
    32   }
    33
    34   case $1 in
    35     start)    do_start;;
    36     stop)     do_stop;;
    37     restart)  do_restart;;
    38     status)
    39               echo "Status of $DESC: "
    40               check_status
    41               exit "$?"
    42               ;;
    43     *)
    44       echo "Usage: $0 {start|stop|restart|status}"
    45       exit 1
    46   esac

    可以根据具体需求修改此脚本

  • 加入到系统服务中
  • [root@hunterfu ~]# chkconfig --add config_tap 
  • [root@hunterfu ~]# chkconfig --level 345 config_tap on
  • 操作完成后,就可以像其他标准服务一样,通过service config_tap start来进行创建和启动操作
时间: 2024-08-03 16:53:56

linux下TUN/TAP虚拟网卡的使用的相关文章

在Linux系统下使用TUN/TAP虚拟网卡的基本教程

在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备.不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能.TAP 等同于一个以太网设备,它操作第二层数据包如以太网数据帧.TUN模拟了网络层设备,操作第三层数据包比如IP数据封包.操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据.在后种情况下,TUN/TAP设备向

Linux下Nginx配置虚拟主机VirtualHost实例教程

增加 Nginx 虚拟主机 这里假设大家的 Nginx 服务器已经安装好, 不懂的请阅读各 linux 发行版的官方文档或者 LNMP 的安装说明. 配置 Virtual host 步骤如下: 进入 /usr/local/nginx/conf/vhost 目录, 创建虚拟主机配置文件 demo.neoease.com.conf ({域名}.conf). 打开配置文件, 添加服务如下:    代码如下 复制代码 server {     listen          80;           

linux下c通过虚拟地址映射读写文件

#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<sys/stat.h> #include<string.h> #include<sys/mman.h> struct stu { char name[20]; int age; float score; }; //1 打开文件,2 映射到虚拟地址,3 写入数据

linux下mount/unmount命令

格式:mount [-参数] [设备名称] [挂载点] 其中常用的参数有:-a 安装在/etc/fstab文件中类出的所有文件系统.-f 伪装mount,作出检查设备和目录的样子,但并不真正挂载文件系统.-n 不把安装记录在/etc/mtab 文件中.-r 讲文件系统安装为只读.-v 详细显示安装信息.-w 将文件系统安装为可写,为命令默认情况.-t  指定设备的文件系统类型,常见的有: ext2  linux目前常用的文件系统 msdos  MS-DOS的fat,就是fat16 vfat  w

虚拟网卡 TUN/TAP 驱动程序设计原理

原文http://www.ibm.com/developerworks/cn/linux/l-tuntap/index.html 简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在linux环境下的设计思路. tun/tap驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装.利用

虚拟网卡TUN/TAP驱动程序设计原理

虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在linux环境下的设计思路. tun/tap 驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装.利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路

linux tun/tap-Linux tun/tap 应用程序

问题描述 Linux tun/tap 应用程序 我写了一个程序,来对tun驱动进行操作,能创建 tun设备 ping也ping的通,但是我程序 里用read函数对tun设备进行读取时,为什么读取不到数据呢?按理说 有数据写到虚拟网卡后,然后我在读tun 的字符 应该有数据,但是不知道为什么没数据.求大神解答 解决方案 http://blog.chinaunix.net/uid-317451-id-92474.html

Linux下双网卡绑定bond0

一:原理: linux操作系统下双网卡绑定有七种模式.现在一般的企业都会使用双网卡接入,这样既能添加网络带宽,同时又能做相应的冗余,可以说是好处多多.而一般企业都会使用linux操作系统下自带的网卡绑定模式,当然现在网卡产商也会出一些针对windows操作系统网卡管理软件来做网卡绑定(windows操作系统没有网卡绑定功能 需要第三方支持).进入正题,linux有七种网卡绑定模式:0. round robin,1.active-backup,2.load balancing (xor),  3.

SUSE Linux 10下如何重命名网卡

前阵子碰到suse linux下网卡重命名的问题,是在虚拟机上安装RAC,通过复制虚拟机后需要完成的.与redhat linux,以及oralce linux不同的处理方式,下面将其记录下来,供参考. 1.新节点的网络配置 #启动节点之后没有任何IP配置信息     bo2dbp:~ # ifconfig lo        Link encap:Local Loopback inet addr:127.0.0.1  Mask:255.0.0.0 inet6 addr: ::1/128 Scop