DNS隧道之DNS2TCP使用心得教程

DNS2TCP是在上次DNS隧道大检阅时提到的一个DNS隧道。

在2010年6月的更新(也是迄今为止最新的更新)后,其源代码支持编译为Windows平台的可执行程序。而且此工具使用C语言开发编写,不需要TUN/TAP,所以大大加强了它的可用性。

下载

当前最新的0.5.2版源代码下载请点击这里

Windows下客户端可执行文件下载请点击这里

安装DNS2TCP

本配置所在环境为Linux。以下命令的执行均以root用户身份执行,如果不是root用户,CentOS的请用“su -”,Ubuntu请在各个命令前加上“sudo”,分别提权到root用户权限。

下载、解压、编译、安装

wget http://www.hsc.fr/ressources/outils/dns2tcp/download/dns2tcp-0.5.2.tar.gz

tar zxf dns2tcp-0.5.2.tar.gz

cd dns2tcp-0.5.2

./configure

make

make install

配置DNS2TCP服务端

首先,将你的某个域名(这里以creke.net为例)开个二级域名a.creke.net,类型为NS,NS记录指向b.creke.net。然后将b.creke.net建立A记录指向你的Linux服务器IP(这里以1.2.3.4为例)。如下表所示。

a.creke.net NS b.creke.net

b.creke.net A 1.2.3.4

在/etc目录建立一个名为dns2tcpd.conf的文件,然后输入以下配置:

listen = 1.2.3.4(Linux服务器的IP)
port = 53
user = nobody
chroot = /var/empty/dns2tcp/
domain = a.creke.net(上面配置NS记录的域名)
resources = ssh:127.0.0.1:22,socks:127.0.0.1:1082,http:127.0.0.1:8082

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

好了,DNS2TCP的服务端配置到此完毕。接下来就是要慢慢等待域名记录的生效了。

启动与关闭DNS2TCP服务端

以下命令用于启动DNS2TCP的服务端:

dns2tcpd -f /etc/dns2tcpd.conf

以下命令用于关闭DNS2TCP的服务端:

killall dns2tcpd

启动DNS2TCP客户端

这里再次提醒,要等待a.creke.net的NS记录生效后,才能够继续正常使用客户端。查询是否生效可以使用从各个在线网站查询。

启动DNS2TCP客户端的命令如下;

dns2tcpc -c -d 1 -l 8118 -r http -z a.creke.net

其中:-c表示启用数据压缩;-d表示启动调试,1为调试等级;-l表示监听本地端口,8118为端口名;-r为使用服务端上的哪个资源,http为资源名;-z后的a.creke.net为前面配置的NS记录的域名。

然后就可以通过将浏览器的代理服务器地址设为127.0.0.1:8118,代理类型为HTTP代理,来通过DNS隧道上网了。

如果要使用SOCKS代理,则为:

dns2tcpc -c -d 1 -l 7070 -r socks -z a.creke.net

以上是通过系统DNS来发送DNS请求的,如果要通过某个DNS服务器,如87.65.43.21来发送DNS请求,则为:

dns2tcpc -c -d 1 -l 8118 -r http -z a.creke.net 87.65.43.21

这里要注意,需要首先在Linux服务器配置好HTTP代理或者SOCKS代理。才能利用DNS隧道转发数据包来实现代理。具体可以参考如何使用Kingate假设HTTP代理和SOCKS代理。

 

就是这样,采用DNS2TCP搭建了DNS隧道,慢慢折腾吧!

