虚拟局域网 VLAN(Virtual Local Area Network)

VLAN(Virtual Local Area Network)的中文名为"虚拟局域网"。

虚拟局域网(VLAN)是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能、部门及应用等因素将它们组织起来,相互之间的通信就好像它们在同一个网段中一样,由此得名虚拟局域网。VLAN是一种比较新的技术,工作在OSI参考模型的第2层和第3层,一个VLAN就是一个广播域,VLAN之间的通信是通过第3层的路由器来完成的。与传统的局域网技术相比较,VLAN技术更加灵活,它具有以下优点: 网络设备的移动、添加和修改的管理开销减少;可以控制广播活动;可提高网络的安全性。
在计算机网络中,一个二层网络可以被划分为多个不同的广播域,一个广播域对应了一个特定的用户组,默认情况下这些不同的广播域是相互隔离的。不同的广播域之间想要通信,需要通过一个或多个路由器。这样的一个广播域就称为VLAN。

这个问题其实已经困扰很多年了。
刚毕业那会,都去网吧上网,不会考虑那么多。
几年之后,申请了ADSL宽带,上网变得十分容易,同时自己电脑还具备了公网IP地址(当然是动态IP),
再下载一个花生壳客户端,于是有了一个固定域名,有了这个固定域名,做什么都方便了,
可以随意的在公司里远程自己家的电脑, 做任何需要做的事情。
有了这些还不满足,很想在家里远程公司的电脑,当时以为很简单,可仔细考虑之后,一点也不简单。
首先公司网管肯定不愿意员工在外面随意操控公司电脑,于是肯定是不愿意从网关上做端口映射。
中国的网络,很大一部分电脑都是做NAT转发的,尤其是公司电脑,他们不具备外网地址,不能从internet网直接访问。
有些网络更离谱,是通过多层NAT转发。
一直都想着解决这个问题,想着如何在家里控制公司的电脑,早期,从应用层软件解决,
做个服务程序,一个运行在家里的电脑,一个运行在公司电脑上,公司电脑通过TCP持续连接到家里电脑,
家里电脑通过这个TCP连接发送命令给公司电脑,从而达到控制公司电脑的目的,
但是这种办法是有限的,并不具备完全控制的目的。
当时多想有种办法,能让公司电脑和家里电脑互相访问,就像在一个网络里一样,
(这种办法其实早就有产品,类似VPN一样的东西,但是我只是个人需求,况且我真的是想自己解决这个问题)
当时局限于自己的知识水平,无法从驱动层面解决这个问题,只好搁置。

直到再几年后的现在,接触了windows驱动,尤其是NDIS驱动,知道该怎么解决这么一个问题,

并真正的建立起了属于自己的虚拟局域网络。

说到原理,其实并不是像想象的那么复杂。
要组建这么一个虚拟局域网,需要一下两个条件:
一,一个具有公网IP的机器和运行在此机器上的一个服务程序,这个程序类似HUB(集线器)一样,转发虚拟以太网数据包。
二,需要组建虚拟局域网的每台机器都需要安装一个虚拟网卡驱动程序和一个客户端程序。

NDIS驱动分为三层,
一是NIC驱动,又叫微端口驱动,直接跟物理网卡打交道,
二是协议驱动,用来处理类似TCP/IP等协议包,
三是中间层驱动,介于协议驱动和微端口驱动之间。大家熟悉的防火墙就属于中间驱动,它可以任意串改阻止数据包。

而这个用于组建虚拟局域网的网卡驱动,是属于底层的微端口驱动,本来物理网卡的微端口驱动是在
链路层上得到上层驱动的原始以太网数据包,并传输到物理网卡上去;从物理网卡上得到原始以太网数据包,并传递给上层驱动。
而虚拟网卡驱动注册一个功能设备,应用层程序用CreateFile打开这个设备,
调用Win32函数ReadFile/WriteFile,从驱动里读出以太网数据包和写入以太网数据包,
也就是本来把传输到物理网卡的工作,交给了这个注册的功能设备。

