0018-使⽤tun虚拟⽹络接⼝建⽴IP隧道的实例-Writtenby1//dev/net/tunintfd;fd=open("/dev/net/tun",O_RDWR));structifreqifr;memset(&ifr,0,sizeof(ifr));ifr.ifr_flags=IFF_TUN|IFF_NO_PI;strcpy(ifr.ifr_name,"tun0");ioctl(fd,TUNSETIFF,(void*)&ifr);使⽤tun虚拟⽹络接⼝建⽴IP隧道的实例----Writtenbywhowin通常的socket编程,⾯对的都是物理⽹卡,Linux下其实很容易创建虚拟⽹卡;本⽂简单介绍下⼀Linux虚拟⽹卡的概念,并以tun设备为例在客端⼾和服务器端分别建个⽴⼀实际的虚拟⽹卡,最终实现个⼀从客端⼾到服务器的简单的IP隧道,希望本⽂能对理解虚拟⽹卡和IP隧道有所帮助,本⽂将提供完整的源程序;阅读本⽂需要具备在Linux下使⽤C语⾔进⾏IPv4下socket编程的基本能⼒,本⽂对⽹络编程的初学者难度较⼤。1.Linux下的虚拟⽹卡TUN/TAPTUN和TAP是Linuxn内核的虚拟⽹络设备,不同于普通靠硬件⽹络适配器实现的设备,这些虚拟的⽹络设备全部⽤软件实现,并可以向运于⾏Linux上的应⽤软件提供与硬件的⽹络设备完全相同的功能;TAP等同于个⼀以太⽹设备,它操作OSI模型的第⼆层(数据链路层)数据包,通常我们所使⽤的⽹络就是以太数⽹据帧,所以要使⽤TAP设备,就需要⾃⼰构建以太⽹报头、IP报头、TCP/UDP报头;TUN模拟了⽹络层设备,操作第三层(⽹络层)数据包,通常我们使⽤的TCP/UDP报⽂在⽹络层使⽤的IP协议,所以使⽤TUN设备,需要⾃⼰构建IP报头和TCP/UDP报头,⽐TAP设备少构建个⼀以太⽹报头;Linux通过TUN/TAP设备向绑定该设备的⽤⼾空间的应⽤程序发送数据;同样,⽤⼾空间的应⽤程序也可以像操作硬件⽹络设备那样,通过TUN/TAP设备发送数据;在后⾯这种情况下,TUN/TAP设备向Linux的⽹络协议栈提交数据包,从⽽模拟从外部接收数据的过程;2.构建个⼀TUN设备上⼀节的描述显然过于枯燥,可能会对初次接触虚拟⽹卡的读者感到困惑,不知所云,本节将实际建个⽴⼀tun设备,帮助你⾛出困惑;构建个⼀基本的tun设备,只需要两个步骤1.编写个⼀程序,⾄少完成三个任务以可读写模式打开设备⽂件向Linux内核注册个⼀tun设备名称,本例中为tun0(structifreq)定义在头⽂件中,在我的很多章中⽂都有介绍,如章⽐⽂《如何使⽤rawsocket发送UDP报⽂》,如果需要,可以参考;编写处理tun0接收/发送数据的程序charbuffer[BUFSIZE];while(1){read(fd,buffer,BUFSIZE);//todo}sudoifconfigtun010.0.0.1netmask255.255.255.0upifconfig0018-使⽤tun虚拟⽹络接⼝建⽴IP隧道的实例-Writtenby2/route-n2.为设备分配IP地址(本例中为tun0分配的IP为10.0.0.1)把上⾯的代码段⽚组合在起⼀,就可以完成个⼀tun设备的建⽴,⽂件名:tun_01.c(点击⽂件名下载源⽂件)这段程序在进循⼊环前增加了system("ifconfigtun010.0.0.1/24up"),为tun0分配了IP地址10.0.0.1,所以运⾏完后就不需要再为这个设备分配IP了;编译:gcc-Walltun-01.c-otun-01该程序需要root权限运⾏,主要是因为其中使了⽤ioctl,运⾏:sudo./tun-01运⾏该程序,会构建个⼀tun设备,打开个新⼀的终端,使⽤将可以看到系统中多了个⼀虚拟⽹络接⼝tun0,使⽤查看路由也会看到增加了⼀条关于tun0设备的路由图1:构建个⼀tun设备后尽管建起了⽴虚拟⽹卡tun0,但因为程序过于简单,所以这样建⽴的设备什么事情都做不了,必须完善程序,才能让这个设备真正地发挥作⽤;route-n0018-使⽤tun虚拟⽹络接⼝建⽴IP隧道的实例-Writtenby3/tun设备是个第三⼀层(⽹络层)的设备,在这个设备上只能收到IP报头,收不到以太⽹报头,所以Linux索性没有为tun设备分配MAC地址;后⾯将以本节的程序为基础,不断改进,最终写出个⼀简单的IP隧道的程序。3.使⽤tun设备的基本数据流向设备建起⽴来以后,程序员关⼼的是我们如何从这个设备上收发报⽂,如何处理这些报⽂;对于个物⼀理⽹络接⼝⽽⾔,接端⼝⼀连接着⽹络协议栈,另端⼀连接着物理⽹络;⽽对于个⼀虚拟⽹络接⼝⽽⾔,接⼝的端⼀仍然连接着⽹络协议栈,但是另端⼀连接着个⼀应⽤程序,也就是我们前下⾯载的那个程序(tun-01.c),我们把这个程序称为application-tun;可以和个物⼀理⽹络接...