利用DNS隧道免费上网

作者: _oneWay_ | 来源:发表于2018-09-16 15:55 被阅读4335次

    一.原理

    1.1.dns概述

    dns协议最基本的作用是将域名映射为ip地址,让我们在访问网页的时候无需记住复杂的ip地址。
    在一些地方,需要我们认证才能上网。假如我们没有认证,大部分的流量都会被过滤,但是往往都会放行dns流量,windows下可通过nslookup或者ping命令查看dns流量是否被过滤:

    C:\>nslookup
    默认服务器:  UnKnown
    Address:  2001:250:6801:5501:2e0:4cff:fe51:c4
    > baidu.com
    服务器:  UnKnown
    Address:  2001:250:6801:5501:2e0:4cff:fe51:c4
    非权威应答:
    名称:    baidu.com
    Addresses:  123.125.115.110          //能够返回ip地址则说明dns流量没有被过滤
              220.181.57.216
    
    C:\>ping baidu.com     
    正在 Ping baidu.com [220.181.57.216] 具有 32 字节的数据:
    //如果没有认证,一般icmp流量也会被禁用,但是我们可以看到域名成功解析为ip地址,则dns流量没有被过滤。
    

    如果放行了dns流量,就可以使用dns隧道免费上网。在我们学校,可以突破晚上十一点断网的限制,如果对网速没什么要求,连网费都可以不用交。

    1.2.dns隧道原理
    • dns隧道工具将进入隧道的其他协议流量封装到dns协议内,在隧道上传输。这些数据包出隧道时进行解封装,还原数据。
    • 在建立隧道之前,我们需要让dns隧道的客户端找到隧道的服务端,其过程大致如下:
      ①本地主机A发送一条dns请求,查询一个我们设定好的域名。
      ②因为沿途的dns服务器都没有这个域名的相关信息,最终这条请求被转发到权威域名服务器B(假如是腾讯云上注册的域名,腾讯的域名服务器就是针对你的域名的权威服务器)。
      ③我们添加了一条NS记录,关于要查询的域名,需要转到我们的公务服务器C做解析,B就会把C的地址返回给A。
      ④A知道了C的地址,就可以建立起dns隧道了。


    二.实现步骤

    2.1.工具准备
    • 一个域名

    • 一台公网服务器,并且拥有公网地址。学生认证过的腾讯云或者阿里云上都可以买到10元/月的云服务器,域名也很便宜。
      学生优惠套餐
      腾讯云个人免费体验15天云服务器
      域名注册

    • dns隧道工具:这里使用iodine(拥有速度快、支持多平台等特点)

    • 代理工具ssr、Proxifier,隧道搭建好之后,需要使用代理,让我们的应用程序走代理才能利用该隧道

    2.2.添加域名解析

    我申请的域名是slickghost.com
    a.slickghost.com和b.slickghost.com都是子域名(三级域名)
    这里需要添加两条记录:

    主机记录           记录类型            记录值
    b                   A              云主机公网IP
    a                   NS           b.slickghost.com
    

    两条记录组合的含义如下:
    当我们的主机去查询a.slickghost.com时,由于该域名对应的是一条NS记录,记录值是b.slickghost.com,此时,dns查询请求就会转发到b.slickghost.com这个域名服务器,而这个域名对应一条A记录,该记录值为云主机的公网地址,所以最终dns查询请求最会转发到我们的服务器。

    2.3.安装iodine

    iodine(点击下载)是一个集成客户端和服务端的工具。这里使用的服务端为linux,客户端为windows,要下载两个版本。

    2.3.1.iodine服务端

    服务器直接使用wget下载即可,如果有问题,可以先下载好压缩包再传到服务器上。

    wget https://code.kryo.se/iodine/iodine-0.7.0.tar.gz  //下载iodine
    tar -zxvf iodine-0.7.0.tar.gz  //解压
    cd iodine-0.7.0  //解压后进入该目录
    make install //安装
    

    安装后之后就会出现一个bin目录,该目录下有两个iodine应用程序,iodine(客户端)和iodined(服务端)。


    接着运行命令:
    ./iodined -f -c -P Password123 192.168.0.1 a.slickghost.com &
    
    参数说明:
    -f to keep running in foreground
    -c to disable check of client IP/port on each request  
    -P password used for authentication (max 32 chars will be used)
    Password123就是客户端连接服务器时需要用到的密码
    

    此时DNS隧道服务端就部署完成了,等待客户端的连接。
    可以使用iodine官方提供的工具测试服务端是否搭建成功:测试工具
    2.3.1.iodine客户端

    客户端需要一个TAP网卡,下载一个六快拨或者openvpn,安装完之后就会多出一块网卡。
    六快拨下载地址

    解压windows版iodine后在管理员模式下运行命令:

    iodine -P Password123 -f 公网地址 a.slickghost.com
    

    至此,DNS隧道就搭建完成了。这时候应该要能够ping通刚刚我们在服务器指定的IP:192.168.0.1。



    创建dns隧道客户端时,其与服务端协商,并自动帮我们配置好了TAP网卡的IP地址。



    刚刚ping的时候使用的就是这个虚拟网卡。
    2.4.使用代理

    我们已经把dns隧道搭建好了。但是现在应用程序的流量没有被指定通过这个隧道来走,我们使用ssr全局代理+Proxifier来解决这个问题。

    2.4.1.服务器安装ssr

    具体安装步骤参照:ssr搭建教程

    2.4.2.客户端ssr设置

    网上下载一个ssr客户端,进行如下配置


    服务器ip是使用iodine创建隧道服务端时指定的ip。
    服务器端口是安装ssr服务端时指定的端口。
    将客户端ssr设置为全局代理之后,浏览器就可以绕过认证上网了。
    2.4.2.Proxifier设置

    ssr只能让我们使用浏览器访问网页的时候绕过认证,其他的应用程序还是不能上网,我们需要用Proxifier将本地应用程序的流量转到ssr代理,从而能够利用dns隧道。

    打开Proxifier之后,会自动检测可走ssr代理:



    点击确定后就会自动创建一个规则——直连到SSR
    若检测不到,我们可以手动创建:配置文件——代理规则——添加。



    这时候电脑所有的应用程序都通过Proxifier走ssr代理,而原来我们的浏览器已经走ssr代理了,导致冲突,需要再添加一条规则,让你用到的浏览器不需要通过Proxifier。我平时使用的是firefox

    添加好以上两条规则之后,所有的应用程序就都可以上网了。
    登个tim,听听音乐,刷个网页啥还是没问题的。如果你的隧道服务器在香港或者国外,还可以过GFW。


    相关文章

      网友评论

      • a6ca513b4b5e:额,按照教程走,结果在安装iodine那就卡住了,安装不上软件 终端截图https://s1.ax1x.com/2018/10/22/iDiayF.png
        a6ca513b4b5e:该怎么做呢?
      • 1e7b23478eb3:校园网客户端检测到多个网卡,强制下线怎么弄?
        _oneWay_:在关闭客户端的情况下dns流量可以走吗
      • sudo0m:厉害,
      • 小鱼儿他老汉:果然牛逼。
      • 薛定谔没有猫1:网速怎么样啊?
        _oneWay_:@薛定谔没有猫1 iodine官方称下载速度最高可达1Mbps。但是实际速度一般取决于公网服务器的带宽。我公网服务器带宽是1M,隧道用起来大概是100~200k的速度。
      • 秋深夜冷:小白,看得云里雾里的( ̄▽ ̄)"
      • AlunX:显示了connection setup complete,transmitting date 但是ping不通怎么解决?
        _oneWay_:这说明隧道已经建起来了。确认你的本地的tap网卡有获取到与服务器相同网段的地址。如果你有装虚拟机,把虚拟机的网卡禁用后试试。
      • learner222:CMCC、ChinaNet之类的用这种方式是不是也可以不用认证上网😂
        _oneWay_:@learner222 嗯,可以的
      • 6e1f48a55c89:高校一般有自己的dns把 高校会吧所有dns请求转发到高校的dns去
        6e1f48a55c89:@_oneWay_ 高校dns的请求会转发给电信或者教育网,你的请求最终是只能到达高校,高校在给你转发出去,但是后端回复是回复高校 ,你根本跟后端建立不了链接
        _oneWay_:@yuedingwangji 学校dns服务器无法通过本地处理的dns请求还是会做递归查询最终到达dns隧道服务器端
      • 良辰夜:你的意思是,学校仅仅拦截了dns流量么?
        _oneWay_:@良辰夜 是放行dns流量,拦截其他流量。
      • 凡间草:你这种情况只需要在出口设备阻断除学校Dns外其他任何Dns数据,隧道就建不起来了
        _oneWay_:@凡间草 没考虑过这种情况,如果把dns服务器设为学校的dns,利用其递归查询应该也是可以的。
      • 1286e78ac424:11点断网,这是什么操作,我们学校没有吧
        1286e78ac424:@_oneWay_ 嗯,值得炫耀,不错不错,给你啪啪啪!
        _oneWay_:@我的目标是 就是这样一个晚上11点断网的学校,前段时间斩获第六届全国lol高校联赛冠军!
      • 23f8c0674452:不错不错
      • szlwl01:这个能突破学校11点的限制?
        _oneWay_:@szlwl01 对
        szlwl01:@_oneWay_ window 系统如何测试 dns 有没有放行,nslookup这个命令吗?
        _oneWay_:@szlwl01 学校应该是可以的,断网的时候看看是否放行dns
      • 南京小菜鸟:这个又要买域名又要买云服务器 哪里免费了呢
        _oneWay_:@南京小菜鸟 域名一年10元,云服务器我现在用的是1元每月的。本文更偏重于介绍有这样一种技术,不讨论免费的具体定义。
      • 爱阿爸的阿龙龙:隔大学那会 可以试一试 哈哈
      • 翔子骆驼:说了半天,好像在教怎么翻墙一样。
      • 皮卡Q强:试一下,我只希望能突破十一点断网的悲哀😂😂😂
      • 可笑可乐:哈哈哈
      • 小强在线NO1:这个认证包括在家里的认证么
        小强在线NO1:@_oneWay_ 好的,一般都是用的网络层的代理。第一次用这种代理
        _oneWay_:@小强在线NO1 可以试试家里认证失败的情况下dns流量能不能走
      • 椟夜:感觉好神奇,
      • 捡书:哪里免费了
      • 少先队小张:这个不需要是不需要联网的吗?
      • 墨色千槿:晕
        _oneWay_:@皮卡Q强 iodine不支持这个openvpn携带虚拟网卡版本,私信我发给你一个。
        皮卡Q强:六快拨下不来,下了一个OPENVPN,但是搭建隧道的时候出现 Error opening registry key 绑c
        No TAP adapters found. Version 0801 and 0901 are supported.。什么情况???一直无法突破这个
        _oneWay_:@墨色千槿 :flushed:

      本文标题:利用DNS隧道免费上网

      本文链接:https://www.haomeiwen.com/subject/plnzmftx.html