参考:CSDN
VPN即虚拟专用网,指通过VPN技术在公有网络中构建专用的虚拟网络。
为什么要使用VPN技术
在没有VPN之前,企业的总部和分部之间的互通都是采用运营商的internet进行通信,那么Internet中往往是不安全的,通信的内容可能被窃取、修改等,从而造成安全事件。
那么有没有一种技术既能实现总部和分部间的互通,也能够保证数据传输的安全性呢?
一开始大家想到的是专线,在总部和分部拉条专线,只传输自己的业务,但是这个专线的费用确不是一般公司能够承受的。而且维护也很困难。
那么有没有成本也比较低的方案呢?
有,那就是VPN。VPN通过在现有的Internet网中构建专用的虚拟网络,实现企业总部和分部的通信,解决了互通、安全、成本的问题。
VPN技术实现
VPN是再Internet等公共网络基础上,综合利用隧道技术、加解密技术、密钥管理技术和身份认证技术实现的。
隧道技术
VPN技术的基本原理其实就是用的隧道技术,就类似于火车的轨道、地铁的轨道一样,从A站点到B站点都是直通的,不会堵车。对于乘客而言,就是专车。
隧道技术其实就是对传输的报文进行封装,利用公网的建立专用的数据传输通道,从而完成数据的安全可靠性传输。
隧道协议通过在隧道的一端给数据加上隧道协议头,即进行封装,使这些被封装的数据能都在某网络中传输,并且在隧道的另一端去掉该数据携带的隧道协议头,即进行解封装。
身份认证
VPN网关对接入VPN的用户进行身份认证,保证接入的用户都是合法用户。
数据加密
将明文通过加密技术成密文,哪怕信息被获取了,也无法识别。
数据验证
通过数据验证技术验证报文的完整性和真伪进行检查,防止数据被篡改。
VPN的工作模式
Web浏览器模式
远程计算机使用Web浏览器通过SSL-VPN服务来访问企业内部的资源。SSL-VPN服务器相当于一个数据中转服务器(代理服务器),所有Web浏览器对服务器的访问都经过SSL-VPN服务器的认证后发给服务器,服务器发往Web浏览器的数据经过SSL-VPN服务器加密后送到Web浏览器。
VPN客户端模式
此模式与前一种模式差别是需要在远程计算机上安装一个VPN客户端程序,远程计算机访问企业内部的应用服务器时,需要经过VPN客户端和SSL-VPN服务器之间的保密传输才能到达。
LAN到LAN模式
此模式下客户端不需要做任何安装和配置,仅在SSL-VPN服务器上安装和配置。当一个网内的计算机要访问远程网络内的应用服务器时,需要经过两个网的SSL-VPN服务器之间的保密传输后才能到达。
科学上网
封锁技术
DNS污染和劫持
参考:superxlcr的博客
某些网络运营商为了某些目的,对DNS进行了某些操作,导致使用ISP的正常上网设置无法通过域名取得正确的IP地址。
某些国家或地区出于某些目的为了防止某网站被访问,而且其又掌握部分国际DNS根目录服务器或镜像,也会利用此方法进行屏蔽。
目前我们访问网站主要都是通过域名进行访问,而真正访问这个网站前需要通过DNS服务器把域名解析为IP地址。而普通的DNS服务使用UDP协议,没有任何的认证机制。DNS劫持是指返回给你一个伪造页面的IP地址,DNS污染是返回给你一个不存在的页面的IP地址。
比如使用三大运营商的宽带,默认你是不需要设置任何DNS服务器的。这些DNS服务器由他们提供。一旦检测到你访问的网页是不允许的访问的,就会返回一个不存在的网页。而很多运营商也会使用DNS劫持来投放一些广告。
解决办法:
- 使用OpenDNS(208.67.222.222)或GoogleDNS(8.8.8.8)(现在不太好用,被封锁,速度慢)
- 使用一些第三方的DNS服务器。
- 自己用VPS搭建DNS服务器。
- 修改机器host文件,直接IP访问。这个方法可以解决GitHub访问的问题,链接跳转。
封锁IP
通过上面一些方式,可以绕过DNS污染,通过IP地址访问无法访问的网页。但是目前针对IP进行大范围的封锁。虽然google这种大公司有很多镜像IP地址,但是目前基本全部被封锁掉,有漏网的可能也坚持不了多久。而且很多小公司的服务是部署在一些第三方的主机上,所以封锁IP有时会误伤,封锁一个IP导致主机上本来可以使用的页面也无法访问了。
不过目前不可能把所有国外的IP全部封锁掉,所以我们采用机会从国内连接到国外的VPS(Virtual Private Server 虚拟专用服务器)。
解决办法:
- 使用VPS搭建代理。
- 使用IPV6 (IPV6地址巨大,采用封地址不现实,但是目前国内只有部分高校部署了IPV6)。
封锁HTTP代理
对于没有办法搭建VPS的人来说,最好的办法就是使用HTTP代理。客户端不在直接请求目标服务器,而是请求代理服务器,代理服务器在去请求目标服务器。然后返回结果。
对于HTTP代理来说,封锁起来非常简单。因为HTTP协议是明文,Request Message中就带有要请求的URL或IP地址,这样很容易就被检测到。对于HTTPS来说,虽然通信是进行加密了,但是在建连之前会给代理服务器发送CONNECT方法,这里也会带上要访问的远端服务器地址。如果代理服务器在国外,在出去前就会被检测到。 如果代理服务器在国内,呵呵,你也出不去啊。
对于HTTP代理,因为是明文,所以很容易被服务器了解你的一些数据。所以不要随便使用第三方的HTTP代理访问HTTP网站,而HTTPS虽然不知道你的数据,但是可以知道你去了那里。
解决办法:
- 使用VPS搭建VPN。
- 使用第三方VPN。
封锁VPN
正常网络通信时,所有网络请求都是通过我们的物理网卡直接发送出去。而VPN是客户端使用相应的VPN协议先与VPN服务器进行通信,成功连接后就在操作系统内建立一个虚拟网卡,一般来说默认PC上所有网络通信都从这虚拟网卡上进出,经过VPN服务器中转之后再到达目的地。
通常VPN协议都会对数据流进行强加密处理,从而使得第三方无法知道数据内容,但VPN服务器知道你干的所有事情(HTTP,对于HTTPS,它知道你去了哪)。
VPN有多种协议:OPENVPN、PPTP、L2TP/IPSec、SSLVPN、IKEv2 VPN,Cisco VPN等。其中的PPTP和L2TP是明文传输协议。只负责传输,不负责加密。分别利用了MPPE和IPSec进行加密。
对于VPN和其他一些加密的传输的协议来说,没有办法直接获取明文的请求信息,所以没有办法直接封锁,而是使用了监控的方式:
- 暴力破解:对于一些使用弱加密方式的协议来说,直接使用暴力破解检查传输内容。比如PPTP使用MPPE加密,但是MPPE是基于RC4,对于强大的防火墙背后的超级计算机集群,破解就是几秒钟的事情。破解后明文中一旦包含了违禁内容,请求就会被封。而对应的IP可能会进入重点关怀列表。
- 特征检测:必须与对应的远程服务器建立连接,然后再用对应的协议进行数据处理并传输。而问题就出在这里:工具和远程服务器建立连接时,如果表现的很独特,在一大堆流量里很显眼,就会轻易被GFW识别出从而直接阻断连接,而VPN(尤其是OPENVPN)和SSH这方面的问题尤其严重。
- 流量监控:当一个VPN地址被大量人请求,并保持长时间连接时,就很容易引起关注。SSH接口有大量数据请求。一般会结合其他特征。
- 深度包检测:深度数据包检测(英语:Deep packet inspection,缩写为 DPI),又称完全数据包探测(complete packet inspection)或信息萃取(Information eXtraction,IX),是一种电脑网络数据包过滤技术,用来检查通过检测点之数据包的数据部分(亦可能包含其标头),以搜索不匹配规范之协议、病毒、垃圾邮件、入侵,或以预定之准则来决定数据包是否可通过或需被路由至其他不同目的地,亦或是为了收集统计数据之目的。
Socks代理/SSH Socks
SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。SOCKS是”SOCKetS”的缩写。
当防火墙后的客户端要访问外部的服务器时,就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外网的资格,允许的话,就将客户端的请求发往外部的服务器。 这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到版本4。最新协议是版本5,与前一版本相比,增加支持UDP、验证,以及IPv6。
根据OSI模型,SOCKS是会话层的协议,位于表示层与传输层之间。
SOCKS工作在比HTTP代理更低的层次:SOCKS使用握手协议来通知代理软件其客户端试图进行的连接SOCKS,然后尽可能透明地进行操作,而常规代理可能会解释和重写报头(例如,使用另一种底层协议,例如FTP;然而,HTTP代理只是将HTTP请求转发到所需的HTTP服务器)。虽然HTTP代理有不同的使用模式,CONNECT方法允许转发TCP连接;然而,SOCKS代理还可以转发UDP流量和反向代理,而HTTP代理不能。HTTP代理通常更了解HTTP协议,执行更高层次的过滤(虽然通常只用于GET和POST方法,而不用于CONNECT方法)。
Socks代理本身协议是明文传输,虽然相对HTTP有一些优势,但是明文也导致Socks代理很容易被封。所以可以考虑对Socks进行加密。所以出现了SSH Socks,对于MAC和Linux来说,不需要Client就可以进行访问。详细可以看:SSH隧道技术简介:端口转发&SOCKS代理。
但是网上看有些地区好像会对一些VPS的SSH进行端口干扰。而且SSH一般是小流量数据,如果数据量特别大,也会进入特别关怀列表。
Shadowsocks
认准官网:https://shadowsocks.org/ (.com那个是卖账号的)。
A secure socks5 proxy,
designed to protect your Internet traffic.
Shadowsocks 目前不容易被封杀主要是因为:
- 建立在socks5协议之上,socks5是运用很广泛的协议,所以没办法直接封杀socks5协议 使用socks5协议建立连接,而没有使用VPN中的服务端身份验证和密钥协商过程。而是在服务端和客户端直接写死密钥和加密算法。所以防火墙很难找到明显的特征,因为这就是个普通的socks5协议。
- Shadowsock搭建也比较简单,所以很多人自己架设VPS搭建,个人使用流量也很小,没法通过流量监控方式封杀。
- 自定义加密方式和密钥。因为加密主要主要是防止被检测,所以要选择安全系数高的加密方式。之前RC4会很容易被破解,而导致被封杀。所以现在推荐使用AES加密。而在客户端和服务端自定义密钥,泄露的风险相对较小。
所以如果是自己搭建的Shadosocks被封的概率很小,但是如果是第三方的Shadeowsocks,密码是server定的,你的数据很可能遭受到中间人攻击。
顺便说一下,Shadowssocks是天朝的clowwindy大神写的。不过Shadowsocks项目源码已经从github上删除了并停止维护了,但是release中还有源码可以下载。https://github.com/shadowsocks/shadowsocks
Shadowsocks-rss
前面认为Shadowssocks特征并不是很明细,但是了解协议工作原理后会发现,SS协议本身还有有漏洞,可以被利用来检测特征。协议过于简单,并且格式固定,很容易被发起中间人攻击。(涉及密码学等知识,看原文参考吧)
所以目前Shadowsocks应该是比较容易被检测出来。但是为什么没有被封掉,呵呵,就不知道了。所以这个项目目的就是在SS基础上进行一些混淆。因为原有实现确实有漏洞。 不过目前这个项目好像也停止更新了。并且木有开源。
当然如果是自己用完全可以自己修改一个私有协议,这样就没法被检测到了。但是需要同时修改Server段,MAC Client,Windows Client, Android Client。
GoAgent和GoProxy
Google App Engine是一个开发、托管网络应用程序的平台,使用Google管理的数据中心。
GoAgent的运行原理与其他代理工具基本相同,使用特定的中转服务器完成数据传输。它使用Google App Engine的服务器作为中传,将数据包后发送至Google服务器,再由Google服务器转发至目的服务器,接收数据时方法也类似。由于服务器端软件基本相同,该中转服务器既可以是用户自行架设的服务器,也可以是由其他人架设的开放服务器。
GoAgent其实也是利用GAE作为代理,但是因为他是连接到google的服务器,因为在国内现在google大量被封,所以GoAgent也基本很难使用。目前github上源码也已经删除。
但是GoAgent本身不依赖于GAE,而且使用Python编写,完全可以部署到VPS上进行代理。GoProxy是GoAgent的后续项目https://github.com/phuslu/goproxy 还有一个XX-NET:https://github.com/XX-net/XX-Net 有兴趣都可以去了解下。
V2Ray
参考:维基百科
V2Ray,是Victoria Raymond以及其社区团队开发的Project V下反审查工具。Project V是一个工具集合,号称可以帮助其用户打造专属的基础通信网络。Project V的核心工具称为V2Ray,其主要负责网络协议和功能的实现,与其它Project V通信。V2Ray可以单独运行,也可以和其它工具配合,以提供简便的操作流程。
V2Ray的运行原理与其他代理工具基本相同,使用特定的中转服务器完成数据传输。例如,用户无法直接访问Google,YouTube等网站,但代理服务器可以访问,且用户可以直接连接代理服务器,那么用户就可以通过特定软件连接代理服务器,然后由代理服务器获取网站内容并回传给用户,从而实现代理上网的效果。
服务器和客户端软件会根据不同协议,要求用户提供一定的参数,如UUID、密钥、加密方式等,双方一致后才能成功连接(VMess协议能够自适应客户端采用的加密方式)。
连接到服务器后,客户端会在本机构建一个本地Socks5代理(或VPN、HTTP、透明代理等)。浏览网络时,客户端通过这个Socks5(或其他形式)代理收集网络流量,然后再经混淆加密发送到服务器端,以防网络流量被识别和拦截,反之亦然。
V2Ray 定位为一个平台,任何开发者都可以利用 V2Ray 提供的模块开发出新的代理软件。
Tor
Tor(The Onion Router,洋葱路由器)是实现匿名通信的自由软件。Tor是第二代洋葱路由的一种实现,用户通过Tor可以在因特网上进行匿名交流。
Tor(The Onion Router,洋葱路由器)由已经安装了Tor软件的电脑连接网络而成。它之所以被称为onion,是因为它的结构就跟洋葱相同,你只能看出它的外表,而想要看到核心,就必须把它层层的剥开。即每个路由器间的传输都经过点对点密钥(symmetric key)来加密,形成有层次的结构。它中间所经过的各节点,都好像洋葱的一层皮,把客户端包在里面,算是保护信息来源的一种方式。
举个例子,假如一个Tor用户想匿名浏览《纽约时报》的头版,他的计算机将把Web请求包裹在几层加密中随机发送到另一个具有Tor功能的电脑。这台电脑被称为guard,guard在剥离掉当前第一层加密后将继续随机转发至网络中的另一台计算机,之后的计算机再剥离一层然后转发,以此循环反复。
整个链中的最后一台计算机,称为出口节点(exit node),剥离最后一层加密后,露出请求的真正终点:《纽约时报》。第一台计算机知道发送者的网络地址,出口知道目标站点的网络地址,但在该链中没有一台电脑知道完整的信息。这个经过层层加密的路由方案,就是Tor。
用 Tor 创建一条私有网络路径时,用户的软件或客户端通过网络上的中继递增地建立一条由若干加密连接组成的环路(circuit)。环路一次扩展一跳(hop),环路上的中继仅仅知道它从哪一个中继接收数据以及向哪一个中继发送数据。没有一台单独的中继会知道数据包的完整路径。客户端与环路上的每一跳都协商一组独立的密钥,这样可以保证数据通过任何一跳时都无法跟踪。
简单可以理解为Tor有一群代理服务器,然后要访问远端站点,是通过随机的代理路径来完成的,数据经历了多个代理服务器的传递。它主要作用是隐藏访问者信息,而科学上网只是顺带的功能。
要访问远程站点,Client需要知道Tor nodes,这些nodes就是普通加入的用户,就好像P2P下载一样。获取nodes信息后,会随机选择一条路径访问。 因为这个原因,Tor的速度可能不会很好。
参考:Tor真的十分安全么?
目前有结合Tor+Shadowsocks前置代理使用的。