本文档的Copyleft归rosetta所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性。
参考资料:《Linux设备驱动程序 第三版》,snull源码,linux-2.6.10

曾经一段时间在看openswan源码,有一个问题迷惑我很久,就是它的那个ipsec虚拟网卡接口是怎么实现的?当时没有思路、没有想法,因为不知道从何着手去解决这个问题,最近接触到了内核模块的编写,又接触到openswan的klips模块,原来这一切全属于网络驱动程序编写范畴。现在我迫不及待的想去了解下它的实现,然后就有了这篇学习笔记……
本文只是初步讲解虚拟网卡实现的过程,最终实现一个虚拟网卡,对于具体体细节和数据包的发送和传送等等问题没有涉及。对于klips的ipsec0的实现大体上类似这个过程。
本文档注重实际实现过程,缺少理论知识。
本文档以《Linux设备驱动程序 第三版》为理论知识;以snull源码为学习对象。为贪图省力,所帖源码来至snull源码和linux-2.6.10内核源码。

一、最终的效果,实现了一个名为sn0的虚拟网卡接口
[root@xxx snull]# cat /proc/net/dev
Inter-|   Receive
face |bytes    packets errs drop fifo
lo:    6528      76    0    0    0
eth0:148681882  216304    0    0    0
eth1:       0       0    0    0    0
eth2:       0       0    0    0    0
sit0:       0       0    0    0    0
sn0:       0       0    0    0    0
sn1:     210       3    0    0    0

[root@xxx snull]# ifconfig sn0  up
[root@xxx snull]# ifconfig sn0