vpn工作原理和搭建方法

之前为了翻墙,专门写过一篇《关于shadowsocks的一些思考》来说明它的工作原理,借助博客深入原理沉淀下来,对自己对他人都会有很大的帮助。

ss翻墙有一个必要的前提就是客户端本身必须支持socks5协议(比如浏览器一般都支持socks5配置),这样才能将和客户端本地的shadowsocks socks5代理进程互换数据,不过这也造成了很多软件是没法通过ss实现翻墙的,因此,我需要vpn来解决这个问题。

vpn的原理

vpn:英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”。vpn通常拿来做2个事情,一个是可以让世界上任意2台机器进入一个虚拟的局域网中(当然这个局域网的数据通讯是加密的,很安全,用起来和一个家庭局域网没有区别),一个是可以用来翻墙。

vpn比ss更加底层,它通过操作系统的接口直接虚拟出一张网卡,后续整个操作系统的网络通讯都将通过这张虚拟的网卡进行收发。这和任何一个代理的实现思路都差不多,应用层并不知道网卡是虚拟的,这样vpn虚拟网卡将以中间人的身份对数据进行加工,从而实现各种神奇的效果。具体来说,vpn是通过编写一套网卡驱动并注册到操作系统实现的虚拟网卡,这样数据只要经过网卡收发就可以进行拦截处理。

一句话,vpn在IP层工作,而ss在TCP层工作。

翻墙用途

baiviet000181

需要在vps上部署vpn server,客户端所有数据将经过虚拟网卡的加密封装后都转发给vps上的vpn server,由它来转发给目标服务器,这和ss server原理类似,由vpn协议加密从而绕过GFW实现访问墙外网站,下面将以pptp vpn协议为例说明。

假设要访问谷歌,那么客户端发出的数据包首先通过协议栈处理封装成IP包,其源地址是虚拟网卡的地址,例如:192.168.0.2,而目标地址是谷歌的IP。

原始IP包交给虚拟网卡发送时,PPTP网卡驱动会按PPP协议对这个IP包整体加密封装作为新的payload,用一层新的IP头封装这个payload发送出去,这个新IP头的目标地址是vpn server,源地址是客户端的外网IP。

vpn server的协议栈会剥离掉新IP头,将内部PPP协议的payload交给pptpd进程处理,pptpd进程会按PPP协议解包得到原始的IP包,我们知道这个IP包的源地址是192.168.0.2,目标地址google。因此,pptpd进程需要做的是将这个IP包的源IP地址改为vps的地址,然后将IP包发给谷歌,从而和谷歌进行数据交换。最终,pptpd理所应当将谷歌的应答IP包的目标IP地址换成192.168.0.2,然后经过PPP协议封装并添加新的IP头后发回给客户端既可。

不过要注意在pptpd的实现里,这个源地址修改是通过iptables实现的,也就是添加通过iptables添加一个NAT规则,实现来源地址的映射转换,这个在你配置pptp的过程中就会看到。

局域网用途

drawing3

大家知道,玩CS的时候都是局域网搜索房间的,要求大家坐在一个网吧里连着一台交换机。如果大家各自坐在家里玩CS想联机,通常要登录一个对战平台,其实对战平台做的事情就是VPN,也就是虚拟一个局域网,大家感受起来就和坐在一起一样。

虚拟网卡的驱动会尽力伪装成一个物理网卡的样子,我们知道DHCP协议是局域网动态分配客户端IP的协议,那么VPN的虚拟网卡其实也会和vpn server进行一些协商得到一个虚拟局域网的IP,比如192.168.0.2。得到虚拟IP后,后续数据将通过虚拟网卡发送至vpn server所在的IP,最终被pptpd进程处理。

既然各个客户端的虚拟网卡都是和同一个pptpd进程交互,那么这个pptpd进程自然知道这个虚拟的局域网内有哪些局域网用户,因此当2个虚拟局域网用户192.168.0.2和192.168.0.3之间想互相通讯的时候,pptpd会完成数据的中转。不过要注意,虚拟局域网用户间的通讯是不需要像访问谷歌那样修改数据包的源IP地址的,这个很容易想明白。

上面只是站在一个小白的角度理解这个过程,真实的pptp协议还用到了GRE协议,但并不是理解的重点。一个真实的pptpd进程包含一个在端口1723上tcp监听的父进程用来与各vpn client协商隧道信息,pptpd后续会给每个client创建一个子进程专门负责client的数据交互,而这个交互的协议就是GRE协议。

GRE直接在IP层之上实现,内核剥离IP透之后会解析GRE协议并根据GRE中的隧道ID将数据包分派给对应的pptpd子进程。子进程则通过raw socket对GRE包进行读写,利用raw socket可以方便的向任何隧道写出数据和读入数据,可以说pptpd的vpn隧道是直接依赖GRE协议的,有了GRE协议可以很方便的实现不同隧道间的数据交互,因为每个隧道的数据在GRE头中都有唯一ID标识(ID是1723端协商而来的),这就是虚拟局域网的大概实现原理。

当然,就像上面的图片描述的那样,VPN也常用于在家连接办公网,这是因为VPN server有另外一张网卡与办公网是局域网的关系,因此可以通过VPN server间接的访问到办公网,此时vpn server的帐号密码鉴权系统就显得尤为重要了。

最后

由上可知,pptpd工作起来很像一个路由器,除了能访问谷歌,还能实现虚拟局域网。同时,由于其实现上是一张虚拟网卡,因此对所有应用都可以适用。

PPTPD搭建请参考:http://blog.mimvp.com/2016/07/aliyun-centos7-set-up-vpn/

在最新MAC系统里,已经不支持PPTPD协议了,所以可以付费购买shimo vpn client或者免费不太好用的的flowvpn connect。

本文内容可能存在理解偏差,欢迎纠正。

 

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~