一.介绍
Dog Tunnel官方中文名就是狗洞,是由中国开发者 vzex 开发的,在KCP出现后进行了重构,将其底层UDP支持替换为了KCP,使其效率大大提高,在某些恶劣的网络环境下依旧能有不错的效果。当然,它也是支持TCP模式的,另外它也是支持加密的,在P2P打洞失败的情况下也能够自动切换为C/S模式来使用服务器中转。需要了解的是,Dog Tunnel也提供了Lite版本,仅支持P2P模式,数据完全不通过任何第三方服务器中转,保证了安全性,当然,这就要求了打洞的双方至少有一方拥有公网IP。
和N2N类似的是,它也支持多个服务器,能够在多连接的情况下自动切换负载均衡以便提高速度。还有一个特殊之处,是其原生支持socks5代理,可以在公司网络等特殊网络环境下实现特定需求。
二.安装
作者提供了热门平台的二进制程序,可以到官网下载——>传送门
带Lite的就是Lite版,反之就是常规版本
wget http://dog-tunnel.tk/down/dtunnel_linux_x64_0.80.tgz tar xzf dtunnel_linux_x64_0.80.tgz -C /usr/bin/ chmod +x /usr/bin/dtunnel*
当然,如果你有特殊需求,比如想用最新的,但是还没有出Release,那么可以自己编译一下
因为Dog Tunnel也是由Go写的,所以还是照例安装一下Go
wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz tar xzf go1.8.3.linux-amd64.tar.gz -C /usr/local mkdir /usr/local/gopackage vi /etc/profile #在profile中加入下面的环境变量,PATH如果原来就有请自行合并 GOROOT=/usr/local/go GOPATH=/usr/local/gopackage PATH=$PATH:$GOROOT/bin:$GOPATH/bin export GOROOT GOPATH PATH source /etc/profile go get github.com/go-sql-driver/mysql go get github.com/klauspost/reedsolomon go get github.com/cznic/zappy go get -u -d github.com/vzex/dog-tunnel cd $GOPATH/src/github.com/vzex/dog-tunnel/ git checkout master make
然后会生成dtunnel_s和dtunnel两个程序,前者是服务端,后者是客户端
如果想要编译Lite版,那就如下
go get github.com/klauspost/reedsolomon go get github.com/cznic/zappy go get -u -d github.com/vzex/dog-tunnel cd $GOPATH/src/github.com/vzex/dog-tunnel/ git checkout udpVersion make
三.配置
先介绍常规版本
dtunnel_s -addr 0.0.0.0:8000 -addrudp 0.0.0.0:8018 -admin 127.0.0.1:1234 -https -ssl -cert /path/to/https.crt -key /path/to/https.key -dbhost 1.2.3.4:3306 -dbpass mysqlpass -dbuser mysqluser -replace #参数说明 -addr:TCP端口地址 -addrudp:UDP端口地址,用于P2P辅助打洞 -admin:管理接口,用于提供API方便管理 -https:启用管理接口的HTTPS支持,需要指定-cert和-cert参数,默认关闭 -ssl:启用ssl支持,启用需要指定-cert和-cert参数,默认关闭 -cert:证书路径 -key:证书密钥路径 -dbhost:数据库服务器 -dbpass:数据库密码 -dbuser:数据库用户 -replace:如果客户端注册名冲突,踢掉之前的,默认关闭 -version:显示版本
如果要鉴权(即如下方客户端那样有啥reg啊,link啊,然后还能限制同一IP使用数量),请配置数据库(配置数据库后客户端必须要指定key参数才能连上,这玩意是数据库里的AuthKey字段),数据库的初始化sql文件在GitHub上有,自己导入——>传送门
另外操作要么自己往里面填数据,要么用GitHub上那个admin的API
至于客户端
远端: dtunnel -addip 127.0.0.1 -buster 1.2.3.4:8018 -remote 1.2.3.4::8000 -clientkey testkey -compress -delay 2 -dnscache 20 -encrypt -kcp k2:v2 -reg test -local :80 -mode 0 -ssl 近端: dtunnel -addip 127.0.0.1 -buster 1.2.3.4:8018 -remote 1.2.3.4::8000 -clientkey testkey -compress -delay 2 -dnscache 20 -encrypt -kcp k2:v2 -link test -local :8888 -mode 0 -ssl #参数说明 -addip:出口IP(单个或列表) -buster:打洞服务器,用于P2P模式 -remote:远程服务器,用于C/S模式 -clientkey:客户端Key,用于远端和近端认证,需一致 -compress:压缩数据,远端和近端需一致 -debug:调试模式 -delay:打洞失败后重试延迟,秒 -dnscache:DNS缓存有效期,如果大于0将定时清空DNS缓存,分钟 -encrypt:P2P模式加密 -f:从文件中加载配置 -kcp:kcp配置,远端和近端需一致 -key:访问Key(服务端数据库中的AuthKey) -reg:注册名,远端使用 -link:连接的注册名,近端使用,用于识别连接远端 -local:本地监听端口,填socks5则为socks5代理服务 -mode:连接模式(0:P2P打洞失败后切换为C/S 1:只使用P2P 2:只使用C/S) -pipen:管道数 -ds:数据纠错??仅在P2P模式有效,远端和近端需一致 -ps:奇偶校验??仅在P2P模式有效,远端和近端需一致 -ssl:启用ssl支持,默认启用,服务端没有启用的话请使用-ssl=false来关闭 -v:输出详细日志 -version:显示版本
如果有啥不对请不要吐槽,这玩意的文档实在写的太烂了,或者说根本没有文档这种东西……我都是看着程序输出的说明连蒙带猜翻译的
所以,下面我们来介绍Lite版本,不和这个看上去就好麻烦的版本折腾了……
Lite版谢天谢地是有说明文档的,感动啊,果然作者其实也不希望你用常规版本吗……
内容还是挺多的,我就不复制粘贴了,自己去看吧
说明文档——>传送门
看了下,这个算良心文档,不仅有说明,还有命令的栗子,所以我建议除非实在完全没有公网IP无法打洞,不然别用常规版折腾自己了
文章评论
您写得很详细,按照您的设置,我已经配置好了。不过关闭了ssl。请问有必要用ssl么?会对连接速度有影响么?
@Duckie 看你需要吧,如果是传输比较隐私的东西可能还是启用会好点,至于速度的话这个我没有测试过,理论上SSL会带来额外的性能开销,但是运营商可能对SSL流量的QOS没那么厉害?(不确定)
挺不错的教程!希望持续更新,谢谢!对了。开p2p模式在客户端之间只有scp这一种方式可以传输数据的吗?
@gtsx 什么意思?scp是传文件那个命令还是啥……不管是p2p还是cs,这个都是实现的端口映射啊,只要是能用tcp/udp通过指定端口传输数据的,理论上都行
@Senra 是传文件的scp命令,只是觉得有点麻烦不如wget方式方便。
是传文件的scp命令,只是觉得有点麻烦不如wget方式方便。对了,回复评论有问题哟,提示不能重复评论,只好改名字和邮箱。
@gtsx3 可能是CDN的问题……传文件你也可以用wget啊,
python -m SimpleHTTPServer 端口
,然后把这个端口映射出来你也可以wget@Senra 恩恩,没试过映射本地端口用wget,应该可以,我试试,不晓得这两者速度和稳定性哪个好。得测测。谢谢!
上面说Dog Tunnel也提供了Lite版本,仅支持P2P模式,是不支持P2P打洞吧??
@gtsx4 Lite版需要至少有一方有公网IP且存在外部能够访问的端口
@Senra lite版本是不支持两个内网通过p2p打洞的吧?
@gtsx4 是的,Lite不存在c/s模式,也不能在p2p模式中利用第三台公网服务器辅助打洞,所以在两方都是内网的环境下可能无法使用
@Senra 我现在用的就是常规版,但是好久没更新了,还是0.8,p2p模式老是不成功,只能使用c/s模式,期待完善p2p模式,要不然流量中转vps太慢了。站长,您有更好的工具推荐吗?frp的p2p打洞我也没成功。这两款内网穿透工具是现如今我用过最好的!
@gtsx4 大部分比较常用的内网穿透工具我应该都写了,一般情况下我都推荐dog tunnel和frp,既然你没法用frp的话那么去试试zerotier? 这个也还不错。
刚刚用了zerotier,确实挺不错的,100个免费很实用,操作也简单,搭建moon节点也很顺利,不过p2p打洞还是未成功,我也是醉了,可能真的是我这里内网环境实在太复杂了吧,对了,站长用过tinc吗?可以出个教程吗?我用yum安装的不是最新版,但是通过源码编译安装最新版的呢,却不能正常使用,不晓得你能否有时间出个这方面的教程?谢谢!
网站的文章搜索功能使用不正常,无法检索。
怎么写了半天的评论丢失了?晕,tinc站长能出个教程吗?教教大家使用源码包编译最新版,我用yum安装的不是最新的,源码编译安装又是各种问题。还是linux知识欠缺。
@gtsx4 tinc我当初写内网穿透的时候考虑过,但是感觉还是在配置上比较烦人,所以没写,网上的tinc配置文章挺多,就是容易把自己看懵逼……
@Senra tinc我也配置成功了,但是流量也是走的vps中转,没有p2p穿墙的效果,郁闷。zerotier搭建moon后,流量也是走的moon总之还没遇上一个p2p真正打洞成功的,好遗憾。
@gtsx4 那你的网络环境可能真的比较蛋疼……你可以把宽带搞成公网的
@gtsx4 我也试了好p2p打洞的方案,几乎都需要经过VPS。我可能是由于这边的内网环境禁用了UDP协议,https://github.com/lazy-luo/smarGate 最近发现了这方案。正在研究中
两个局域网都是教育网内,策略做得可能严了些。
@gtsx4 教育网的NAT大部分有很多层,基本上打不了洞……我这儿也是,不过你可以尝试走v6看看(如果有的话
@Senra 现在还都没有ipv6,没法尝试,只能等大神更新了!
请问,狗洞可以用于两台内网机器配合一台VPS联机玩游戏吧,如果双方在接近的地点,近端远端如何决定呢?(近端远端如何判断)如果几个人想联机的话能用狗洞么?如果这几个人与服务器延迟都在60ms左右,使用狗洞速度如何呢(使用常规版本,非Lite版本,使用P2P)?希望尽快回答,谢谢。
@Yefori 你这个需求大概是无法用这个实现的,狗洞用于端口映射,目的是实现内网穿透或者端口转发,由于大部分游戏无法强制指定端口,并且原生实现使游戏数据走socks5代理,所以你这个想法基本没戏。如果你是为了游戏联机,大概可以使用常见的vpn(公网匹配)或者是zerotier(局域网联机)
还有,树洞与狗洞是否有什么联系?
@Yefori 除了名字都有个洞,其他无任何联系,前者是文件分享程序,后者是端口映射程序
@Senra 以前不懂端映的时候,我曾使用过一款叫树洞的端映,现在想想好像就是dt换了个皮。。。。。二次开发。
内网上不了qq,怎么配置,看不懂,都是要两端配合的
@i 对的,是需要两端的
以前不懂端映的时候,曾使用过一款叫树洞的端映。现在想想。刚开始应该是ngrok二开,后来是dt二开。
楼主在吗?是不是要配置mysql,我一字不漏复制你上面的,都启动失败呢?有联系方式吗
@lianglan 我的命令只能参考,你要用得自己改参数啊,全复制肯定不能跑
嗯嗯,目前是成功了,标准版P2P成功率很低,有没有成功率很高的其它工具?