本人大学生一枚,由于是计算机专业,一天不上网就浑身难受。但是学校的网费可不是吹的,长城宽带一个G两块钱,常常在B站上一逛,10块就蒸发了,网速还贼卡,周围的同学也都怨声载道,学校依旧无动于衷。。。。

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

 

在这个背景下,我决定利用平时所学突破校园计费网关,实现广大人民免费上网的愿望!!!

 

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

 

话不多说,直接进入正题,我的校园网计费页面是这样的:

 

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

 

建立DNS隧道的环境需求:

1.一个域名,没有的话申请一个,推荐到阿里云申请,我的work域名第一年才一块。

2.需要一台拥有公网IP的服务器,请自行百度如何拥有。。。

附上各大云服务器的购买连接:
腾讯云 阿里云 新浪云 华为云

当然提供商不止这些,自行斟酌选择购买。
系统选Linux最佳。我使用的是Ubuntu

3.DNS隧道工具,用来提供客户端,服务器通信加解密操作,以下总结几个流行的工具 。

 

原理分析

首先我先讲一下原理,当我们连上校园网的无线路由器后,虽然上不了网,但是我们的计算机却分配到了IP地址(那么为什么要给我们分配IP呢?很好回答啦,不分配IP地址web认证就实现不了呀!)此时若我们进行一些上网的操作,例如访问百度主页,那么计算机的数据包将从TCP443端口上发出,校园网网关就会拦截从这个端口上发出的数据包。同理从其它端口上发出的数据包也会遭到拦截。

但是有一个神奇的端口,从这个端口发出的数据包不会遭到网关拦截,它就是UDP53端口。对计算机网络稍微了解的朋友应该知道在UDP53端口上运行的协议是DNS协议(域名解析协议)也就是说我们现在可以正常查询网站域名对应的IP地址。例如用Windows自带的nslookup命令查询百度的IP地址时会返回一个正确的结果:

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

PS:接下来可能要提到一些有关域名解析原理和网络隧道方面的知识,限于篇幅,我就简单说两句,想要深入了解的朋友可以参考以下内容:

既然UDP53端口的数据包可以通过网关,那么我们可以在本地运行一个程序将其它端口的数据包伪装组成UDP53端口的数据包,然后发送到本地域名服务器,那么网关就不会进行拦截了,数据包就顺利的通过了网关,可是发送出去的数据报如何返回呢?这就需要我们做进一步的设置。

接下来我们需要一个VPS(云服务器)和一个域名,我了便于叙述,我给这个云服务器起名为V,域名起名为Y。我们伪装的DNS数据包要查询的域名就是Y,本地域名服务器接收到这个伪装后的数据包后,由于它无法解析这个域名Y,便将数据包进行转发,让能够解析Y的域名服务器进行解析,接下来我们将Y设置一个NS记录,用来指定Y由哪个域名服务器来进行解析,我们指定的域名服务器就是前面提到的V,所以接下来数据包会被发送到V中。此时我们在V中运行一个程序,对伪装的数据包进行还原,还原后的数据包再发送出去,这样当V接收到响应数据包后,V上运行的程序会再次对其进行伪装,伪装成一个DNS响应数据包,这个DNS响应数据包会沿着上述相反的路径发送回我们的计算机,我们的计算机再次对这个DNS响应数据包进行还原,到现在,我们真正想要得到的数据包已经到手了。也许上面的叙述有点绕,我放一张图大家就能明白了:

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

好了,要是看了图没明白也没有关系,只要按照下面的步骤做就可以了

接下来,到了最重要实战部分了

Windows上与Linux上实现方法不同,就伪装数据包的程序而言,在windows平台上推荐使用dns2tcp这个软件,而在linux平台上推荐使用iodine这个软件。

 

第一步

