DNS隧道
DNS tunnel 即 DNS隧道。从名字上来看就是利用DNS 查询过程建立起隧道,传输数据。为什么使用DNS tunnel?当你在酒店、机场等公共场所,通常有Wifi 信号,但是当你访问一个网站时
DNS tunnel 即 DNS隧道。从名字上来看就是利用DNS 查询过程建立起隧道,传输数据。
为什么使用DNS tunnel?
当你在酒店、机场等公共场所,通常有Wifi 信号,但是当你访问一个网站时,如 可能会弹出个窗口,让你输
入用户名、密码,登陆之后才可以继续上网(该技术一般为透明http 代理,不在本文讨论范围之内,以后再讲) 。这时,你没有账 号,就无法上网。但是有
时你会发现,你获取到得DNS 地址是有效的,并且可以用以进行DNS 查询,这时你便可以用DNS tunnel技术来实现免费上网了!
DNS tunnel的原理
首先,要知道DNS 系统的工作原理,见:[DNS系统(服务器) 的工作原理及攻击防护方法论] 。你在做 DNS 查询的时候,如果查的域名在
DNS 服务器本机的 cache 中没有,它就会去互联网上查询,最终把结果返回给你。如果你在互联网上有台定制的服务器。只要依靠 DNS 的这层
约定,就可以交换数据包了。从 DNS 协议上看,你是在一次次的查询某个特定域名,并得到解析结果。但实际上,你在和外部通讯。你没有直接连到局域网
外的机器,因为网关不会转发你的 IP 包出去。但局域网上的 DNS 服务器帮你做了中转。这就是 DNS Tunnel 了。
上 图简单介绍了DNS tunnel的原理。当你连接上wifi 后,你可以使用DNS 服务器,向这个服务器的53端口发送数据,请求一个域名,比如
b.xxx.org 。这台DNS 服务器上没有b.xxx.org ,那么它将向root ,也就是根域名服务器请求,看看根知道不。root 一看
是.org 的域名,就交 给.org 域名服务器进行解析。.org 的域名服务器一看是.xxx.org 那么就会去找.xxxi.org 的域名服务器
(f1g1ns1.dnspod.net),看看它有没有这条记录。.xxx.org 的域名服务器上一看是b.xxx.org ,如果它有这 条A 记录,
那么就会返回b.xxx.org 的地址。
但是,如果没有,你可以再在guanwei.org 的域名服务器上设定一个NS 类型的记录人,如:xxx.org NS
111.222.333.444(通常这里不让设置为地址,那么也好办,你可以先在DNS 服务器上添加一条A 记录,如ns.xxx.org
111.222.333.444,再添加NS 记录:guanwei.org NS ns.xxx.org),这里指定一个公网服务器,也就是上图绿色的
服务器,这台服务器中跑着DNS tunnel 的server 端,是一台假的DNS 服务器,他不会返回b.xxx.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 的域名了xxx.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 202.96.64.68,后面的域名服务器请根据实际情况替换) 。
前期配置
客户端client 可以使用域名服务器查询域名,这里设定该域名为dnstunnel.xxx.org (该域名不能在dnspod 的域名服务器上有任何
记录,因为这个记录是由server 进行应答的)
在xxx.org 的域名服务器上建立两条DNS 记录
ns.xxx.org A 111.222.333.444(这里的目的就是给DNS 服务器设定一个域名,按原理来说是可以舍去的,但是DNSpod 上
不可以将NS 记录配置为IP ,只能配置为域名,所以需要加上这条记录)
xxx.org NS ns.xxx.org(这里建立一条NS 记录,意思是如果本台DNS 服务器上没有客户端查询的域名
(dnstunnel.xxx.org),请去ns.xxx.org(也就是111.222.333.444) 上去查询)
在server 上开启SSH 服务。用以进行测试,如果DNS tunnel 建立,client 可以使用SSH 连接到服务器上。
详细配置方法
server 端:
,编辑/etc/dns2tcpd.conf文件,内容如下:
listen = 192.168.10.88(Linux 服务器的IP )
port = 53
user = nobody
chroot = /var/empty/dns2tcp/
domain = dnstunnel.xxx.org(对该域名的请求进行转发,将返回数据包进行封装) resources = ssh:127.0.0.1:22(可以为客户端提供的服务,也可以为http:127.0.0.1:3128,如果该服务器
开启了http 代理服务)
然后,运行dns2tcpd 服务器程序: #./dns2tcpd-F -d 1 -f /etc/dns2tcpd.conf
================================================
client 端:#./dns2tcpc-z dnstunnel.xxx.org ns.xxx.org
如果ns.xxx.org 生效了,便可以连接服务器,提示:
Available connection(s ):
ssh
但是如果ns.xxx.org 还没有生效,会提示:no response from dnsserver 。这时可以先使用: #./
dns2tcpc -zdnstunnel.xxx.org 202.96.64.68
如 果成功连接服务器,则说明dnstunnel 可以成功建立了,如果没有,请测试你获取到得dns 服务器地址是否可用,并且xxx.org 的ns 记
录是否生效。测试方法:将111.222.333.444映射到另外一个真正的dns 服务器上,加一条A 记录,如:test.xxx.org A
192.168.10.254 。然后使用nslookup test.xxx.org 202.96.64.68,观察能否成功解析。如果不能解析,
请检查dnspod 的配置及dns 记录生效情况。
测试可以成功连接服务器后, 使用#./dns2tcpc -r ssh -l 4430 -z dnstunnel.xxx.org
202.96.64.68 这时会在本地监听一个端口,类似一个反弹木马。使用ssh 127.0.0.1 -p 4430 便可以成功连接
server 的22端口。如果server 提供http 代理服务,那么你就可以设置http 代理服务器免费上网了