UPDATE

2012.04.18 :我对之前的武断表示歉意,原以为n2n会有良好的发展前景,然而前两天再去查看n2n的SVN时发现,最后一次更新是2010年,看来这些小众的开源项目,终究是逃脱不掉成为孤儿的命运。替代品是tinc

企业发展到一定规模的时候大都在全国乃至全球设置分支机构,它们的地理位置分散,在VPN没有出现之前,这些分支机构之间的网络互联只能通过租用专线实现,然而租用专线的费用高昂,一般企业无法承受。

随着互联网的发展,互联网的接入越来越廉价,嗅觉敏锐的厂家推出了替代专线的解决方案:在Internet的基础上实现一张虚拟的专用网络,这就是VPN(virtual private network 虚拟专用网)的由来。它一方面采用了Internet作为传输媒介,租用成本大大降低;另一方面通过IPsec等多种安全协议实现了等同于专线般安全的效果,因此普一推出便大受欢迎,checkpoint、cisco、juniper等都有成熟的商业解决方案,然而它们针对的是企业市场,对于个人用户而言还是过于高贵了,直到2003年情况才发生改变。

2003年,日本筑波大学的一名学生登游大发布了SoftEther这款软件,该软件允许用户将两台位于NAT/防火墙之后的电脑实现互联,这在当时引起了很大的轰动,为什么会这样呢?请看下图:

image::{img-dual-nat}[dual-nat]

熟悉TCP/IP的读者应该知道,在互联网上通信的双方都必须有公网IP,然而公网IP的数量有限,往往是多个人通过NAT方式共享一个公网IP,所以只能是由私网的用户去访问公网的服务器,无法由公网的用户直接访问私网的主机。这在早期的互联网应用中倒也相安无事,因为当时上网主要是浏览新闻。

随着互联网的发展,p2p应用层出不穷,1999年诞生的napster顿时名动天下,因为它是第一个以p2p方式共享文件的软件。后来相继诞生了许许多多的p2p应用,然而它们都只是在应用层实现了p2p,软件提供什么应用,用户就只能使用这些应用,而SoftEther不同,它直接在网络层实现了p2p,换句话说就是用户透过SoftEther可以实现联网游戏、文件共享、远程访问、视频会议等大量的互联网应用,所以这在当时赢得大量网友的青睐,为什么?因为CS、因为魔兽,这些网络游戏需要在联网对战,而玩友的电脑大都隐匿在NAT之后,SoftEther为他们实现了互联的美好愿望。

2004年4月份,SoftEther公司成立。

2004年8月,SoftEther正式推出1.0版本,开始闭源,开始收钱。

2006年,推出2.0版,更名为PacketiX VPN,号称重写了全部源代码,跟SoftEther 1.0一点关系都没有,与个人用户渐行渐远……

提起SoftEther就不得不提VNN,VNN是国人开发的一款类似软件,虽然其推出的时间要比SoftEther早些,但是一直没有得到广泛的关注,后来2004年5月份,登游大抱怨VNN主页抄袭了SoftEther的主页样式,还在日本媒体中大势宣传。当时的CCF精品技术论坛上还掀起了一番激烈的讨论,这时VNN才逐渐进入众人的视野。其实两款软件实现的原理有很大的不同,SoftEther通过在ssl over tcp来保证安全,而VNN使用udp进行封装;SoftEther客户端需要在互联网上找一个公用的虚拟hub来实现互联,而VNN的客户端需要到VNN公司的服务器上进行注册才能实现连接;SoftEther客户端之间的通信需要通过虚拟hub中转,而VNN客户端注册完毕之后就可以实现点对点的互联。它们之间唯一的共同点就是都使用了虚拟网卡。令人惊奇的是两家发生矛盾的原因竟然是主页过于雷同而不是源代码的抄袭,这在软件史上倒是头一遭,权当作是茶余饭后的谈资。 VNN是一款闭源软件,不提供服务器版本,用户需要登录到官方的服务器上进行验证之后然后才能建立p2p通信隧道。现在由北京宇华亿欣科技有限公司推广运营,已经发展到了4.0版,功能很丰富,只是需要收取服务费,这表明它已经不跟个人用户玩了。