是时候掏出你的服务器了,将你的服务器的网络入口出口设置为如下所图示,不同运营商的设置界面不同,保证入站处的HTTP:80,HTTPS:443,SSH:22,DNS:53以及出站的HTTP:80,HTTPS:443,DNS:53是开启的就行,这个步骤关乎哪些类型的数据包可以进出你的服务器,那些类型的数据包会被防火墙拦截,决定着伪装的数据包是否能够进入到服务器里

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

第二步

现在假定你申请到了一个域名,假如你申请到的域名为alkaid.work(我申请的域名),你需要进入阿里云的域名控制台,为其添加两条记录。

  • 第一条为NS记录,记录名称随便,记录值也随便,记录值以后要用。
  • 第二条为A记录,A记录的记录名称是NS记录的记录值,A记录的记录值是你所申请到的VPS的公网IP,如下图:

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

当本地域名服务器无法解析我们伪装的数据包后,便将数据包发送给NS记录指定的服务器vps.alkaid.work,而vps.alkaid.work的IP地址已经在A记录中给出了,所以刚才原理没看懂的朋友现在应该知道为什么本地域名服务器会将数据包发送到我们的VPS中了吧.

 

第三步

经过上述两步,我们所需要的资源就都具备了,接下来要到服务器去配置。

使用putty或者Xshell连接到我们的ubuntu云服务器上,如图所示:

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

这里我们选用dns2tcp为例
在服务器上安装dns2tcp,源码编译:

或者直接  sudo apt-get install dns2tcp 也可以安装

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

接下来配置dns2tcp

再次敲入命令:sudo vim /etc/dns2tcpd.conf ,用vim编辑器将其中的内容替换为一下内容:

点击esc,输入:wq 保存。

最后的resources里面配置的是dns2tcp供客户端使用的资源。作用是:客户端在本地监听一个端口,并指定使用的资源,当有数据往端口传送后,dns2tcp客户端将数据用DNS协议传动到服务器,然后服务器将数据转发到对应的资源配置的端口中。

下面创建后台进程,运行dns2tcp,依次键入并执行如下命令:

参数意义:
-f 读取配置文件
-F 强制前台运行
-d 2 开启debug,等级为2

出现下图所示,表示成功

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

到此为止,服务端配置完成

 

第四步

回到我们的windows主机,windows客户端配置:
打开CMD,键入并执行如下命令 : dns2tcpc.exe -r ssh -z test.alkaid.work 服务器公网IP  -l 8888 -d 2

-r 后接服务名称,这里我们用ssh
-z 后接NS记录的网址,ip,注意IP地址最好写上,可以不写
-l 后接本地端口
-d 开启debug

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

当出现上图显示的内容时,代表会话已经建立了,此时最小化这个窗口【不要关闭它!!!】

到此为止,客户端配置完成

离成功只有一步之遥了,下面用Xshell转换Socks4/5通用代理:

在xshell中仿照上面新建会话:IP地址为127.0.0.1,端口为8888 ;然后点击隧道,类型选择socks4/5,端口填1080,输入完成后点击确定,若不出意外,此时CMD中会出现大量信息,这些信息代表通过dns2tcp的数据包,这就表明你的电脑已经在和服务器传输数据了。而xshell中又会提示你登录到你的服务器,仿照上文输入用户名和密码(最好选择记住用户名和密码,这样下次就不用那么麻烦了),点击确定并成功登录到你的服务器后,最小化xshell【不要关闭xshell!!!】

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

此时之前的cmd窗口会大量出现数据流:

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

 

最后浏览器上代理,免费上网已成现实:

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

surf the internet!!

然而,高达50kb的网速令我无比汗颜,打开百度都很费劲,跟别说看视频了。想想也对,数据包经过这么多次的封装与解封装,网速会变得异常缓慢,根本达不到上网的需求,免费上网计划可以说是成功了,但同时也失败了。。。。。

传说中的DNS隧道绕过校园网计费网关认证-Alkaid

但是就这样结束了吗?难道我们学生就不能获得幸福了吗?怎么能在这里倒下?就没有其他方法了吗?未完待续。。。。。

传说中的DNS隧道绕过校园网计费网关认证-Alkaid