38 comments

    1. creke says:

      数据有一定概率能够发送接收。

  1. fish says:

    hi.2个问题请教。
    1.在/etc目录建立一个名为dns2tcpd.conf的文件,输入的内容,你是从哪里获得这些内容的?
    2. a.creke.net NS b.creke.net

    b.creke.net A 1.2.3.4 -怎么输入这2条命令?不会是在putty的提示符后直接输入吧?

    1. creke says:

      1.官方文档写有的。
      2.不是命令,是DNS记录

  2. fish says:

    "2.不是命令,是DNS记录"是指修改/etc/hosts还是/etc/resolv.conf?

    1. creke says:

      不是,是去域名的DNS那里添加对应的NS记录和A记录

  3. fish says:

    试验成功,翻墙成功。
    不过,不解的是运行了dns2tcpc -c -d 1 -l 8118 -r http -z a.creke.net即可,根本无需执行Windows下的客户端啊。你需要执行Windows下的客户端才能翻墙吗

    1. creke says:

      这是实验性的方法,只是在理论上证实可建立DNS隧道,实际应用还有段距离。

  4. fish says:

    我弄错了,我运行了tor以及后台自动运行的polipo而polipo的端口是8118,而我设置了http代理为127.0.0.1:8118,我还以为是通过你这个工具翻墙的,其实是通过tor.我退出tor,再运行你提供的Windows下的客户端,还是翻不了墙,你能成功翻墙吗?

  5. 小白斯基 says:

    dns2tcpd -f /etc/dns2tcpd.conf
    Error socket.c:107 bind error
    这样应该怎么解决?

    1. creke says:

      53端口被占用了吧

    2. 小白斯基 says:

      查出来了,谢谢,然后我在VPS上运行了DNS2TCPD的程序之后,在自己的WINDOWS电脑上运行客户端程序提示:
      No DNS given, using 192.168.1.1 (first system preferred DNS server)
      debug level 1
      Listening on port : 4430
      Error requests.c:202 Auth error = Name error
      指定域名到IP之后就提示
      Listening on port : 4430
      No response from DNS 1.1.1.1
      这个该怎么解决呢?

    3. creke says:

      这个很难说的,从服务端、本地客户端、域名三个方面看。
      这个技术是实验性技术,很难配置也很难用。

    4. 王磊 says:

      怎么解决的c:107 bind 我的就是除了这个问题

    5. 小白一枚 says:

      我的也是 error socket.c:107 bind error
      如果说是53端口被占用的话,那我又换成其他端口怎么还是这样的错误

    6. 用盆吃饭 says:

      是不是需要备案呢?

  6. wliment says:

    resource 原来是服务器本来就有的服务,不是dsn2tpcd提供的 同学门要注意了

  7. Ping says:

    主机记录 记录类型 线路类型 记录值 MX优先级 TTL 操作

    dns.tastek...com
    A
    默认
    184.22.95.16
    -
    600
    删除 暂停

    ns
    NS
    默认
    dns.tastekong.com.
    -
    600
    删除 暂停

    @
    NS
    默认
    f1g1ns1.dnspod.net.
    -
    600
    删除 暂停

    @
    NS
    默认
    f1g1ns2.dnspod.net.
    -
    600
    删除 暂停

  8. Ping says:

    郁闷,不知道我的NS设置的对不对,一直没解析,能不能给你邮箱我,我发截图给你看看。谢谢!

  9. Ping says:

    我不明白,为什么要
    a.creke.net NS b.creke.net
    b.creke.net A 1.2.3.4
    为什么不直接是
    a.creke.net A 1.2.3.4呢?

    1. cccsober says:

      这个好像是为了隐蔽性

  10. nefe says:

    please can you tell me how to solve, Socket Bind error 107

    1. creke says:

      maybe port 53 had already been used

  11. cccsober says:

    这是什么情况:
    Failed to chroot in /tmp/dns2tcp/

    1. creke says:

      chroot操作失败,可能是目录没创建或者没用root运行

    2. cccsober says:

      谢谢 前辈的及时回复。
      在请教下:我要怎么建立那个文件夹?还是用 mkdir么?

    3. creke says:

      是的,mkdir /tmp/dns2tcp 是linux创建文件夹的命令。
      PS:建议系统学习一下linux命令,很多地方会灵活地用到的

    4. cccsober says:

      嗯 谢谢,还有些疑惑,想问一下:
      1. ping a.creke.net 这个时候能ping通吗?
      2.nslookup a.creke.net 这个命令能找到 服务器ip 吗?

    5. creke says:

      这种情况下是找不到a记录的,所以这两个问题的答案都是否定的

    6. cccsober says:

      嗯 谢谢博主
      这两天研究后 ,按照博主步骤,走下来之后,我要怎么判断时候搭建成功啊?感觉没什么反应...

  12. cccsober says:

    [root@cloud etc]# dns2tcpd -f /etc/dns2tcpd.conf -F -d 2
    20:10:49 : Debug options.c:97 Add resource ssh:127.0.0.1 port 22
    20:10:49 : Debug socket.c:55 Listening on x.x.x.x:53 for domain a.x.com
    Starting Server v0.5.2...
    20:10:49 : Debug main.c:132 Chroot to /tmp/dns2tcp
    12:10:49 : Debug main.c:142 Change to user nobody

    1. cccsober says:

      我服务器运行之后是这样 也不知道是不是搭建起来l

    2. creke says:

      如果日志没报错就是运行起来了,但是是否能用得抓包看看

    3. cccsober says:

      崩溃,测试的时候 客户端总是连不上,博主还记得当时怎么做的么,能不能留个qq ,博主空的时候详细讲一下...

    4. creke says:

      已经六年啦,早就没有印象啦→_→

  13. 田凯强 says:

    我现在用open vpn用UDP53端口绕过认证上网,不过只能用国内服务器,能不能用什么方法用国外服务器,用上ss或者SSR,或者博主有更高明的方法

  14. dearchen says:

    楼主我的也提示Error socket.c:107 bind error
    换了几家服务器都这样,查53端口也没有查到进程,请问是怎么回事啊

Leave a comment