Table of Contents

VPN TUN

TUN编程

源代码

编译

测试运行

执行程序,生成虚拟设备

为tun设备分配IP地址

ping tun设备



VPN TUN

  1. 应用程序A是一个普通的程序,通过socket A发送了一个数据包,假设这个数据包的目的IP地址是192.168.3.1

  2. socket将这个数据包丢给协议栈

  3. 协议栈根据数据包的目的IP地址,匹配本地路由规则,知道这个数据包应该由tun0出去,于是将数据包交给tun0

  4. tun0收到数据包之后,发现另一端被进程B打开了,于是将数据包丢给了进程B

  5. 进程B收到数据包之后,做一些跟业务相关的处理,然后构造一个新的数据包,将原来的数据包嵌入在新的数据包中,最后通过socket B将数据包转发出去,这时候新数据包的源地址变成了eth0的地址,而目的IP地址变成了一个其它的地址,比如是10.33.0.1.

  6. socket B将数据包丢给协议栈

  7. 协议栈根据本地路由,发现这个数据包应该要通过eth0发送出去,于是将数据包交给eth0

  8. eth0通过物理网络将数据包发送出去

TUN编程

源代码

/*** TUN/TAP编程示例*/
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <linux/if_tun.h>
#include <stdlib.h>
#include <stdio.h>int tun_alloc(int flags)
{struct ifreq ifr;int fd, err;char *clonedev = "/dev/net/tun";//打开tun设备if ((fd = open(clonedev, O_RDWR)) < 0) {return fd;}memset(&ifr, 0, sizeof(ifr));ifr.ifr_flags = flags;if ((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0) {close(fd);return err;}printf("Open tun/tap device: %s for reading...\n", ifr.ifr_name);return fd;
}int main()
{int tun_fd, nread;char buffer[1500];/* Flags: IFF_TUN   - TUN device (no Ethernet headers)*        IFF_TAP   - TAP device*        IFF_NO_PI - Do not provide packet information*/tun_fd = tun_alloc(IFF_TUN | IFF_NO_PI);if (tun_fd < 0) {perror("Allocating interface");exit(1);}while (1) {//从tun设备读取数据nread = read(tun_fd, buffer, sizeof(buffer));if (nread < 0) {perror("Reading from interface");close(tun_fd);exit(1);}printf("Read %d bytes from tun/tap device\n", nread);}return 0;
}

编译

# gcc tun.c -o tun

测试运行

执行程序,生成虚拟设备

为tun设备分配IP地址

ping tun设备

尽管在网段192.168.3.XX或192.168.4.XX中除去192.168.3.11和192.168.4.11两个IP地址外,其他不存在(因为我为本地,确定不存在其他IP地址),但是根据路由,ping发出去的报文仍需要通过tun设备进行发送,如下图

疫情下的远程办公:理解Linux虚拟网络设备之tun/tap相关推荐

  1. linux虚拟网络设备之tun/tap(一)

    在现在的云时代,到处都是虚拟机和容器,它们背后的网络管理都离不开虚拟网络设备,所以了解虚拟网络设备有利于我们更好的理解云时代的网络结构.从本篇开始,将介绍Linux下的虚拟网络设备. 虚拟设备和物理设 ...

  2. Linux虚拟网络设备之tun/tap

    Table of Contents 虚拟设备和物理设备的区别 tun/tap的另一端是什么? tun/tap设备有什么用? tun和tap的区别 示例 示例程序 演示 结束语 参考 在现在的云时代,到 ...

  3. linux虚拟网络设备之tun/tap驱动程序设计原理(五)

    简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在li ...

  4. 网络设备中的linux,理解linux虚拟网络设备veth

    原标题:理解linux虚拟网络设备veth 前面介绍了linux network namespace,接着介绍一下如何让一个独立的网络命名空间和主机的网络互通,这里我们需要用到linux虚拟网络设备v ...

  5. 理解linux虚拟网络设备bridge

    上一节我们介绍了Linux veth设备,知道了如何把多个彼此隔离的网络命名空间(下面开始简称NS)与主机通过VETH连接起来,并且多个NS间也能相互通信,在这一节我们将介绍另一种方式,用linux ...

  6. Linux 虚拟网络设备

    一.tun/tap(虚拟网卡) TUN/TAP设备浅析(一) – 原理浅析 - 简书 (jianshu.com) (3条消息) Linux-虚拟网络设备-tun/tap_sld880311的专栏-CS ...

  7. linux虚拟网络设备之bridge(桥)(三)

    继前两篇介绍了tun/tap和veth之后,本篇将介绍Linux下常用的一种虚拟网络设备,那就是bridge(桥). 本篇将通过实际的例子来一步一步解释bridge是如何工作的. 什么是bridge? ...

  8. Linux - 虚拟网络设备 - bridge,veth,namespace

    引用 轻松理解 Docker 网络虚拟化基础之网络 namespace! 轻松理解 Docker 网络虚拟化基础之 veth 设备! 深入理解 Linux 上软件实现的"交换机" ...

  9. Linux 虚拟网络设备 tun/tap veth pair

    Linux 虚拟网络设备 tun/tap veth pair 本篇主要介绍一下 linux 下面的 虚拟网络设备 tun/tap veth pair 随着容器逐步取代虚拟机,成为云基础架构的标准,然而 ...

最新文章

  1. win7压缩包安装mysql_win7怎么安装mysql5.7.13压缩文件图解
  2. python关联分析代码_1行代码实现关联分析(Apriori)算法
  3. Windows 市场份额十年来首次跌破 90%
  4. 四步解读python生成器
  5. boost :: dynamic_bitset时序测试
  6. java常见笔试_Java 常见笔试题(2)
  7. 《计算机网络》_学习笔记(一)
  8. 乐观锁的颗粒度_MySql数据库锁机制详解
  9. ssm中怎么用location.href跳到controller层_聊聊自动驾驶中的功能开发
  10. oracle编程基本语法,oracle编程基础语法
  11. Linux文件默认权限——umask
  12. Vagrant:将装在C盘的虚拟机移动到别的目录
  13. 在机关事业单位工作年满五十岁,工龄三十年提前退休好还是继续工作好?
  14. 爱客影院自动采集源码v3.5.5
  15. lisp 标注螺纹孔_尺寸标注之螺纹标注的正确方式
  16. 1、节假日万年历API接口,免费好用
  17. 揭秘网站的seo技术 ---seo与seoer 王泽宾
  18. 历经一个月的时间,在大家的共同努力下新星计划圆满结束,让我们看一下详细数据吧!
  19. Logstash报错:[ERROR][logstash.agent ] Failed to execute action {...
  20. 基于ThinkPHP框架的学生管理系统+留言板后台管理系统

热门文章

  1. git同时推送项目到GitHub和Gitee
  2. Spring框架----Spring的基于XML的AOP的实现
  3. hdu 3123(GCC)数论
  4. MySQL 性能分析 之 联合索引(复合索引)实践分析
  5. 【spark】示例:连接操作
  6. servlet和JSP页面乱码问题
  7. 没有在该机执行windows脚本宿主的权限_解决办法
  8. markdown 流程图js_在Markdown中用mermaid语法绘制图表
  9. qthread run结束了算销毁吗_Java线程的run()方法和start()方法有什么区别?
  10. github 码云 获取_开发记录篇使用VS2019管理github项目