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。

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

 

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

vpn工作原理和搭建方法》有33个想法

  1. Pingback引用通告: 利用vpn连通vps上的samba – 鱼儿的博客

    1. yuer 文章作者

      wordpress是php开源项目,是一个CMS,你可以写自己的java web,通过CMS链接页面过去~

      回复
  2. love_sjh

    我是个学生,之前分别配置过shadowsocks和vpn来避开校园网收费,但是原理一直没搞清楚,看了您的博客后,困扰已久的问题终于搞清楚了,谢谢!!!

    回复
  3. 小白白

    那么使用vpn 就是用了 虚拟网卡了白,怎么控制 流量的分流呢???也就是说一部分走虚拟网卡,一部分走 真实网卡???? 路由么????

    回复
    1. yuer 文章作者

      这个与你本机路由表有关吧,VPN网卡的网段,物理网卡的网段,默认网关是哪个。

      根据我似有似无的记忆,好像默认网关都被改成了VPN。

      回复
  4. Pingback引用通告: 优雅地科学上网 – 洛逸轩

  5. Pingback引用通告: 翻墙原理 – hello littlepudding

  6. lee

    感谢作者的文章,对很多东西理解又深了一层。但是《关于shadowsocks的一些思考》这篇文档链接失效了,作者能付重新发一下这篇文档。感谢!

    回复
  7. Pingback引用通告: 使用Node实现简单的内网穿透 – Python量化投资

  8. bigdaronlee

    pptpd理所应当将谷歌的应答IP包的目标IP地址换成192.168.0.2,然后经过PPP协议封装并添加新的IP头后发回给客户端既可。

    这个地方的应答包的IP地址不应该hi客户端的外网地址吗?

    回复
  9. Trim Life Keto

    For many, this is the stage most likely to lead to relapse as many patients find it almost impossible to cope. Some facilities begin therapy and other forms of treatment at this stage, depending on the patient’s condition and ability. In inpatient detox, patients reside at a facility where they will receive constant supervision.

    Trim Life Keto Reviews >> https://www.supplementz.org/trim-life-keto/

    回复

发表评论

您的电子邮箱地址不会被公开。