在前文《什么是锐速、BBR,哪个好用,还有什么其它的加速方案?》中,我提到了基于KCP的网络隧道工具dog-tunnel
,本文介绍如何使用它实现网络加速,以及端口映射。
介绍
dog-tunnel,俗称狗洞,是一个p2p的打洞软件,可以在两个网络之间快速建立高速网络通道。有以下几个常见用途:
- socks5代理,本地通过VPS上网(测速对比见后文)
- 端口映射,将VPS的local port映射到本地(例如开发调试,可仅限本地访问)
- 反向端口映射,即将本地的local port映射到VPS(内网穿透,例如将自己计算机上的站点透过VPS的IP地址临时开放让他人访问)
- 透明代理(用于网关设备上,实现全局流量走VPS)
此项目有p2p
和udpVersion(lite)
两个分支,作者说以后主要维护lite
版本,所以后文都以lite
版举例,p2p
的特性看看就好,暂时用不到了。
特性
- 原生支持远端socks5代理
- 支持多洞模式,多连接时动态切换狗洞提高访问速度
- 远端掉线自动重连
p2p相关的特性:
- 数据安全,p2p模式通讯时数据不经过服务端,用户可自定义访问密码
- p2p模式底层采用KCP协议,在恶劣网络环境下比tcp延迟降低 30%-40%
- p2p模式支持AES加密
- p2p模式可以穿透80%的网络
- p2p模式失败时自动切换到c/s模式
下载安装
当前最新版本是Lite 1.41,只有一个文件,文件可同时在客户端和服务端执行。
例如在Linux安装:
# 下载
wget https://github.com/vzex/dog-tunnel/releases/download/lite_v1.41/dtunnel_linux_x64_1.41_lite.tgz
# 解压,得到dtunnel_lite文件
tar xvzf dtunnel_linux_x64_1.41_lite.tgz
新手入门
摘自官方说明,写完了本文才看到,很有用,所以放到这里供参考。
dtunnel_lite 分为近端和远端
dtunnel_lite 最基本的三个参数 -service / -local / -action
其中-service
是两端必须指定的,指向地址(ip:port
)需要一致,远端监听,近端连接,远端可选择省略ip(例如-action :8008), 省略ip时会监听系统所有网卡上的指定端口,但是连接端必须指定对应ip连接。
如何区分远端近端?
带-local参数的即为近端,不带即为远端(服务端)。
-local 代表近端连接远端成功后,本地需要监听什么端口,比如做端口映射,-local :8888代表本地监听8888端口,你连接本地的8888端口即连接到了被映射的远端端口了。
-action 是代表近端连接远端后-local端口具体的行为,这个行为可以是 端口映射(tcp或者udp),socks5代理(或者socks5_smart模式), route(route_smart)模式,该参数一般由近端指定,远端指定的话,会强制近端使用远端的策略,这个参数的默认值客户端为socks5,服务端为空。
其他参数请根据需要添加。
命令参数
后面会演示如何使用,在此之前先熟悉一下命令行工具支持的参数,尤其是理解action
参数十分重要。
-action 指明通道行为,接受三种值:
1. 默认socks5(socks5代理服务);
2. 指定参数route将开启透明代理模式(windows版本不支持该模式)
该模式下请自行设置用户的DNS和网关,将需要的tcp连接通过iptables转发到-local端口即可
3. 指定ip:port,将启用端口转发,配合-r参数是逆向端口转发;
客户端可指定该参数,当服务端指定参数时会强制采用服务端策略;
服务端设置为空字符串时,可接收客户端的任意action请求
-auth 用于简单的登录验证,两端不一致时客户端会被断开
-debug 调试输出
-dnscache 当socks5模式时有效,指定dns缓存时间,默认0,单位分钟
-encrypt 客户端指定,表示该通道是否启用消息加密
-local 通道连通时本地监听端口,格式ip:port
-pipe 通道个数,默认1,最大10
-r 反向模式,true时客户端触发action行为,服务端监听local指定的端口
-service 通道服务端地址,客户端指定时为连接地址,服务端指定时为监听地址,用于通道打通,双方地址一致,一般为服务端ip:port
-tcp tcp模式,默认false,使用udp模式在网络差的环境下效率更高,cpu占用也更高(待优化),两端需一致
-timeout 客户端执行连接超时时间,tcp模式关闭模式时有效
-v 更多输出信息
-version 版本信息
-xor 两端需一致,用于udp模式握手加密,内容为任意字符串
-session_timeout 指定连接会话在不活跃状态时多久(秒)后被销毁,防止被动连接的情况下产生僵尸socket,默认0不自动销毁
应用场景举例
演示环境:本地Windows10,远程VPS是Ubuntu 18.04。VPS的IP是1.2.3.4
。
开启服务端
后面客户端的多种配置应用都依赖于这一步,我们不限制服务端可接受的action,即将其设为""
,为增强安全,同时使用auth
和xor
参数。
dtunnel_lite -service 0.0.0.0:3389 -v -action "" -xor handshake_token -auth your_password
命令解释:
在VPS上运行,让狗洞监听本地3389的udp服务端口,action为空表示客户端连接时不限制action行为,如果服务端想限制客户端行为,可强制设置action内容,例如socks
或router
。
xor
为用于握手加密的令牌,可选
auth
为登陆验证的密码,可选
开启客户端
上面我们配置服务端可接收客户端的多种action,下面分别演示客户端的几种典型配置,以及可以实现的功能。
1. socks5代理
我们在本地的1080端口开启socks5代理(类似ssh -D
,不用ss等工具了),之后就可以通过这个通道上网了,可以在浏览器等应用中设置。
dtunnel_lite -service 1.2.3.4:3389 -v -action socks5 -encrypt -xor handshake_token -auth your_password -local :1080 -pipe 5 -session_timeout 30
参数解释:
# 客户端连接服务器3389的udp端口
-service 1.2.3.4:3389
# 监听本地的1080端口作为socks5服务
-action socks5
-local :1080
# 传输内容加密
-encrypt
# 握手令牌
-xor handshake_token
# 建立5条固定通道(防止大数据传输或者网络不好时单条通道拥堵)
-pipe 5
# web请求中不可避免的会有一些非正常关闭的tcp连接,加session_timeout可以清除这些无用连接,防止描述符泄露。
-session_timeout 30
# 显示详情
-v
效果对比:
用dog-tunnel之前直连VPS上的html-speedtest,测速数据比较差劲
用dog-tunnel后,访问VPS上的html-speedtest,测速数据明显改善
2. 开启透明代理
透明代理一般应用于路由器等网关设备上,狗洞的windows版本不支持该模式
dtunnel_lite -service 1.2.3.4:3389 -v -action route -encrypt -xor handshake_token -auth your_password -local :1080 -pipe 5
参数同上,不过action设置route。实际在Linux客户端(例如路由器)使用时,可设置iptables将所有需要转发的tcp连接转发至1080端口,从而实现透明代理。
3. 端口映射
dtunnel_lite -service 1.2.3.4:3389 -v -action 127.0.0.1:2333 -encrypt -xor handshake_token -auth your_password -local :8787 -pipe 5
参数解释:端口映射或者后面的反向映射,action都是一个地址:端口
字符串,地址是从VPS的视角看待的,所以可以是127.0.0.1:2333
,也可以是1.2.3.4:2333
,即远程VPS的IP。
执行后,服务端2333端口将被映射至本地8787端口。
例如VPS上在2333端口开了html5speed,此时我们在Windows访问127.0.0.1:8787
即可访问,这时的速度也是很赞的。
4. 反向映射
dtunnel_lite -service 1.2.3.4:3389 -v -action 127.0.0.1:80 -r -encrypt -xor handshake_token -auth your_password -local :8080 -pipe 5
执行后,本地的8080端口,被映射到VPS的80端口。
例如此处我在Windows的8080端口上开启了IIS的默认页面,因为反向映射,实际可以通过1.2.3.4:80
端口访问到这个页面;这跟内网穿透实现的功能是一样的。
参考资料
-- EOF --
本文最后修改于6年前 (2019-06-08)