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

2023-11-19

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下,要实现内核空间和用户空间数据的交互,有多种方式:
(1)可以通用socket创建特殊套接字,利用套接字实现数据交互;
(2)通过proc文件系统创建文件来进行数据交互;
(3)还可以使用设备文件的方式,访问设备文件会调用设备驱动相应的例程,设备驱动本身就是内核空间和用户空间的一个接口,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 <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 
执行以上命令后,出现如上输出,说明模块加载成功


2. 创建和配置虚拟网卡
确认是否有tunctl命令,如果没有通过yum安装即可
  [root@hunterfu ~]# yum install tunctl(centos6下)


创建虚拟网卡设备
  [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来进行创建和启动操作
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • socket error总结

    Socket error 0 Directly send error Socket error 10004 Interrupted function call Socket error 10013 Permission denied Soc
  • 硬中断和软中断

    本文主要内容 硬中断 软中断的原理和实现 内核版本 2 6 37 Author zhangskd csdn blog 概述 从本质上来讲 中断是一种电信号 当设备有某种事件发生时 它就会产生中断 通过总线把电信号发送给中断控制器 如果中断的
  • Windows下OMNET++的安装和各种架构调试心得

    以下所述的为windows平台下OMNET 集成在MSVC6 0环境下的使用方法 一 OMNET的安装 1 到OMNET官方网站下载windows平台下的安装程序 当前版本为omnetpp 3 2p1 win32 下载Ghostscript
  • Socket错误代码对应表(转)

    提示 在命令提示符下输入 net helpmsg 1xxxx就能够得到Windows系统提供的错误提示的详细解释 出现网络联机错误Socket error 11001 表示您的计算机无法连上服务器 请检查您的Proxy设定以及Proxy相关
  • 关于connect: network is unreachable 问题的解决

    由于发现原创文章 在未署名作者及出处的情况下被转载 在以后所有的原创文章开头我都会写明作者和出处 希望朋友们以后在转载本博客原创博文时注意标明文章作者及出处 作者 liukun321 咕唧咕唧 原文出处 http blog csdn net
  • 如何申请@MSN.Com后缀的邮箱?

    最近辞职在家无事 想申请个 MSN Com后缀的信箱 在网上搜索了一下 原来只要从下面的地址进入注册即可 注册抵制 https accountservices passport net reg srf ns msn com sl 1 lc
  • Network Error .Tap to load again.:-1202

    分析原因 1 可能是网络问题 确认网络是否正常 2 如果电脑上尝试没有问题 但是微信端有问题 可能是手机域名过期的问题 3 可能是域名证书未配置成功 导致微信认证被拦截了 配置即可
  • 计算机端口详解

    计算机端口详解 一 摘要 端口是个网络应用中很重要的东西 相当于 门 了 二 什么是端口 在 Internet上 各主机间通过TCP TP协议发送和接收数据报 各个数据报根据其目的主机的ip地址来进行互联网络中的路由选择 可见 把数据报顺
  • Zebra基本配置

    前言 Zebra是一个路由软件包 提供基于TCP IP路由服务 支持RIPv1 RIPv2 RIPng OSPFv2 OSPFv3 BGP 4 和 BGP 4 等众多路由协议 Zebra还支持BGP特性路由反射器 Route Reflect
  • socket包长度问题: send recieve(转载)

    一个包没有固定长度 以太网限制在46 1500字节 1500就是以太网的MTU 超过这个量 TCP会为IP数据报设置偏移量进行分片传输 现在一般可允许应用层设置8k NTFS系 的缓冲区 8k的数据由底层分片 而应用看来只是一次发送 win
  • 0.0.0.0,localhost,127.0.0.0的区别

    一 0 0 0 0 不同场景不同意思 在服务器中 0 0 0 0表示本机上的任意ip地址 比如本机有内外网两个ip 那么当服务A开通0 0 0 0的访问后 通过两个ip都可以访问服务A 比如 3306端口监听在127 0 0 1 只有本机客
  • Window平台---IPSEC客户端的安装

    1 安装主机证书 参见证书的申请与安装一节 2 从http vpn ebootis de 站点下载 ipsec exe 3 下载windwos2000的ipsec资源工具 http download microsoft com downlo
  • NetWork——关于TCP协议的三次握手和四次挥手

    0 准备知识 1 ACK TCP协议规定只有ACK 1时有效 也规定连接建立后所有发送的报文的ACK必须为1 2 SYN 在连接建立时用来同步序号 当SYN 1而ACK 0时 表明这是一个连接请求报文 对方若同意建立连接 则应在响应报文中使
  • 模式识别和计算机应用(转载)

    导读 只是覆盖了很小的范围 但总结的不错 1 数学方面 1 矩阵的各种分解 比如 LU QR Cholesky SVD Polar 2 广义逆与子空间 3 最小二乘法 特别齐性方程Ax b的各种解法及其几何意义 4 凸分析与凸优化的基本知识
  • TCP协议如何保证可靠传输

    TCP的功能是交付数据 所以TCP的可靠就是保证每次数据按序 按时 不丢数据 顺利的交付给对端 可靠不等于安全 TCP尽最大可能的保证数据可靠性 但是没有任何措施保证数据的安全性 所谓安全就是你的数据不会被别人看到或者窃取到 TCP上的数据
  • calico单个pod固定IP多pod固定ip池

    原理 主要利用calico组件的两个kubernetes注解 1 cni projectcalico org ipAddrs 2 cni projectcalico org ipv4pools 单个pod固定IP 利用注解cni proje
  • URL 地址栏锚点 window location hash 使用方法

    location是javascript里边管理地址栏的内置对象 比如location href就管理页面的url 用location href url就可以直接将页面重定向url 本文转自米扑博客 URL 地址栏锚点 window loca
  • 计算机网络——拥塞控制(1)

    1 拥塞 congestion 当过多的包在网络缓冲区中竞争某个相同链路时 队列会溢出丢包 当这种丢包成为普通事件时 则称网络发生拥塞 简单概述就是对聚合带宽的需求超过了链路的可用容量 1 1 产生原因 宏观原因 网络资源分布不均匀 流量分
  • VLAN划分及配置注意事项

    VLAN Virtual Local Area Network 即虚拟局域网 是将一个物理的LAN在逻辑上划分成多个广播域的通信技术 VLAN内的主机间可以直接通信 而VLAN间不能直接通信 从而将广播报文限制在一个VLAN内 VLAN之间
  • SO_RCVTIMEO超时errno

    首先打印一次recv调用失败的errno值和各个宏的值 由上可知 EAGIN和EWOULDBLOCK的值都是11 其实EAGIN是在setsockopt设置SO RCVTIMEO或SO SNDTIMEO后 recv或者send系列函数超时等

随机推荐

  • ubuntu 下实现 docker+ovs+quagga搭建网络---bgp

    注 本机上现有quagga镜像 ovs虚拟交换机 2 9 1 docker 18 09 7 实现bgp网络搭建 1 sudo ovs vsctl add br br1 增加一个ovs网桥br1 2 sudo docker images 查看
  • ADFS 概念与基本开发介绍 (1)

    如您转载本文 必须标明本文作者及出处 如有任何疑问请与我联系 me nap7 com ADFS 相关开发技术的中文资料相对匮乏 之前再弄这个东西的时候搞的比较辛苦 因此总结此文档 以解后人之忧 本文会首先介绍与联合身份验证有关的概念及相关的
  • 泰迪杯挑战赛优秀论文-A题-基于数据挖掘的上市公司高送转预测

    目 录 第 1 章 绪论 1 1问题背景 1 2问题重述 1 3本文主要工作与创新点 1 4模型假设 1 5本文研究意义 第 2 章 相关理论 2 1高送转相关知识介绍 2 1 1高送转的实质 2 1 2预测下一年上市公司高送转的一些其他条
  • Redis 事务

    目录 Redis 事务 一 Redis事务的概念 二 redis事务提出的逻辑 三 redis事务的基本操作 四 事务的执行流程 五 redis锁 六 redis分布式锁 Redis 事务 一 Redis事务的概念 Redis 事务的本质是
  • 3、思科模拟器介绍 (认识思科模拟器界面、安装思科模拟器、思科模拟器汉化)

    认识思科模拟器界面 标题栏 菜单栏 思科模拟器软件包 CSDN思科模拟器安装 https download csdn net download weixin 53645521 85135225 百度网盘思科模拟器安装包 链接 https p
  • 图像恢复(加噪与去噪)

    人工智能导论实验导航 实验一 斑马问题 https blog csdn net weixin 46291251 article details 122246347 实验二 图像恢复 https blog csdn net weixin 46
  • tar命令笔记

    作用 tar 可以保存文件属性 本身不具备压缩能力 配合gzip或者bzip 进行压缩解压缩 参数 相关参数如下 来自百度百科 c create 创建新的tar文件 x extract get 解开tar文件 t list 列出tar文件中
  • 火狐浏览器文本两端对齐无效text-align: justify

    找了很多地方 尝试很多办法都不好使 直到看到这篇 只需要设置了text align justify时加设一个white space pre line就可以了
  • [Docker]使用Docker部署Kafka

    Kafka 是一个分布式流处理平台 它依赖于 ZooKeeper 作为其协调服务 在 Kafka 集群中 ZooKeeper 负责管理和协调 Kafka 的各个节点 因此 要在 Docker 容器中启动 Kafka 通常需要同时启动一个 Z
  • 对数器的简单使用

    对数器 1 前言 2 内容 简介对数器 以排序算法的检测为实例 3 总结 4 更新日志 1 前言 学习左神的数据结构的过程中 推荐使用对数器检验自己的算法是否正确 2 内容 简介对数器 1 对数器的作用 在一个题目未OJ的时候 可以通过对数
  • Transformer学习笔记

    一 Transformer诞生背景 Transformer模型是解决序列转录问题的一大创新 在Transformer模型之前 序列转录模型都或多或少的基于复杂的循环或卷积神经网络 循环神经网络的计算是时序性的 位置的计算必须基于之前所有位置
  • 微信小程序数据 \n 换行符失效解决办法

    最近遇到一个问题 使用uni app写小程序时 拿到一个字符串 后台返回的 需要在 n 处换行 但是直接使用 let title 黄鹤楼送 n孟浩然之广陵
  • 使用python对银行信息管理系统的简单实现

    一 首先是用户属性的类 class account object 储存用户信息的类 def init self id1 name tel money self id id1 账户 self name name 姓名 self tel tel
  • mo管理器java_Android开发之通过包管理器获取安装应用信息

    最近在自己写一个APP 有一个模块需要获取手机应用的一些信息 坑还是有 但都基本踩过了 自己把他实现了出来 实现方法还是很需要掌握的 底部弹出的对话框中四个选项的实现不多做说明 主要讲讲如何获取这些安装的应用信息 好了 不多说 看看效果图
  • 1024,干程序才懂得节日!

    1024程序员节 1024程序员节是广大程序员的共同节日 1024是2的十次方 二进制计数的基本计量单位之一 针对程序员经常周末加班与工作日熬夜的情况 部分互联网机构倡议每年的10月24日为1024程序员节 在这一天建议程序员拒绝加班 程序
  • 【C/C++】报错问题积累

    1 出现Deprecated declaration XXX give arg types c文件中 有没有参数的函数时 声明需要加void即 main c void fun main h void fun void
  • androidX 在AndroidMainfest里面加入provider后编译不通过

  • 【three.js练习程序】创建简单物理地形

  • ubuntu 18.04 双系统安装

    下载镜像 Ubuntu 18 04 6 LTS Bionic Beaver 磁盘分区用于ubuntu存储 在C盘中分出200M用于ubuntu的引导启动 C盘已经分出200M空间 D盘分配出160G用于存储文件 U盘制作系统盘 刻录软件 推
  • linux下TUN或TAP虚拟网卡的使用

    tun tap 驱动程序实现了虚拟网卡的功能 tun表示虚拟的是点对点设备 tap表示虚拟的是以太网设备 这两种设备针对网络包实施不同的封装 利用tun tap 驱动 可以将tcp ip协议栈处理好的网络分包传给任何一个使用tun tap驱