• 利用DNS隧道绕过上网认证


    很久之前写的文章,因为其他平台被和谐了,修改一些内容重新发布,其中使用的软件版本可能比较低。

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

    二.实现步骤

    2.1.工具准备
    • 一个域名
    • 一台公网服务器,并且拥有公网地址。
    • dns隧道工具:这里使用iodine(拥有速度快、支持多平台等特点)
    • 代理工具,需要使用代理,让我们的应用程序走代理才能利用该隧道
    2.2.添加域名解析

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

    主机记录           记录类型            记录值
    b                   A              云主机公网IP
    a                   NS           b.abc.com
    
    • 1
    • 2
    • 3

    两条记录组合的含义如下:
    当我们的主机去查询a.abc.com时,由于该域名对应的是一条NS记录,记录值是b.abc.com,此时,dns查询请求就会转发到b.abc.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
    tar -zxvf iodine-0.7.0.tar.gz 
    cd iodine-0.7.0
    make install
    
    • 1
    • 2
    • 3
    • 4

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

    ./iodined -f -c -P Password123 192.168.0.1 a.abc.com &
    
    • 1

    参数说明:

    -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就是客户端连接服务器时需要用到的密码
    
    • 1
    • 2
    • 3
    • 4


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

    2.3.1.iodine客户端

    客户端需要一个TAP网卡,安装完之后就会多出一块网卡。
    解压windows版iodine后在管理员模式下运行命令:

    iodine -P Password123 -f 公网地址 a.abc.com
    
    • 1

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

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

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

    2.4.使用代理

    我们已经把dns隧道搭建好了。但是现在应用程序的流量没有被指定通过这个隧道来走,可以使用一些代理工具让流量从隧道走。

  • 相关阅读:
    详解Spring的循环依赖
    Codeforces 1174E Ehab and the Expected GCD Problem(DP)
    【亲测可用】SpringBoot使用Redis的Lettuce连接池报RedisCommandTimeoutException
    GNU LD脚本命令语言(一)
    任意文件读取
    【High 翻天】Higer-order Networks with Battiston Federico (1)
    ubuntu 指纹
    STM32CubeMX学习笔记(47)——USB接口使用(MSC基于内部Flash模拟U盘)
    如何用vue+免费的webdb 实现一个世界杯足球竞猜系统
    Nginx Note03——异步非阻塞机制
  • 原文地址:https://blog.csdn.net/qq_41832237/article/details/126564404