Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1234083
  • 博文数量: 220
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1769
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-13 16:19
个人简介

努力, 努力, 再努力

文章分类

全部博文(220)

文章存档

2018年(8)

2017年(46)

2016年(75)

2015年(92)

我的朋友

分类: 系统运维

2017-05-18 14:12:01

转自: http://www.tuicool.com/articles/mu6vY3

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

  • 确认内核是否有tun模块

    [root@hunterfu]# modinfo tun  filename: /lib/modules/2.6.34.7-56.fc13.i686.PAE/kernel/drivers/net/tun.ko  alias: char-major-10-200  license: GPL  author: (C) 1999-2004 Max Krasnyansky >  description: Universal TUN/TAP device driver  srcversion: 880DE258930FE60D765B735  depends:  vermagic: 2.6.34.7-56.fc13.i686.PAE SMP mod_unload 686
  • 加载内核模块 -

    [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规范)

    [root@hunterfu ~]# cat /etc/init.d/config_tap  #!/bin/bash # # config_tap          Start up the tun/tap virtual nic # # chkconfig: 2345 55 25 USER="root" TAP_NETWORK="192.168.0.1" TAP_DEV_NUM=0
      DESC="TAP config" do_start() { if [ ! -x /usr/sbin/tunctl ]; then echo "/usr/sbin/tunctl was NOT found!" exit 1 fi tunctl -t tap$TAP_DEV_NUM -u root
        ifconfig tap$TAP_DEV_NUM ${TAP_NETWORK} netmask 255.255.255.0 promisc
        ifconfig tap$TAP_DEV_NUM } do_stop() {
        ifconfig tap$TAP_DEV_NUM down 
      } do_restart() {
        do_stop
        do_start
      } check_status() {
        ifconfig tap$TAP_DEV_NUM } case $1 in start)    do_start;;
        stop)     do_stop;;
        restart)  do_restart;;
        status) echo "Status of $DESC: " check_status exit "$?" ;;
        *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac
    可以根据具体需求修改此脚本
  • 加入到系统服务中

    [root@hunterfu ~]# chkconfig --add config_tap   [root@hunterfu ~]# chkconfig --level 345 config_tap on
    操作完成后,就可以像其他标准服务一样,通过 service config_tap start 来进行创建和启动操作

阅读(839) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~