“用DNS隧道实现免费上网”这篇文章其实是转载自 文章"有DNS的地方就能上网"(http://www.nsbeta.info/archives/96),同时云风进行了一些改进后的 方案:DNS隧道( http://blog.codingnow.com/2011/06/dns_tunnel.html)。云风给出的改进方案中,没有使用风河中提到的OzymanDNS,而是使用了另外一个小玩意儿iodine。云风也并没有提供很方便的设置代码,只是用文字将涉及到的相关问题和技巧说明了下。
翻到iodine的主页,查看其Wiki上的How to Setup,文中的The quick way讲的很清楚。只需将其下下来,在服务器端运行iodined,在客户端运行iodine就行了。但其实它还需要你有一个域名,能够设置域名的DNS之类的。讲的最清楚的一篇文章,当属How to Setup末尾提供的一个链接:Guide for debian server and win32 client。
要进行这项工程,你需要一台能够让自己自由安装软件的服务器,和一个能够设置NS记录的域名。对于服务器,iodine很强大,支持各种各样的系统:FreeBSD、Linux、Mac OS X、NetBSD、OpenBSD以及Windows。在Linux下,编译安装就行。在Mac OS X下,还需要安装一个TunTap,很简单,下载下来一路点下去就行。在Windows下,需要安装OpenVPN的TAP Virtual Ethernet Adapter模块。
下面以Ubuntu或者Debian作为服务器,Windows作为客户机,说明如何配置。
1. 设置服务器
在服务器上,只需安装iodine这个小工具就可以了。如果你的服务器系统是最新版本的Ubuntu,即Ubuntu Natty,可以这样通过添加源的方式来安装iodine:
在Debian上可以这样安装:
2. 设置域名的DNS
首先需要设置域名服务器。
其次,在域名下面添加一个A记录,A记录的名字可以任意,如server.urdomain.com,A记录的值为你VPS服务器的IP地址。
最后,再添加一个NS记录,这个NS的名字可以任意,比如iodine.urdomain.com,NS记录的值为你上面添加的A记录的名字,即server.urdomain.com。
3. 在你VPS服务器上运行iodined程序
通过SSH登入你的服务器,运行iodined这个程序:
上面这段代码的10.0.0.1 IP地址是你设置的虚拟局域网的IP地址,如果你所在的局域网的网段刚好也在10.0.0.1,可以换一个网段,比如172.16.0.0。其中的password是你在服务器端自己设定的一个密码,客户端登入的时候需要用到这个密码。iodine.urdomain.com则是你后面添加的那个NS记录。
运行上面的代码之后,程序会输出如下信息,表示你的服务器端成功运行iodine小程序:
4. 设置客户端
接下来就要用客户机去链接服务器了。无论你的客户机是什么系统,只需在这里把iodine下下来就行了。在Linux下,需要自己编译安装一下即可运行。在Mac下,需先安装TunTap这个小工具,再编译安装即可运行。在Windows下,需安装OpenVPN的Tap模块。下面以Windows客户端做说明。
从OpenVPN官网下载最新版本的OpenVPN,在安装的时候只勾选TAP Virtual Ethernet Adapter这个模块。
5. 通过虚拟内网地址连接服务器
下载最新版本的iodine Windows客户端。解压后,通过命令行(cmd程序。如果你的系统是Windows XP,直接打开cmd即可。如果你的是Windows 7系统,需要以管理员的身份运行这个程序)进入这个目录。然后,通过以下这个命令运行这个程序:
上面的password是你在服务器端运行iodined这个程序时设置的密码,server_ip是你的VPS服务器的ip地址,server.urdomain.com是你设置的NS记录的域名。运行以上命令后,你会看到类似下面的输出:
上面的74.63.253.53是你服务器的ip地址。
现在,你可以测试下是否能够Ping同10.0.0.1这个服务器了:
如果Ping通了,一切顺利。
现在,即使你的电脑打开浏览器的时候跳出让你输入密码认证的页面,即使你不输入认证,你也可以上网了。前提是,你还需要进一步的设置。
6. 通过虚拟内网地址登入服务器
如果你以前用过SSH连接代理服务器,并拿它来翻墙,接下来的设置很简单,因为两者是一样的。但是,如果你以前连翻墙都不会,也不会通过SSH登入服务器,那就有点麻烦了。本文不再详述这些设置,只给出几个客户端和浏览器插件:
1). 所连接服务器的IP地址:10.0.0.1
你可以通过SSH登入10.0.0.1这个服务器了,这个服务器跟你的VPS服务器是一样的,只不过是以不同的地址登入。你原有的是外网IP地址,现在多了一个10.0.0.1内部地址。登入的用户名和密码还是跟你原来登入VPS的用户名和密码一样的。
推荐使用Tunnelier,设置代理端口非常的方便。
3). 浏览器的代理插件
官方网址 :http://code.kryo.se/iodine/
----------------------------------------------------------------------------
能解析DNS的地方就能上网
能解析DNS的地方就能上网
大多数机场、酒店之类场所,当你输入一个网址比如www.google.com时,会弹出一个页面要你输入帐号密码才能上网。这个时候DNS能正确解析,但是上网要付费认证。
可以通过DNS隧道来实现免费上网。具体做法是:
(1)找一个支持DNS解析的域名,现在这类免费域名很多,比如tk的、co.cc的。假设该域名是abc123.tk。
(2)在tk的注册机构里,设置abc123.tk的NS服务器为你自己的主机(最好是Linux VPS),例如:
abc123.tk. IN NS ns.abc123.tk.
ns.abc123.tk. IN A 74.81.81.81
(3)在74.81.81.81上,以root身份运行一个Perl脚本(这个脚本来自Dan Kaminsky的OzymanDNS包):
./nomde.pl -i 0.0.0.0 abc123.tk
上述脚本会侦听在UDP 53端口,接受DNS请求,并且只解析abc123.tk域。
(4)在客户机上(要求有ssh,最好是Linux系统),运行如下命令:
ssh -ND 7070 -o ProxyCommand=”./droute.pl sshdns.abc123.tk” user@localhost
上 述ssh命令,-ND 7070表示在本机打开7070的socks 5代理端口。droute.pl是DNS隧道的客户端工具,同样来自于OzymanDNS包。sshdns是固定的主机名,加在域名abc123.tk前 面。user是你在74.81.81.81上的登录名字,@localhost是固定的,不需要改(因为隧道过去后,就是74.81.81.81本机)。
运行上述ssh命令后,会提示输入密码。输入正确密码后,就和远程主机建立了ssh连接,获取到一个SSH终端。并且,在本机打开了7070的socks 5代理端口。配置浏览器使用这个代理端口,开始享受免费冲浪吧!
from http://www.nsbeta.info/archives/96
《用DNS隧道实现免费上网》已有 29 条评论
元谷 回复 11/06/22 21:49
不是弹出,而是跳转!
creke 11/06/22 22:15
不是付费认证,而是用户登录权限认证!呵呵
代码疯子 回复 11/06/24 21:42
你这样能上ChinaNet吗?
creke 11/06/26 17:24
不知道,我周围没有ChinaNet的辐射。你可以试试。
wuwu 回复 11/06/27 20:38
如果是将openvp监听端口设置在udp53也行嘛?
creke 11/06/27 22:11
这个需要53端口没有协议过滤才可行,目前我正在测试这种方法。
Diye 回复 11/06/28 00:14
请教两个问题哈:
NS服务器,这个用虚拟主机可以不?
主机上要做绑定abc123.tk域名的动作不?
creke 11/06/28 11:14
虚拟主机是不行的。因为涉及到53端口。
yh 回复 11/06/28 00:54
一直用淘宝 CMCC帐号 200小时包月,每月10块不到的路过。
creke 11/06/28 11:14
好吧,这是个更好的方法,呵呵。
Nobody 回复 11/06/28 03:00
本质上跟OpenVPN udp 53一样,我用OpenVPN udp 53曾经连上CMCC,挪了个地就不行了。
后来我无意发现TOMATO路由器轻而易举地就屏蔽了OpenVPN udp 53并且还不影响DNS解析,非常简单,只要勾上DNS挟持然后保存,就over了。
洗洗睡吧。
creke 11/06/28 11:15
这就是协议过滤。但是这个DNS隧道是通过DNS协议传输的,所以可以绕过路由器限制,但速度很慢。
goseas 回复 11/06/28 10:35
这个方法不错,呵呵
creke 11/06/28 11:16
实际应用的话,还需要很多优化啊。
Fanr 回复 11/06/29 09:51
找机会试试,不过建议博主贴个图啊~~
creke 11/06/29 17:14
截图也是各种命令界面,呵呵
枸杞 回复 11/07/02 12:59
有机会试试!!!!
yanyucheng 回复 11/07/31 15:05
会提示 No such file or directory: No such file or directory
,我已经设置域名dns了。求解 谢谢。。
匿名 回复 11/08/16 14:34
光是53端口现在破不了电信的,我试过了。不过loopcVPN却是可以破电信的信号。我是在昆明市这里试的。不知loopcVPN是如何做到的。
-----------------------------------------------------------
有那么几天,我们在惠灵顿的海边山顶租了个屋子,一切都很舒服,但是不能上网。甚至于附近连 wifi 信号都收不到,想"借用"一下别人的 wifi 热点都不成。我顶着海边的狂风在院子里竖起天线,捕捉着周围微弱的信号,最终未果。然后转战屋里的有线电视。我发现和国内的有线电视一样,机顶盒是接有网线的。也就是说,物理上,存在一条链路接入了互联网。但是我插上电脑后,发现 ip 包根本发不出去。不过,好似有个 DNS 服务是可以用的。
当时也没多想,只是觉得有办法可以利用一下。不过隔天就搬走了,没有深入下去。今天回味一下,感觉的确可以利用 DNS 服务和外部建立连接。当然,一开始就需要在外界把接应的程序程序搭建好。
原理很简单,你在做 DNS 查询的时候,如果查的域名在 DNS 服务器本机的 cache 中没有,它就会去互联网上查询,最终把结果返回给你。如果你在互联网上有台定制的服务器。只要依靠 DNS 的这层约定,就可以交换数据包了。从 DNS 协议上看,你是在一次次的查询某个特定域名,并得到解析结果。但实际上,你在和外部通讯。你没有直接连到局域网外的机器,因为网关不会转发你的 IP 包出去。但局域网上的 DNS 服务器帮你做了中转。这就是 DNS Tunnel 了。
我觉得有趣,就按文章所述做了试验。
这需要一个自己的域名,一台运行在互联网上的机器可以自由安装软件。这些都有。那个假的 DNS 是由 OzymanDNS 提供的。不过今天我搜到的 OzymanDNS 网站上已经没有了下载包。好在 google 很强大,这个 2004 年编写的小 perl 程序,并不难找到。
不过我反复试验也没有成功,按文章所述的,利用 ssh 在本机上的 proxycommand 我怎么都无法通过 dnstunnel 连上主机。估计是我哪里配置的不对吧。不过接下来 google 到了更好的选择。那就是 iodine 这个小玩意。非常简单的就装好了。第一次运行发现找不到 tun 设备。看来需要手工建一个。在 linux 上可以自己来: mkdir /dev/net ; mknod /dev/net/tun c 10 200 这样即可。
windows 版麻烦一些,需要装软件。安装个 openvpn 包里的 TAP driver 就行了。
然后利用 iodine 可以利用 dns tunnel 建立起虚拟网。接下来可以方便的用 ssh -D 建起 socks5 了。不过我觉得这个都是多余的。为了节约 dns tunnel 上的带宽,我直接建了个socks5 服务器。用的软件是ssocks 。同样需要修改一下,把监听端口绑定在 10.0.0.1 上。
最后,居然没遇到什么麻烦就接通了。我想我所在网络出口上的 dns 服务器肯定觉得很疼。这真是一个超级淡疼的 tunnel 方案啊。嗯,可以留作日后翻墙的备用方案,以备不时之需。
ps. 好想知道到处都有的诸如 CMCC 的 wifi 热点能不能用。下次到商业区别忘记试试看。
from http://blog.codingnow.com/2011/06/dns_tunnel.html
--------------------------------------------------------------------------------------
最近遇到了国内某大牛,听说了一个叫做DNS tunnel的技术,经过一番研究,发现很有趣,记录一下。
什么是DNS tunnel?
DNS tunnel 即 DNS隧道。从名字上来看就是利用DNS查询过程建立起隧道,传输数据。
为什么使用DNS tunnel?
当你在酒店、机场等公共场所,通常有Wifi信号,但是当你访问一个网站时,如www.guanwei.org, 可能会弹出个窗口,让你输入用户名、密码,登陆之后才可以继续上网(该技术一般为透明http代理,不在本文讨论范围之内,以后再讲)。这时,你没有账 号,就无法上网。但是有时你会发现,你获取到得DNS地址是有效的,并且可以用以进行DNS查询,这时你便可以用DNS tunnel技术来实现免费上网了!
DNS tunnel的原理
首先,要知道DNS系统的工作原理,见:[DNS系统(服务器)的工作原理及攻击防护方法论] 。你在做 DNS 查询的时候,如果查的域名在 DNS 服务器本机的 cache 中没有,它就会去互联网上查询,最终把结果返回给你。如果你在互联网上有台定制的服务器。只要依靠 DNS 的这层约定,就可以交换数据包了。从 DNS 协议上看,你是在一次次的查询某个特定域名,并得到解析结果。但实际上,你在和外部通讯。你没有直接连到局域网外的机器,因为网关不会转发你的 IP 包出去。但局域网上的 DNS 服务器帮你做了中转。这就是 DNS Tunnel 了。

