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

版本 日期 状态 修订人 摘要
V1.0 2016-03-28 创建 HunterFu 创建文档

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

确认内核是否支持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 <maxk@qualcomm.com>
    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 
    

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

创建和配置虚拟网卡

  • 确认是否有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
    

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

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

  • 编写配置脚本(符合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 来进行创建和启动操作