正常情况下,当我们连上酒店或者其他需要验证才可以使用的网络后,虽然上不了网,但是我们的计算机却分配到了IP地址(不分配IP地址web认证就实现不了),此时若我们进行一些上网的操作,那么计算机的数据包将从TCP443端口上发出,校园网、酒店等网关就会拦截从这个端口上发出的数据包。同理从其它端口上发出的数据包也会遭到拦截。

但是有一个神奇的端口,从这个端口发出的数据包不会遭到网关拦截,它就是UDP53端口(UDP53端口上运行的协议是DNS协议(域名解析协议))。

graph LR
A[本机] -- 连接 -->B
B-->C(TCP443等端口)
C--未通过账号验证-->E(阻塞)
E -- 不通 -->互联网
B(校园网)-- 分配IP -->A[本机] 
B -- 53/67/68 端口转发 -->F(DNS协议畅通)
F -->互联网

常见的内网环境中 , 防火墙可能会限制只允许 udp 53 端口出站,这样我们可以利用 DNS 查询流量来封装 TCP 流量 , 达到绕过防火墙的目的。

graph LR
A[Internet] -- 堵塞 但 分配IP -->B(电脑-客户端)
B--安装dns2tcpc-->H(开启)
H-->F
B(电脑-客户端)-- 连接 -->A[Internet] 
A  -->C(公网VPS)
C--安装配置-->E(dns2tcp)
C--安装配置-->G(socks代理)
G-- 启动 -->F(隧道)
E-- 启动 -->F

DNS隧道。从名字上来看就是利用DNS查询过程建立起隧道,传输数据。

具体来说:你在做 DNS 查询的时候,如果查的域名在 DNS 服务器本机的 cache 中没有,它就会去互联网上查询,最终把结果返回给你。如果你在互联网上有台定制的服务器。只要依靠 DNS 的这层约定,就可以交换数据包了。从 DNS 协议上看,你是在一次次的查询某个特定域名,并得到解析结果。但实际上,你在和外部通讯。你没有直接连到局域网外的机器,因为网关不会转发你的 IP 包出去。但局域网上的 DNS 服务器帮你做了中转。这就是 DNS Tunnel 了。

上图简单介绍了DNS tunnel的原理。当你连接上wifi后,你可以使用DNS服务器,向这个服务器的53端口发送数据,请求一个域名,比如 dns.dengxj.com 。这台DNS服务器上没有 dns.dengxj.com,那么它将向root,也就是根域名服务器请求,看看根知道不。root一看是.com的域名,就交给.com域名服务器进行解析。.com的域名服务器一看是.dengxj.com那么就会去找.dengxj.com的域名服务器,看看它有没有这条记录。.dengxj.com的域名服务器上一看是 dns.dengxj.com,如果它有这条A记录,那么就会返回dns.dengxj.com的地址。

这里如果我们指定一个公网服务器,也就是上图绿色的服务器,在这台服务器中跑DNS tunnel的server端,作为一台假的DNS服务器,他不会返回dns.dengxj.com的地址,但是它会将你的请求转发到已经设定的端口中,比如SSH的22端口,22端口返回的数据它将转发到53端口返回给客户端(也就是你的电脑)。这时,你就可以用这台公网服务器的资源了,如果是一台http或者sock代理,那么你就可以用这个代理免费上网了。

dns2tcp 是一个使用C语言开发的利用DNS隧道转发TCP连接的工具。

客户端会在本地监听一个端口,并指定:要使用服务端上面的哪个资源(如ssh、socket、http)

我们只需把数据扔进本地的该端口,dns2tcpc将使用DNS隧道传送到服务端。

随后,服务端根据客户端指定要使用的资源,将数据转发到其本机的相应端口中去。

这里的相应端口,可通过配置文件(/etc/dns2tcpd.conf)配置。

需要提前准备的材料:
  1. 公网VPS(最好在中国大陆)
  2. 域名 (文末代码块给出了无域名情况下的解决方式)
其他准备工作:
  1. 将TCP80,TCP443,UDP53端口的数据设置为允许入站与出站

  1. 设置域名解析

第一条NS解析是在告诉域名系统,想要知道IP地址,就去问““dengxj.com”
第二条A类解析是在告诉域名系统,“dengxj.com”的IP地址是“xxx.xx.xx.xxx”

A记录 : 用来指定主机名或域名对应的IP地址记录,通俗来说A记录就是服务器的IP,域名绑定A记录就是告诉DNS,当你输入域名的时候给你引导向设置在DNS的A记录所对应的服务器。

NS记录 : 域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析,简单的说,NS记录是指定由哪个DNS服务器解析你的域名。

MX记录 : 邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。

CNAME记录 : 别名记录,允许您将多个名字映射到同一台计算机。通常用于同时提供WWW和MAIL服务的计算机。

graph LR
A[本机]  -->B(客户端)
B--设置监听端口-->C(53)
C--假DNS服务器 -->E(SSH http sock端口)
E  -->互联网
互联网 -->E
E  -->C
C  -->B

