我的命令:
server端:
sudo iodined -P passwd -f -DD 10.0.0.100 abc.com
client端(直连模式,-r表示使用xxx.abc.com的xxx来转发数据,不加-r表示raw):
sudo iodine -P passwd -f -r -T TXT 45.77.39.243 abc.com
然后访问:ssh root@10.0.0.100 本质上和 ssh root@45.77.39.243 是一样的效果。
如果你在45.77.39.243上开shadowsocks client和server,然后连接 10.0.0.100 的 1080端口 不就是在穿-墙了嘛!
补充,中继模式下,在我的测试环境中必须加-r和-M,否则无法建立连接:sudo iodine -r -f -P passwd <domain.com> -M 200
DNS Tunnel
DNS隧道利用的正是DNS的查询过程,通过构造特殊的加密的DNS查询数据来构建隧道传输数据。
-
环境准备
1台有公网IP的服务器
1个可自行配置DNS的域名
DNS Tunnel工具,此处用 [iodine](https://github.com/yarrick/iodine) -
DNS配置
假设我有个域名
zemal.tk
,需要设置两条DNS:A aaa xx.xx.xx.xx(Your IP)
NS b aaa.zemal.tk -
工作过程
配置好上述过程后,当本机查询b.zemal.tk时,此处略过根域名服务器和顶级域名服务器的查询,当到达DNSPOD时。
- b.zemal.tk需要aaa.zemal.tk这个DNS服务器来获取IP
- 发现aaa.zemal.tk的A记录,得到aaa.zemal.tk这个DNS服务器的IP
- 向2中得到的DNS服务器查询b.zemal.tk的IP
可见我们需要将自己的服务器伪装成一台DNS服务器,就需要DNS Tunnel工具了
Server端:
iodined -f -P testforme 192.168.100.1 b.zemal.tk
# -f 开启前台显示
# -P 连接密码,自己设置
# 192.168.100.1 是自设的内网网段 也可用172.16.. 10...这些
# b.zemal.tk 监听b.zemal.tk的DNS查询请求Client端:
iodine -f {YourServerIP} b.zemal.tk
# Mac用户需要加 -d utunx 否则会出段错误连接成功截图:
此时访问192.168.100.1
和访问你的远程服务器就是一样的了
0x03 免费上网
在肯德基,麦当劳甚至校园网中往往都需要一次认证才可以,比如:
而这些地方往往是允许未认证的DNS查询的,那我们就可以利用DNS隧道上网了
常见的方式一是利用一层ssh反向隧道,另一种方式就是大家熟知的shadowsocks。在服务器搭建好ss服务 器并搭建好DNS隧道,就可以这样添加代理服务器来上网了
其中,地址为在Server设置的网段的地址,设置好后就可以愉快的上网了。我在校园网内测试成功。由于DNS查询基于UDP,其实就是用UDP模拟TCP,因此效率很低,导致网速真心比较慢慢,我测试的大概每秒几十k,貌似也就能上个QQ。。
通过虚拟内网地址连接服务器
iodine -f -P password server_ip server.urdomain.com
1 | Opening device Local Area Connection 2 |
ping 10.0.0.1 /t
运行示例:
服务端(需要在域名提供商处添加两条DNS记录):
1
2
3
4
5
6
|
iodined -f -c -P password 192.168.99.1 d0.geeshell.com
# -f 前端运行(windows版不可用)
# -c 禁用客户端每一个请求的IP/端口检查
# -P 设置密码,不启用此选项运行则需要交互输入密码
# 192.168.99.1 隧道服务端IP
# d0.geeshell.com查询域
|
客户端:
1
2
|
iodine -f -P password d0.geeshell.com
# 选项说明见上
|
成功建立隧道客户端会得到192.168.99.0/24段的一个IP,可以通过ping 192.168.99.1测试连通性。
以前写过这篇文章,对DNS tunnel进行了详细介绍,并附了DNS2tcp工具的使用方法,详见:[DNS tunnel(DNS隧道)技术应用工具-DNS2tcp的使用方法及原理] 。不过那个工具在windows下好像不太好用,我就又找了一个工具,叫iodine。
官方网站:http://code.kryo.se/iodine/
官方下载地址:http://code.kryo.se/iodine/iodine-0.6.0-rc1-win32.zip
此外,在服务器及客户端都需要安装openVPN。下载地址:http://www.skycn.com/soft/60781.html (Win7 64位测试有效)。
代理软件:http://www.cngr.cn/dir/207/228/2011010465002.html(代理服务器)
使用方法:
服务器端:
1.下载openVPN。安装时仅选择TAP-Win32 driver即可。安装后,可以发现服务器多出一块网卡,我这里给随便设置了一个IP:10.0.0.100。
2.下载iodine win32 binaries。解压后可以得到两个exe文件及一个dll。进入解压目录,输入命令:
iodined -c -f 10.0.0.100 dns.guanwei.org (这里我已经将dns.guanwei.org的NS记录设置为服务器的IP了详见上篇文章)
设置一个password,出现“Listening to dns for domain dns.guanwei.org ”代表已经成功!
客户端:
1.下载openVPN。安装时仅选择TAP-Win32 driver即可。安装后,可以发现服务器多出一块网卡。
2.下载iodine win32 binaries。解压后可以得到两个exe文件及一个dll。进入解压目录,输入命令:
iodine -f -P 刚才设置的密码 服务器的IP dns.guanwei.org
出现“Connection setup complete, transmitting data.”代表已经成功!
此时,TCP over DNS已经建立成功。在客户端ping 10.0.0.100可以发现成功ping通。
如果想实现免费上网,只需在服务器端安装一个代理软件即可,这里我推荐CCproxy。下载地址:http://www.cngr.cn/dir/207/228/2011010465002.html
这时,将IE的代理服务器设置为10.0.0.100即可。下面就请免费上网吧!
安装后:
iodine -f YourServerIP a.qiuri.org
# Mac用户需要加 -d utunx 否则会出段错误
例: iodine -f -d utunx YourServerIP a.qiuri.org
运行成功后
bash-3.2# iodine -f -d utunx 101.254.176.228 a.qiuri.org
Enter password:
Opened utun2
Opened IPv4 UDP socket
Sending DNS queries for a.qiuri.org to 101.254.176.228
Autodetecting DNS query type (use -T to override).
Using DNS type NULL queries
Version ok, both using protocol v 0x00000502. You are user #0
Setting IP of utun2 to 192.168.100.2
Adding route 192.168.100.0/27 to 192.168.100.2
add net 192.168.100.0: gateway 192.168.100.2
Setting MTU of utun2 to 1130
Server tunnel IP is 192.168.100.1
Testing raw UDP data to the server (skip with -r)
Server is at 101.254.176.228, trying raw login: ....failed
Using EDNS0 extension
Switching upstream to codec Base128
Server switched upstream to codec Base128
No alternative downstream codec available, using default (Raw)
Switching to lazy mode for low-latency
Server switched to lazy mode
Autoprobing max downstream fragment size... (skip with -m fragsize)
768 ok.. 1152 ok.. ...1344 not ok.. ...1248 not ok.. ...1200 not ok.. 1176 ok.. 1188 ok.. will use 1188-2=1186
Setting downstream fragment size to max 1186...
Connection setup complete, transmitting data.
这时候我们ping 192.168.100.1
,相当于ping
了我们的服务器IP。所以可以理解成访问192.168.100.1就等于访问了我们远程服务器。
最后,我们就可以通过dns隧道来进行免费上网。利用ssh或者socks等,这里我用到的是socks,用了大家比较常见的shadowsocks,首先在服务器搭建好shadowsocks。然后直接shadowsocks全局代理即可绕过认证透过dns隧道进行上网了。配置示例如下图。
DNS2TCP
同理,我们在域名准备阶段先解析好域名。
Server端:
因为我使用的vps是ubuntu 14.04,同样的,源里面已经包含了这个软件,所以可以直接apt-get install dns2tcp
来进行安装。
运行这个软件之前,我们首先要配置一下:
在 /etc 建立一个名为 dns2tcpd.conf 的文件,然后输入以下内容
listen = 1.2.3.4 #你的远程服务器IP
port = 53
user = nobody
chroot = /tmp
domain =a.qiuri.org #上面配置NS记录的域名
resources = ssh:127.0.0.1:22,socks:127.0.0.1:1082,http:127.0.0.1:3128 #可供客户端使用的资源
大致原理,以ssh为例。客户端本地监听22端口,将数据传送到指定端口,DNS2TCP将数据以dns协议传送到服务器端口,最后服务器再把数据转发到对应资源的端口去。
配置好之后,运行
dns2tcpd -f /etc/dns2tcpd.conf -F -d 2
-f 读取配置文件
-F 强制前台运行
-d 2 开启debug, 等级为2
如无错误,服务端已经没有问题了。
Client端:
Windows的话,我们需要下载一个软件 dns2tcp.zip 解压到任意路径就好
然后运行cmd,进入你刚刚解压软件的目录,也就是dns2tcp.exe
所在目录,运行dns2tcp
dns2tcpc -r ssh -z a.qiuri.org 1.2.3.4 -l 6666 -d 2
#-r 后接服务名, 这里我们用到ssh
#-z 后接NS记录的地址和远程服务器IP,Tips:IP地址最好写上, 可以不写
#-l 后接本地端口,可以随意,只要不冲突
#-d 开启 Debug模式
运行成功时候,会显示如下图,这时候就把这cmd放着,切记不要关闭
缺图
接下来我们要配置本地ssh,将会用到xshell,直接去官网下载安装即可 https://www.netsarang.com/products/xsh_overview.html
安装好后,打开,添加如下配置:
缺图
然后连接,直接输入远程服务器账户密码即可。
缺图
连接成功后,我们就可以开始建立ssh代理。
查看–隧道窗格,点击转移规则,然后右键添加,类型选择Dynamic (SOCK4/5),默认端口不必修改,最后确定。
缺图
如果单纯只用浏览器上网的话,我们可以在IE代理进行如下设置。
Internet选项-连接-局域网设置,勾选为LAN使用代理服务器,点击高级,套接字地址填127.0.0.1端口填1080
缺图
完成后,即可绕过绝大多数认证。注意,如果xshell连接不上的话,请在远程服务器和本地重启一下dns2tcp,一般多试试就会连接成功了。
本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/8059464.html,如需转载请自行联系原作者