上 图简单介绍了DNS tunnel的原理。当你连接上wifi后,你可以使用DNS服务器,向这个服务器的53端口发送数据,请求一个域名,比如b.guanwei.org 。这台DNS服务器上没有b.guanwei.org,那么它将向root,也就是根域名服务器请求,看看根知道不。root一看是.org的域名,就交 给.org域名服务器进行解析。.org的域名服务器一看是.guanwei.org那么就会去找.guanwei.org的域名服务器 (f1g1ns1.dnspod.net),看看它有没有这条记录。.guanwei.org的域名服务器上一看是b.guanwei.og,如果它有这 条A记录,那么就会返回b.guanwei.org的地址。
但是,如果没有,你可以再在guanwei.org的域名服务器上设定一个NS 类型的记录人,如:guanwei.org NS 111.222.333.444(通常这里不让设置为地址,那么也好办,你可以先在DNS服务器上添加一条A记录,如ns.guanwei.org 111.222.333.444,再添加NS记录:guanwei.org NS ns.guanwei.org),这里指定一个公网服务器,也就是上图绿色的服务器,这台服务器中跑着DNS tunnel的server端,是一台假的DNS服务器,他不会返回b.guanwei.org的地址,但是它会将你的请求转发到已经设定的端口中,比如 SSH的22端口,22端口返回的数据它将转发到53端口返回给客户端(也就是你的电脑)。这时,你就可以用这台公网服务器的资源了,如果是一台http 或者sock代理,那么你就可以用这个代理免费上网了。
DNS tunnel实现的工具
DNS tunnel实现的工具有很多,比如:OzymanDNS、tcp-over-dns、heyoka、iodine、dns2tcp。由于BT4、5系统自带了dns2tcp工具。这里仅介绍dns2tcp的使用方法。
DNS2TCP的DNS tunnel实验
环境准备
客户端client可以使用域名服务器查询域名,这里设定该域名为dnstunnel.guanwei.org(该域名不能在dnspod的域名服务器上有任何记录,因为这个记录是由server进行应答的)
在guanwei.org的域名服务器上建立两条DNS记录
详细配置方法
server端:
编辑/etc/dns2tcpd.conf文件,内容如下:
client端: #./dns2tcpc -z dnstunnel.guanwei.org ns.guanwei.org
如果ns.guanwei.org生效了,便可以连接服务器,提示:
如 果成功连接服务器,则说明dnstunnel可以成功建立了,如果没有,请测试你获取到得dns服务器地址是否可用,并且guanwei.org的ns记 录是否生效。测试方法:将111.222.333.444映射到另外一个真正的dns服务器上,加一条A记录,如:test.guanwei.org A 192.168.10.254 。然后使用nslookup test.guanwei.org 202.96.64.68,观察能否成功解析。如果不能解析,请检查dnspod的配置及dns记录生效情况。
测试可以成功连接服务器后, 使用#./dns2tcpc -r ssh -l 4430 -z dnstunnel.guanwei.org 202.96.64.68 这时会在本地监听一个端口,类似一个反弹木马。使用ssh 127.0.0.1 -p 4430 便可以成功连接server的22端口。如果server提供http代理服务,那么你就可以设置http代理服务器免费上网了!
PS:我发现客户端在监听4430端口时是监听127.0.0.1:4430端口,只能本机访问,其他机器不能连接,如果有牛发现该问题的解决办法,请联系我,谢谢!
from http://www.guanwei.org/post/applicationsecurity/07/dns-tunnel-dns2tcp.html
----------------------------------------------------------------------------
能解析DNS的地方就能上网
能解析DNS的地方就能上网
大多数机场、酒店之类场所,当你输入一个网址比如www.google.com时,会弹出一个页面要你输入帐号密码才能上网。这个时候DNS能正确解析,但是上网要付费认证。
可以通过DNS隧道来实现免费上网。具体做法是:
(1)找一个支持DNS解析的域名,现在这类免费域名很多,比如tk的、co.cc的。假设该域名是abc123.tk。
(2)在tk的注册机构里,设置abc123.tk的NS服务器为你自己的主机(最好是Linux VPS),例如:
abc123.tk. IN NS ns.abc123.tk.
ns.abc123.tk. IN A 74.81.81.81
(3)在74.81.81.81上,以root身份运行一个Perl脚本(这个脚本来自Dan Kaminsky的OzymanDNS包):
./nomde.pl -i 0.0.0.0 abc123.tk
上述脚本会侦听在UDP 53端口,接受DNS请求,并且只解析abc123.tk域。
(4)在客户机上(要求有ssh,最好是Linux系统),运行如下命令:
ssh -ND 7070 -o ProxyCommand=”./droute.pl sshdns.abc123.tk” user@localhost
上 述ssh命令,-ND 7070表示在本机打开7070的socks 5代理端口。droute.pl是DNS隧道的客户端工具,同样来自于OzymanDNS包。sshdns是固定的主机名,加在域名abc123.tk前 面。user是你在74.81.81.81上的登录名字,@localhost是固定的,不需要改(因为隧道过去后,就是74.81.81.81本机)。
运行上述ssh命令后,会提示输入密码。输入正确密码后,就和远程主机建立了ssh连接,获取到一个SSH终端。并且,在本机打开了7070的socks 5代理端口。配置浏览器使用这个代理端口,开始享受免费冲浪吧!
from http://www.nsbeta.info/archives/96
《用DNS隧道实现免费上网》已有 29 条评论
元谷 回复 11/06/22 21:49
不是弹出,而是跳转!
creke 11/06/22 22:15
不是付费认证,而是用户登录权限认证!呵呵
代码疯子 回复 11/06/24 21:42
你这样能上ChinaNet吗?
creke 11/06/26 17:24
不知道,我周围没有ChinaNet的辐射。你可以试试。
wuwu 回复 11/06/27 20:38
如果是将openvp监听端口设置在udp53也行嘛?
creke 11/06/27 22:11
这个需要53端口没有协议过滤才可行,目前我正在测试这种方法。
Diye 回复 11/06/28 00:14
请教两个问题哈:
NS服务器,这个用虚拟主机可以不?
主机上要做绑定abc123.tk域名的动作不?
creke 11/06/28 11:14
虚拟主机是不行的。因为涉及到53端口。
yh 回复 11/06/28 00:54
一直用淘宝 CMCC帐号 200小时包月,每月10块不到的路过。
creke 11/06/28 11:14
好吧,这是个更好的方法,呵呵。
Nobody 回复 11/06/28 03:00
本质上跟OpenVPN udp 53一样,我用OpenVPN udp 53曾经连上CMCC,挪了个地就不行了。
后来我无意发现TOMATO路由器轻而易举地就屏蔽了OpenVPN udp 53并且还不影响DNS解析,非常简单,只要勾上DNS挟持然后保存,就over了。
洗洗睡吧。
creke 11/06/28 11:15
这就是协议过滤。但是这个DNS隧道是通过DNS协议传输的,所以可以绕过路由器限制,但速度很慢。
goseas 回复 11/06/28 10:35
这个方法不错,呵呵
creke 11/06/28 11:16
实际应用的话,还需要很多优化啊。
Fanr 回复 11/06/29 09:51
找机会试试,不过建议博主贴个图啊~~
creke 11/06/29 17:14
截图也是各种命令界面,呵呵
枸杞 回复 11/07/02 12:59
有机会试试!!!!
yanyucheng 回复 11/07/31 15:05
会提示 No such file or directory: No such file or directory
,我已经设置域名dns了。求解 谢谢。。
匿名 回复 11/08/16 14:34
光是53端口现在破不了电信的,我试过了。不过loopcVPN却是可以破电信的信号。我是在昆明市这里试的。不知loopcVPN是如何做到的。
-----------------------------------------------------------
DNS 隧道
有那么几天,我们在惠灵顿的海边山顶租了个屋子,一切都很舒服,但是不能上网。甚至于附近连 wifi 信号都收不到,想"借用"一下别人的 wifi 热点都不成。我顶着海边的狂风在院子里竖起天线,捕捉着周围微弱的信号,最终未果。然后转战屋里的有线电视。我发现和国内的有线电视一样,机顶盒是接有网线的。也就是说,物理上,存在一条链路接入了互联网。但是我插上电脑后,发现 ip 包根本发不出去。不过,好似有个 DNS 服务是可以用的。
当时也没多想,只是觉得有办法可以利用一下。不过隔天就搬走了,没有深入下去。今天回味一下,感觉的确可以利用 DNS 服务和外部建立连接。当然,一开始就需要在外界把接应的程序程序搭建好。
原理很简单,你在做 DNS 查询的时候,如果查的域名在 DNS 服务器本机的 cache 中没有,它就会去互联网上查询,最终把结果返回给你。如果你在互联网上有台定制的服务器。只要依靠 DNS 的这层约定,就可以交换数据包了。从 DNS 协议上看,你是在一次次的查询某个特定域名,并得到解析结果。但实际上,你在和外部通讯。你没有直接连到局域网外的机器,因为网关不会转发你的 IP 包出去。但局域网上的 DNS 服务器帮你做了中转。这就是 DNS Tunnel 了。
我觉得有趣,就按文章所述做了试验。
这需要一个自己的域名,一台运行在互联网上的机器可以自由安装软件。这些都有。那个假的 DNS 是由 OzymanDNS 提供的。不过今天我搜到的 OzymanDNS 网站上已经没有了下载包。好在 google 很强大,这个 2004 年编写的小 perl 程序,并不难找到。
不过我反复试验也没有成功,按文章所述的,利用 ssh 在本机上的 proxycommand 我怎么都无法通过 dnstunnel 连上主机。估计是我哪里配置的不对吧。不过接下来 google 到了更好的选择。那就是 iodine 这个小玩意。非常简单的就装好了。第一次运行发现找不到 tun 设备。看来需要手工建一个。在 linux 上可以自己来: mkdir /dev/net ; mknod /dev/net/tun c 10 200 这样即可。
windows 版麻烦一些,需要装软件。安装个 openvpn 包里的 TAP driver 就行了。
然后利用 iodine 可以利用 dns tunnel 建立起虚拟网。接下来可以方便的用 ssh -D 建起 socks5 了。不过我觉得这个都是多余的。为了节约 dns tunnel 上的带宽,我直接建了个socks5 服务器。用的软件是ssocks 。同样需要修改一下,把监听端口绑定在 10.0.0.1 上。
最后,居然没遇到什么麻烦就接通了。我想我所在网络出口上的 dns 服务器肯定觉得很疼。这真是一个超级淡疼的 tunnel 方案啊。嗯,可以留作日后翻墙的备用方案,以备不时之需。
ps. 好想知道到处都有的诸如 CMCC 的 wifi 热点能不能用。下次到商业区别忘记试试看。
from http://blog.codingnow.com/2011/06/dns_tunnel.html
--------------------------------------------------------------------------------------
DNS tunnel(DNS隧道)技术应用工具-DNS2tcp的使用方法及原理
最近遇到了国内某大牛,听说了一个叫做DNS tunnel的技术,经过一番研究,发现很有趣,记录一下。
什么是DNS tunnel?
DNS tunnel 即 DNS隧道。从名字上来看就是利用DNS查询过程建立起隧道,传输数据。
为什么使用DNS tunnel?
当你在酒店、机场等公共场所,通常有Wifi信号,但是当你访问一个网站时,如www.guanwei.org, 可能会弹出个窗口,让你输入用户名、密码,登陆之后才可以继续上网(该技术一般为透明http代理,不在本文讨论范围之内,以后再讲)。这时,你没有账 号,就无法上网。但是有时你会发现,你获取到得DNS地址是有效的,并且可以用以进行DNS查询,这时你便可以用DNS tunnel技术来实现免费上网了!
DNS tunnel的原理
首先,要知道DNS系统的工作原理,见:[DNS系统(服务器)的工作原理及攻击防护方法论] 。你在做 DNS 查询的时候,如果查的域名在 DNS 服务器本机的 cache 中没有,它就会去互联网上查询,最终把结果返回给你。如果你在互联网上有台定制的服务器。只要依靠 DNS 的这层约定,就可以交换数据包了。从 DNS 协议上看,你是在一次次的查询某个特定域名,并得到解析结果。但实际上,你在和外部通讯。你没有直接连到局域网外的机器,因为网关不会转发你的 IP 包出去。但局域网上的 DNS 服务器帮你做了中转。这就是 DNS Tunnel 了。