当你连接上wifi后,你可以使用DNS服务器,向这个服务器的53端口发送数据,如果请求域名 dengxj.com 。这台DNS服务器上没有 dengxj.com,那么它将向root,也就是根域名服务器请求,看看根知道不。root一看是.com的域名,就交给.com域名服务器进行解析。.com的域名服务器一看是.dengxj.com那么就会去找.dengxj.com的域名服务器,看看它有没有这条记录。这里我设置了NS解析,是在告诉域名系统,想要知道IP地址,就去问““dengxj.com” ,第二条A类解析是在告诉域名系统,“dengxj.com”的IP地址是“xxx.xx.xx.xxx”。

如果在这台IP地址是“xxx.xx.xx.xxx”的服务器中跑DNS tunnel的server端,作为一台假的DNS服务器,他不会返回dengxj.com的地址,但是它会将你的请求转发到已经设定的端口中,比如SSH的22端口 (http的8080端口,socks的7777端口,端口选择较为随意 可通过配置文件(/etc/dns2tcpd.conf)配置),端口返回的数据它将转发到53端口返回给客户端(也就是你的电脑)。

SSH用于使用 公网服务器的资源
http或者sock用于代理免费上网
客户端CMD后 -r 后可选择接<ssh/socks/http中的任意一个>

一、公网VPS配置

(1)安装配置dns2tcp

#安装dns2tcp
sudo apt-get install dns2tcp

#配置dns2tcp
sudo vim /etc/dns2tcpd.conf  将其中内容修改为:
listen = 0.0.0.0
port = 53
user = nobody
chroot = /tmp
domain = dengxj.com         #NS解析对应的域名
resources = ssh:IP:22,http:IP:8080,socks:IP:7777   #其IP地址是云服务器公网IP,端口随意设置为了7777

(2) 安装配置dante-server

接下来需要搭建一个socks代理。我选择使用dante-server来搭建。首先安装它,命令如下:

#安装
apt-get install dante-server

#配置
sudo vim /etc/danted.conf  将其中内容修改为:
logoutput: /var/log/sockd.log
internal: eth0 port = 7777
external: eth0
socksmethod: username none
user.privileged: proxy
user.unprivileged: nobody
client pass {
    from: 0.0.0.0/0 port 1-65535 to: 0.0.0.0/0
}
socks pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    protocol: tcp udp
}

我们现在看到的配置文件配置了一个监听端口7777的socks代理,无身份认证,允许任何客户端连接。

二、办公电脑(客户端)软件配置

获得dns2tcp的客户端程序dns2tcpc

#Linux
sudo apt-get install dns2tcp

#Windows系统
下载dns2tcp客户端程序dns2tcpc

三、搭建隧道

(1)公网VPS搭建隧道

#创建后台会话 并 启动dns2tcp的服务器端
screen -S dns2tcpd
dns2tcpd -f /etc/dns2tcpd.conf -F -d 2

其中参数“-f /etc/dns2tcpd.conf”指定了配置文件,“-F”要求程序在前台运行,“-d 2”指明了输出调试信息,级别为2。

#启动socks代理
/etc/init.d/danted start

(2)办公电脑(客户端)搭建隧道

#建立DNS隧道  打开CMD,键入并执行如下命令:

dns2tcpc -r socks -z dengxj.com IP -l 8888 -d 2

-r 后接服务名称<ssh/socks/http中的任意一个>
-z 后接你设置的NS记录,和你的VPS公网ip  <公网ip> 可不填,不写将使用中继模式,否则使用直连模式
   中继模式像我们平时上网一样,DNS解析先经过互联网的迭代解析,最后指向我们的恶意DNS服务器。相比直连,速度较慢,但是更安全。
-l 后接本地端口,随便一个常用端口就行,8888”指明了隧道的这头监听的端口
-d 开启 Debug ,“-d 2”指明了输出调试信息,级别为2,作用和服务器端相同
-k 密码 可以省略

(3)测试

在办公电脑(客户端)里打开火狐浏览器,设置socksv5代理,IP地址是“云服务器公网IP”,端口是8888,如下图所示。

其他浏览器,可以打开Internet选项,依次选择”连接”->”局域网设置”->”为LAN使用代理服务器”->”高级”

在socks/套接字输入框中,要使用的代理服务器地址填 云服务器公网IP,端口填8888,然后点击确定。

若是前面各步均正确无误,最后出现了错误:

No response from DNS xx.xx.xx.xx
把办公电脑的DNS直接设置为“xxx.xx.xx.xxx”(公网IP)

#也可以在dns2tcpc的参数中指明要使用的DNS服务器
dns2tcpc -r socks -z dns2tcp.werner.wiki dns.werner.wiki -l 8888

第二个解决办法我们实际上完全抛开了现有的域名系统,也就没有了注册域名设置解析的必要。但若防火墙规则较为严格,只允许目的IP是特定DNS服务器的数据包通过,此方法便行不通了。
Last modification:February 28th, 2020 at 10:45 am
如果觉得我的文章对你有用,请随意赞赏