虚拟网卡TUN/TAP 驱动程序设计原理 – 我是韦哥

过去,韦戈写道。Linux下TUN/TAP素养的表明规律 》一文,它只指敝两个用户航线暗击中要害表明途径。,并无阐明Tun虚拟网卡车道是以无论哪个方法获得的,我要责备预告一篇文字解说这点。,它先前被果断的地重现了。,道谢的话作者,剧本、广播稿或许电影剧本在在这一点上。:虚拟网卡TUN/TAP 试验性的设计规律

简介

虚拟网卡Tun/tap车道是无论哪个人开源展现,支撑物多类UNIX平台,OpenVPN和Vtun都鉴于此获得了隧道包的封装。。本文将引见tun/tap车道的应用并剖析虚拟网卡tun/tap车道顺序在Linux特殊性下的设计思绪。

tun/tap
车道顺序获得了虚拟网卡的效能,TUN教虚拟素养是对等素养。,TAP表现虚拟素养是以太网素养。,这两个素养为用网覆盖包获得不同的的包。。应用tun/tap
车道,可以将tcp/ip拟定议定书栈处置好的用网覆盖分装传给无论哪个无论哪个人应用TUN/TAP车道顺序的航线,经过颠换重行处置捕获量发生送回自然的链路。。开源展现
openvpn( )和Vtun( 承认都是Tun/TAP车道顺序获得的隧道封装。。

应用TUN/TAP车道顺序

在Linux 2.4内核版本和晚上好版本,tun/tap车道是作为体系默许预先准备好的编制进内核击中要害。在应用以前,确保Tun/TAP模块先前装载而且素养用纸覆盖先前蜂:

#modprobe tun
#mknod /dev/net/tun c 10 200

参量C是角色素养。, 10和200是主素养号和二次素养号RES。。

这么大的,敝可以在顺序中应用车道顺序。。

应用TUN/TAP素养的示例顺序(OpenOpenPN开源展现摘) ,用纸覆盖)

int open_tun (康斯特 char *dev, char *actual, int 规模)
{
  struct ifreq ifr;
  int fd;
  char *device = "/dev/net/tun";
  if (FD) = open (有基地的), O_RDWR)) < 0) //创办扮演符
    msg (M_ERR, "Cannot open TUN/TAP dev %s", device);
  memset (&ifr, 0, sizeof (ifr));
  ifr.ifr_flags = IFF_NO_PI;
  if (!strncmp (dev, "tun", 3)) {  
      ifr.ifr_flags |= IFF_TUN;
   }
  else if (!strncmp (dev, "tap", 3)) {
      ifr.ifr_flags |= IFF_TAP;
    }
  else {
    msg (M_FATAL, "I don''t recognize device %s as a TUN or TAP device",dev);
    }
  if (strlen (dev) > 3)		/* unit number specified? */
    strncpy (, dev, IFNAMSIZ);
  if (ioctl (FD), TUNSETIFF, (虚空) *) IFR) < 0) //翻开虚拟网卡
    msg (M_ERR, "Cannot ioctl TUNSETIFF %s", dev);
  set_nonblock (FD));
  msg (M_INFO, "TUN/TAP device %s opened", );
  strncpynt (actual, , 规模);
  return fd;
}

召集是你这么说的嘛!功能后,可以在shell命令行下应用IFCONFIG。 命令施展虚拟网卡了,创造的角色素养扮演符,在顺序中应用read和write功能就可以读取或许发发出要旨虚拟的网卡要旨了。

TUN/TAP车道器的任务规律

做 为虚拟网卡车道,Tun /TAP车道顺序的要旨收执和发送与实践不率直的互相牵连,它是经过用户财产转移的。。在Linux下,获得核有理性的和用户财产要旨。 彼此,有很多方法。:全世界的插座可用来创造特别插座。,应用Socket获得要旨彼此;经过PROC用纸覆盖体系创办要旨彼此;您还可以应用素养用纸覆盖。 式,号召素养用纸覆盖召集素养车道顺序的相符合例程。,素养车道顺序亲手是感情财产和用户财产暗击中要害管嘴。,TUN/TAP车道顺序是应用素养用纸覆盖获得要旨间的交流 互。

从作文上讲,TUN/TAP车道顺序责备复杂的网卡车道顺序。,同时,还获得了角色素养车道顺序。。应用角色素养衔接用户财产和内感情态。上面是示意图。:

Tun/tap 车道顺序象征两把正式送入精神病院。,把正式送入精神病院是角色素养车道顺序。,另一把正式送入精神病院是NIC车道顺序把正式送入精神病院。。应用网卡车道把正式送入精神病院收执源自TCP/IP拟定议定书栈的用网覆盖分装捕获量发生送或许反之将接 收到的用网覆盖分装传给拟定议定书栈处置,角色车道把正式送入精神病院在内核和U暗中转移用网覆盖。,模仿自然的链路击中要害要旨收执与发送。TUN/TAP车道顺序先前获得了两种。 车道集成。

上面是Tun/TAP素养体系作文的清晰度。:

struct tun_struct {
	char 姓名〔8〕 //素养名
	unsigned long 		flags; Tun与TAP素养的分别
	struct fasync_struct    *fasync; 用纸覆盖异步通牒作文
	wait_queue_head_t 	read_wait; //准备妥队列
	struct net_device	dev;  //linux 分离用网覆盖素养作文
	struct sk_buff_head 	txq; 用网覆盖缓冲队列
    struct net_device_stats	stats; NIC财产要旨作文
};

struct NETI素养作文是由T弥补的一致用网覆盖素养作文。,清晰度了体系的一致号召管嘴。。

Tun/tap车道中获得的网卡车道的处置例程:

static int tun_net_open(struct net_device DEV);
static int tun_net_close(struct net_device DEV);
static int tun_net_xmit(struct sk_buff *skb, struct net_device DEV);使成群发送例行的顺序
static void tun_net_mclist(struct net_device DEV);为多位置的转移肉体美地址表
static
struct net_device_stats *tun_net_stats(struct net_device
DEV);当应用顺序需求意识用网覆盖管嘴的大约计算总数要旨时,,这样地功能可以召集。,如IFCONFIG、NETSTAT等。。
int tun_net_init(struct net_device DEV);用网覆盖素养设定初值顺序

角色素养把正式送入精神病院:

在Linux,角色素养和块素养一致以用纸覆盖的方法号召,号召它们的管嘴是一致的。,应用OPEN()功能翻开素养用纸覆盖或踏出的路用纸覆盖。,应用Read()和写()功能来读取和写用纸覆盖等。。Tun/TAP车道顺序清晰度的角色素养的号召管嘴为:

static struct file_operations tun_fops = {
owner: THIS_MODULE,
llseek: tun_chr_lseek,
read tun_chr_read,
write: tun_chr_write,
poll: tun_chr_poll,
ioctl: tun_chr_ioctl,
open: tun_chr_open,
release: tun_chr_close,
fasync: tun_chr_fasync
};

在内核中应用MISCX自动记录器 该功能完全符合为非标准角色素养车道顺序。,弥补与角色素养的杂多的顺序管嘴。从\\车道顺序\NET中蒸馏信号

static struct miscdevice tun_miscdev=
{
        TUN_MINOR,
        "net/tun",
        &tun_fops
};
int __init tun_init(虚空))
{
	…
	if (misc_register(&tun_miscdev)) {
		printk(KERN_ERR "tun: Can''t register misc device %d\n", TUN_MINOR);
		return -EIO;
	}
	return 0;
}

翻开Tun/TAP有基地的时,open 功能将召集TuniChrxOnter()功能。,大约要紧的设定初值颠换将达到。,包孕设置网卡车道顺序设定初值效能和设定初值 的设定初值。TUN/TAP车道网卡的完全符合嵌入到角色中。,它是经过对角色素养用纸覆盖扮演符应用自清晰度的ioctl设置象征 TunSETIFF达到了网卡的完全符合。。上面是功能召集相干的示意图。:

使 应用IOCTL()功能操纵者角色素养用纸覆盖扮演符,将召集角色素养击中要害TuniChryIOCTL。 设置无论哪个人先前翻开的Tun/TAP素养。,结果设置被象征为TunsTIFF,则召集tun_set_iff() 功能,这样地效能将达到无论哪个人非常要紧的议事程序。,执意对网卡车道举行完全符合register_netdev(&tun->dev),NIC车道顺序的杂多的处置 例程的挂接在open操控时由tun_chr_open()功能设定初值好了。

TUN/TAP器件的任务颠换:

Tun/tap 素养弥补的虚拟网卡车道,从TCP/IP拟定议定书栈的角度看,它与真正的NIC车道顺序无分别。。从球棒的角度,它与Tun/TAP击中要害NIC不同的。 由素养获取的要旨责备自然的链路。,它源自用户区域。,TUN/TAP素养车道顺序按角色获得用户区域的要旨收集。Tun/TAP素养不发送要旨。 发送到自然的链路。,它经过角色素养发送到用户区域。,而且由其他用户走过发送。。

发送颠换:

使 应用TUN/TAP网卡顺序经过PR向试验性的转交要旨,车道顺序召集完全符合的HARDARSTARTXXMIT功能。 送,hard_start_xmit功能又会召集tun_net_xmit功能,SKB将被添加到SKB列表中。,而且应用Tun/TAP设置意识闭塞。 角色车道的读要旨处置,捕获量tun/tap素养的角色车道把正式送入精神病院召集其tun_chr_read()颠换读取skb链表,并将每个读取的SKB发发出要旨用户。 区,达到虚拟网卡的要旨发送。

收执要旨的颠换:

当 敝应用write()体系召集向tun/tap素养的角色素养用纸覆盖写要旨时,将召集TunthCrxWrand功能。,它应用 TunyGETHub用户承受源自用户区域的要旨,要旨希腊字母第12字在SKB。,而且召集秘诀功能NEIFTIFRX(SKB) 将SKB发送到TCP/IP拟定议定书栈处置,达到虚拟网卡的要旨收执。

小结

tun/tap车道很巧妙的将角色车道和网卡车道平安相处被拖,本文注意剖析两种传动方法暗击中要害连接点。,分钟的车道器处置的特殊性无分钟列出。,请参阅互相牵连用纸覆盖。。

参考资料

发表评论

Close Menu