虚拟网卡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用户同意是人用户区域的标明,标明记忆力在SKB。,于是呼唤枢要应变量NEIFTIFRX(SKB) 将SKB发送到TCP/IP拟定议定书栈处置,满足虚拟网卡的标明接纳。

小结

tun/tap驾驶很巧妙的将角色驾驶和网卡驾驶调配肩并肩的,本文注意剖析两种传动方法经过的门路。,微不足道的的驾驶器处置的详述缺少微不足道的列出。,请参阅相干提出。。

参考资料

发表评论

Close Menu