上 图简单介绍了DNS tunnel的原理。当你连接上wifi后,你可以使用DNS服务器,向这个服务器的53端口发送数据,请求一个域名,比如b.guanwei.org 。这台DNS服务器上没有b.guanwei.org,那么它将向root,也就是根域名服务器请求,看看根知道不。root一看是.org的域名,就交 给.org域名服务器进行解析。.org的域名服务器一看是.guanwei.org那么就会去找.guanwei.org的域名服务器 (f1g1ns1.dnspod.net),看看它有没有这条记录。.guanwei.org的域名服务器上一看是b.guanwei.og,如果它有这 条A记录,那么就会返回b.guanwei.org的地址。
但是,如果没有,你可以再在guanwei.org的域名服务器上设定一个NS 类型的记录人,如:guanwei.org NS 111.222.333.444(通常这里不让设置为地址,那么也好办,你可以先在DNS服务器上添加一条A记录,如ns.guanwei.org 111.222.333.444,再添加NS记录:guanwei.org NS ns.guanwei.org),这里指定一个公网服务器,也就是上图绿色的服务器,这台服务器中跑着DNS tunnel的server端,是一台假的DNS服务器,他不会返回b.guanwei.org的地址,但是它会将你的请求转发到已经设定的端口中,比如 SSH的22端口,22端口返回的数据它将转发到53端口返回给客户端(也就是你的电脑)。这时,你就可以用这台公网服务器的资源了,如果是一台http 或者sock代理,那么你就可以用这个代理免费上网了。
DNS tunnel实现的工具
DNS tunnel实现的工具有很多,比如:OzymanDNS、tcp-over-dns、heyoka、iodine、dns2tcp。由于BT4、5系统自带了dns2tcp工具。这里仅介绍dns2tcp的使用方法。
DNS2TCP的DNS tunnel实验
环境准备
- 一个已经申请好的公网域名,在这里我就用本blog的域名了guanwei.org。给该域名指定一个DNS服务器(在域名管理的控制面板即可看到),本环境为DNSpod的服务器:f1g1ns1.dnspod.net。
- 一个公网服务器server(运行着BT4系统,主要使用里面的dns2tcpd V4程序)。这里使用局域网中的一台PC,在防火墙上做端口映射,将UDP的53端口映射出去。公网IP为111.222.333.444
- 一 个客户端client(运行着BT4系统,主要使用里面的dns2tcpc V4程序)。这里模拟在机场的环境,能连接局域网(与上面的服务器不在一个局域网内,是另一个连接公网的局域网),能够获取到DNS服务器,如辽宁网通的 202.96.64.68,并可以通过它进行DNS查询(测试方法:nslookup www.guanwei.org 202.96.64.68,后面的域名服务器请根据实际情况替换)。
客户端client可以使用域名服务器查询域名,这里设定该域名为dnstunnel.guanwei.org(该域名不能在dnspod的域名服务器上有任何记录,因为这个记录是由server进行应答的)
在guanwei.org的域名服务器上建立两条DNS记录
ns.guanwei.org A 111.222.333.444(这里的目的就是给DNS服务器设定一个域名,按原理来说是可以舍去的,但是DNSpod上不可以将NS记录配置为IP,只能配置为域名,所以需要加上这条记录)在server上开启SSH服务。用以进行测试,如果DNS tunnel建立,client可以使用SSH连接到服务器上。
guanwei.org NS ns.guanwei.org(这里建立一条NS记录,意思是如果本台DNS服务器上没有客户端查询的域名 (dnstunnel.guanwei.org),请去ns.guanwei.org(也就是111.222.333.444)上去查询)
详细配置方法
server端:
编辑/etc/dns2tcpd.conf文件,内容如下:
listen = 192.168.10.88(Linux服务器的IP)然后,运行dns2tcpd服务器程序: #./dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf
port = 53
user = nobody
chroot = /var/empty/dns2tcp/
domain = dnstunnel.guanwei.org(对该域名的请求进行转发,将返回数据包进行封装)
resources = ssh:127.0.0.1:22(可以为客户端提供的服务,也可以为http:127.0.0.1:3128,如果该服务器开启了http代理服务)
client端: #./dns2tcpc -z dnstunnel.guanwei.org ns.guanwei.org
如果ns.guanwei.org生效了,便可以连接服务器,提示:
Available connection(s):但是如果ns.guanwei.org还没有生效,会提示:no response from dns server 。这时可以先使用: #./dns2tcpc -z dnstunnel.guanwei.org 202.96.64.68
ssh
如 果成功连接服务器,则说明dnstunnel可以成功建立了,如果没有,请测试你获取到得dns服务器地址是否可用,并且guanwei.org的ns记 录是否生效。测试方法:将111.222.333.444映射到另外一个真正的dns服务器上,加一条A记录,如:test.guanwei.org A 192.168.10.254 。然后使用nslookup test.guanwei.org 202.96.64.68,观察能否成功解析。如果不能解析,请检查dnspod的配置及dns记录生效情况。
测试可以成功连接服务器后, 使用#./dns2tcpc -r ssh -l 4430 -z dnstunnel.guanwei.org 202.96.64.68 这时会在本地监听一个端口,类似一个反弹木马。使用ssh 127.0.0.1 -p 4430 便可以成功连接server的22端口。如果server提供http代理服务,那么你就可以设置http代理服务器免费上网了!
PS:我发现客户端在监听4430端口时是监听127.0.0.1:4430端口,只能本机访问,其他机器不能连接,如果有牛发现该问题的解决办法,请联系我,谢谢!
from http://www.guanwei.org/post/applicationsecurity/07/dns-tunnel-dns2tcp.html