有压迫的地方就有起义,有需求的地方就有市场,2005年,LogMeIn公司看中了p2p VPN的个人市场,推出了hamachi,它的实现原理跟VNN类似,而且可在多种OS中运行,win2k、win2k3、vista自然不在话下,还可以在Linux和OSX下跑,甚至破天荒的推出了Nokia770的版本,这对移动商务人士来说可是一大噱头。时至今日,hamachi已经发展到了1.0.3,值得一提的是hamachi的版本升级非常谨慎,从0.9.9.9到1.0,总共发布了61个测试版本,时间跨度为2年,除了foobar和wine,估计无人能敌了。

hamachi相对于SoftEther/VNN的优势在于

  • 对于个人用户免费;

  • 零配置,使用非常简单;

  • 体贴的管理功能,由用户自己组建网络,管理组内成员;

  • 采用了RSA、DH group、AES256和HMAC-SHA1多种安全技术;

这些优势对个人用户是非常具有杀伤力的,单单免费这一项就可以把SoftEther和VNN踩在脚下,然而,hamachi的安全性还是值得怀疑,请看下图:

image::{img-hamachi-arch}[hamachi-arch]

用户需要登录到hamachi的服务器进行注册才能建立隧道,由于hamachi是一款闭源的商业软件,LogMeIn公司是否会截获用户的数据流就不得而知了,因此,在p2p VPN这个肥沃的市场中,软件公司要真的要好好想想商务模式,否则技术实现方案再好,用户不接受也是白搭。

hamachi就这样不温不火的发展着,直到2008年,ntop的作者Luca Deri开始研究p2p VPN,他一方面看到公众对p2p VPN有着强烈的需求,另一方面又不满足已有产品的现状,于是n2n诞生了。

image::{lnk-n2n-arch}[n2n-arch]

如上图所示,n2n是一个二层架构的VPN网络,其中super node提供场所,让两个位于NAT/防火墙之后的edge node进行会面,一旦双方完成首次握手,剩下的数据流就之发生在两个edge node之间,如果有一方的NAT属于对称型(symmetrical),super node则还需继续为双方提供数据包的转发;edge node负责数据流的加解密,原理很简单。

对于一个VPN而言,主要涉及封装和加解密两个步骤,edge node使用UDP协议进行封装,目的是为了更好的兼容防火墙的策略,因为很多防火墙禁用了非TCP/UDP协议禁用。加密算法则采用了twofish,好处开源、简便,处理速度快。

为了降低设计难度,n2n利用了tap/tun虚拟网卡,这样做得好处是一方面软件尺寸极小,一方面源码的依赖性极低,可以很容易移植到嵌入式设备中,目前有openwrt的版本,在未来的计划中,还将移植到android和iPhone中。

相对于hamachi,n2n最大的优势在于:

  1. 开源,任何人都可以检查代码,看看是否有猫腻,而hamachi是闭源的,LogMeIn是否会截获密钥不得而知,一旦截获密钥,就可以对流经hamachi服务器的数据包进行解码。n2n的加解密过程由edge node实现,只有两端的用户知道协商好的共享密钥,super node无从知晓。

  2. 灵活性,n2n允许用户在Internet上自行创建super node,也可以利用任何一个公开的super node。hamachi用户则必须登录到LogMeIn服务器才能创建隧道。

n2n支持的OS也非常广,Linux、FreeBSD、MAC OSX、甚至windows,不过由于n2n只提供源代码,需要用户自行手工编译。

下面就介绍一下如何在Debian Lenny中安装和使用n2n。

  • 添加源

    $ sudo vim /etc/apt/sources.list
    deb-src http://mentors.debian.org/debian/ unstable main contrib non-free
    $ sudo apt-get update
  • 下载&编译

    $ sudo apt-get source n2n
    $ sudo apt-get install fakeroot build-essential devscripts (1)
    $ sudo apt-get build-dep n2n (2)
    $ cd /usr/src/n2n_1.2.2~svn3653
    $ sudo debuild -us -uc (3)
    1 安装编译环境所需的组件,debuild是devscripts软件包中的一个脚本,编译的时候需要用到
    2 编译n2n的过程可能需要一些lib的支持,该步骤就是让debian判断并下载安装相关的lib
    3 如果不是Debian的维护者,需要打上-us和-uc这两个标签,避免编译完后签名
  • 安装

    $ sudo dpkg --install n2n_1.2.2~svn3653_i386.deb
  • 使用

这样就可以将两台位于NAT/防火墙之后的电脑互联起来了,是不是特别简单呢?

n2n是一个很有前途的p2p VPN软件,优秀的设计理念将会为它带来大量的用户群,随着时间的流逝,SoftEther,VNN,hamachi将成为过眼烟云,唯有开源的n2n才是永恒。