原理介绍
dns2tcp工作原理
正常情况下,当我们连上酒店或者其他需要验证才可以使用的网络后,虽然上不了网,但是我们的计算机却分配到了IP地址(不分配IP地址web认证就实现不了),此时若我们进行一些上网的操作,那么计算机的数据包将从TCP443端口上发出,校园网、酒店等网关就会拦截从这个端口上发出的数据包。同理从其它端口上发出的数据包也会遭到拦截。
但是有一个神奇的端口,从这个端口发出的数据包不会遭到网关拦截,它就是UDP53端口(UDP53端口上运行的协议是DNS协议(域名解析协议))。
常见的内网环境中 , 防火墙可能会限制只允许 udp 53 端口出站,这样我们可以利用 DNS 查询流量来封装 TCP 流量 , 达到绕过防火墙的目的。
DNS隧道。从名字上来看就是利用DNS查询过程建立起隧道,传输数据。
dns2tcp工具介绍
dns2tcp 是一个使用C语言开发的利用DNS隧道转发TCP连接的工具。
客户端会在本地监听一个端口,并指定:要使用服务端上面的哪个资源(如ssh、socket、http)
我们只需把数据扔进本地的该端口,dns2tcpc将使用DNS隧道传送到服务端。
随后,服务端根据客户端指定要使用的资源,将数据转发到其本机的相应端口中去。
这里的相应端口,可通过配置文件(/etc/dns2tcpd.conf)配置。
准备工作
判断DNS解析的53端口是否开放
连接校园网,测速在未认证状态下是否可以正常dns解析
$ nslookup www.baidu.com
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 110.242.68.3
Name: www.a.shifen.com
Address: 110.242.68.4
可以看到,nslookup解析域名正常,代表DNS解析的53端口正常开放,从这个端口发出的数据包不会遭到网关拦截 ,也就是UDP53端口。
云服务器与域名
- 具有公网ip的云服务1台
- 域名一个
搭建步骤(ubuntu16.04为例)
设置域名解析
登录你的域名服务器商如:DNSpod
在域名下面添加一个A记录,A记录的名字可以任意,如ns1.vvvtimes.com,A记录的值为你VPS服务器的IP地址。
最后,再添加一个NS记录,这个NS的名字可以任意,比如tcp.vvvtimes.com,NS记录的值为你上面添加的A记录的名字,即ns1.vvvtimes.com。
服务器端
安装DNS2TCP
sudo apt update
sudo apt install dns2tcp
编辑DNS2TCP配置文件
在 /etc 建立一个名为 dns2tcpd.conf 的文件, 然后输入以下配置:
listen = 0.0.0.0
port = 53
user = nobody
chroot = /tmp
domain = tcp.vvvtimes.com(上面配置NS记录的域名)
key = fuckoff (密码,可选)
resources = ssh:127.0.0.1:22,socks:127.0.0.1:1082,http:127.0.0.1:3128
启动 DNS2TCP(建议使用screen启动)
dns2tcpd -f /etc/dns2tcpd.conf -F -d 2
注意:腾讯云服务器不给实际网卡分配公网IP,所以要监听0.0.0.0
客户端
安装DNS2TCP
sudo apt update
sudo apt install dns2tcp
启动 DNS2TCP(建议使用screen启动)
dns2tcpc -c -k fuckoff -r ssh -z tcp.vvvtimes.com 1.2.3.4 -l 2222 -d 2
-k 后接密码,与服务器端的配置保持一致即可
-r 后接服务名称, 这里我们用ssh
-z 后接NS记录的网址, ip, 注意IP地址最好写上, 可以不写
-l 后接本地端口
-d 开启 Debug
测试
ssh连接测试
ssh root@127.0.0.1 -p 2222
可以直接登陆你的server ssh。
设置ssh隧道(偶尔会提示reset peer或许要多试几次):
ssh -CfNg root@127.0.0.1 -p 2222 -D 7002
查看端口是否开放
$ lsof -i:2222
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dns2tcpc 28938 bonelee 4u IPv4 11154775 0t0 TCP localhost:2222 (LISTEN)
dns2tcpc 28938 bonelee 5u IPv4 11157735 0t0 TCP localhost:2222->localhost:46296 (ESTABLISHED)
ssh 28953 bonelee 3u IPv4 11157734 0t0 TCP localhost:46296->localhost:2222 (ESTABLISHED)
$ lsof -i:7002
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 28953 bonelee 4u IPv4 11160083 0t0 TCP *:afs3-prserver (LISTEN)
ssh 28953 bonelee 5u IPv6 11160084 0t0 TCP *:afs3-prserver (LISTEN)
浏览器里直接socks5代理127.0.0.1 7002端口即可上网了!上谷歌也是可以的。。。不过速度就不咋地。。。
评论 (0)