客户端应用程序打开虚拟网卡驱动注册的功能设备,从里边读取传输到这块虚拟网卡的原始以太网数据包,
通过真实的TCP/UDP套接字传输到公网机器上的一个服务程序上, 服务程序分析这个数据包,
并向正确的也在这个虚拟局域网的机器的客户端程序转发这个数据包,
客户端程序接收到属于发往自己的别的机器的原始以太网数据包,通过WriteFile写入到虚拟网卡驱动中,
从而完成数据交互。
为了减少服务器端压力,可以利用P2P等技术让两个需要通讯的机器直接通讯,但我这属于小网络,没必要搞那么复杂。
这样一个虚拟的局域网就这么组建起来了。
简单的说就是把属于真实的物理网络剥离出来,建立在internet公网的逻辑链路上。

这里的技术难点要属这个虚拟网卡驱动的开发,不过熟悉了之后,其实也不太难。

顺便一提的是,在多年前,搞得很火的浩方平台,能让大家在不同的网络里玩CS等局域网游戏,
记得上大学的时候,有很多人在玩,当时觉得很神奇,现在想想其实也不算什么,实现的原理都差不多的。

现在虚拟局域网是建立起来了,但是要怎么跟别的真实网络通讯呢,举个例子:
公司里有多台电脑,都是其他同事的,当然其中一台电脑肯定是自己的。
这些电脑都在同一个真实的局域网里,假设我家的电脑是A,公司里我的电脑是B,
并且都安装上了虚拟网卡,已经是组建好了的一个虚拟局域网,这个虚拟网只有A,B两台机器,
假设家里的A机器要访问其他同事的机器怎么办呢? 一个办法是让其他同事也装虚拟网卡,加入到这个虚拟网里。
但是多种原因,人家不一定愿意安装或者怕自己家的电脑成了公用机器给人随意访问。
其实一个办法是把公司的B机器作为NAT网关,这个虚拟网就在这个NAT之后,NAT软件网上可下载的很多,
也可以用windows自带的“Internet共享”功能,其实就是一个简单的NAT。
直到写这篇文章,我才调通了这个NAT功能,
方法如下:
首先在公司机器B上,设置好“Internet共享”,物理网卡右击属性-》高级-》Internet共享,
在这里的”家庭网络连接“,选择自己开发的虚拟网卡 ,
这样NAT算是设置好了,
接着要在家里的电脑A上加一条路由,这点很重要,否则无法访问。
比如公司真实局域网是 192.168.100.X, 虚拟局域网是 192.168.0.X, B机器的虚拟IP地址是192.168.0.1
在A机器上加:

router -p add 192.168.100.0 mask 255.255.255.0 192.168.0.1

意思是发往192.168.100.X网段的数据包,都朝网关 192.168.0.1(也就是公司的B机器)发送,
这样家里的机器就能正确的路由到公司的网络上。


如果万一要想家里的电脑和公司的所有同事的电脑都在一个网段怎么办呢?用桥接方式,
熟练Vmware的人一定很熟悉它的网络连接中的桥接方式,这里用到的技术跟Vmware的桥接技术差不多。

原理如下
需要开发一个NDIS协议驱动,在协议驱动里分析每个数据包,把发往虚拟局域网的数据包提取出来(这个通过IP地址来区分),
通过一个功能设备读取这些数据,发往客户端应用程序,应用程序发给公网的服务器程序,
客户端应用程序从公网机器获得数据包,写给协议驱动,协议驱动改写源MAC地址为真实的物理网卡地址,并发送出去。
这种叫MAC地址欺骗,真实局域网的其他机器一直以为都在同一台真实机器通讯,实际是和很多虚拟的机器通讯,
vmware即采用这种类似的技术实现桥接功能,让虚拟机IP地址跟真实网络融合在一起。