工具官网:https://rustvnt.com/
Github:https://github.com/vnt-dev/vnt
参数详解:点我打开
vnt是一款用Rust语言开发的跨平台开源内网穿透工具,它和前辈zerotier与tailscale一样,都是用于打穿内网限制,利用点对点p2p技术创建加密的VPN隧道。
传统的p2p内网穿透工具都是使用UDP进行打洞的,但是这容易遭受到运营商的Qos,而vnt使用使用多通道UDP,能有效减缓针对UDP的限流,并且采用多种NAT穿透策略,在特定条件下也能建立TCP直连隧道。
用户可以自选虚拟ip地址,并且操作简单,不需要配置太多设置即可使用。并且作者的服务器部署在国内,实在无法实现穿透的话中转也能获得不错的延迟和下载速度。vnt支持自建服务器,可以搭配内网穿透服务实现无感直连中转。vnt还支持使用WireGuard接入VNT网络。
一、客户端下载
目前支持的GUI工具有Android和Windows,linux、MacOS可以使用命令行接入vnt网络。ios的话可以使用WireGuard来接入,openwrt也有大牛自行编译出软件包了(来自issue)
- Android、Windows:https://github.com/vnt-dev/VntApp
- Android-Magisk:https://wwi.lanzoup.com/i109V26vfxib
- linux、MacOS:https://github.com/vnt-dev/vnt
- openwrt:https://github.com/lmq8267/luci-app-vnt
- 群辉:我不是矿神已经上线该套件
- 本地下载:点我打开
二、配置客户端
1、安卓
点击右上角添加一个配置
配置名称
配置名称随意
组网编号
这个编号是用来判断不同设备是否在同一虚拟局域网的唯一标识token,要和别人的不一样
设备名称
设备名称用来识别不同设备
虚拟IPv4
虚拟ip可以自己选个一个ip地址,但必须是10.26.0.x的网段,因为作者提供的免费服务器网段为10.26.0.0/24,且默认网关是10.26.0.1。留空默认使用DHCP
服务器地址
服务器地址使用默认作者的服务器,也可以填写自己搭建的服务器地址,后续会说如何搭建
协议
协议默认是UDP,也推荐使用,如果效果差可以试试其他模式
- [默认]ip:port
- [tcp连接]tcp://ip:port
- [wss连接]wss://ip:port
- [tcp+txt解析]tcp://txt:domain.com
压缩
压缩可以选择开启lz4,压缩效果不明显,zstd需要自行编译的服务端才可以开启
允许WireGuard流量
没特殊需求,默认不允许即可
in/out-ip
这里比较复杂并且通过名字来理解容易搞反概念,我们先看看官网是怎么解释的
in-ip
将指定网段的数据转发至特定vnt设备,可以是转发全部数据(0.0.0.0.0/0),相当于vpn模式,也可以是特定内外网段的(192.168.1.0/24),例如:192.168.1.0/24,10.26.0.20,指的是将192.168.1.0/24的全部数据都发往10.26.0.20
out-ip
将接收的指定网段(192.168.1.0/24)数据转发至子网设备,可以填写0.0.0.0/0,接受全部来自vnt发来的数据,相当于VPN模式,与in-ip一一对应,即in-ip:192.168.1.0/24,10.26.0.x对应out-ip:192.168.1.0/24
这里比较疑惑的是in-ip是转发去别的设备,为什么用的in-ip;而out-ip却指的是允许接受并转发外部的流量
在这里我猜测in/out-ip是指的是vnt客户端,而不是整个设备而言的,让我们换个视角再看in/out-ip查看
vnt在接收到设备要访问192.168.1.0/24的数据就会劫持并进入(in-ip)vnt发送给对端设备10.26.0.20,然后因为对端设备开启了接受来自vnt设备的转发,因此从vnt发来的192.168.1.0/24的流量都会从vnt出去(out-ip)发往子设备
如果只是需要访问子设备的话设备客户端在in-ip填写192.168.1.0/24,10.26.0.20,在软路设置out-ip添加192.168.1.0/24
如果你想全部流量都走VNT,相当于VPN模式的话就在设备的in-ip填写0.0.0.0/0,10.26.0.20,对端设备的out-ip填写0.0.0.0/0,但是不一定会生效,很大可能是防火墙的配置问题
组网密码
组网密码填写一个加入局域网的密码,防止恶意连接,如果同一token密码不同也能开启服务,看到设备,但是不能互相通信
服务端加密
服务端加密可以选择开启,这样可以在走中转服务器的时候加密对服务器的流量
数据指纹校
数据指纹校验需要服务端开启该功能才可以(默认的服务器是支持的),这样可以防止中间人攻击,不过也会消耗小部分性能,不建议在性能较差的设备上开启
完成之后点击连接即可完成加入网络
2、Windows
windows的GUI界面和安卓是一样的,这里就不多介绍了,直接和安卓一样配置好后就可以直接ping了
3、Linux&MacOS
README.txt里面有介绍: vn-link-cli 功能和vnt-cli基本一致,但是不依赖tun、不改变本地路由、不需要管理员/root权限。这里直接使用vnt-cli就可以了
如果对于安卓的每一个设置都理解的话对应Unix使用命令行只要设置对应参数即可,这里发一下我的客户端设置
./vnt-cli -k 你的唯一token --ip 10.26.0.20 -d debian12 -i 192.168.1.0/24,10.26.0.11 -n debian12 -w 你的密码 -W --no-proxy
ShellScript也可以导入yaml的配置文件来启动,在文章开头的引用链接内有参数详解
#组网token
token: 你的唯一token
#当前设备id
device_id: openwrt
#当前设备名称
name: openwrt
#指定虚拟ip
ip: 10.26.0.11
#密码
password: 123456
#服务端加密
server_encrypt: true
#是否关闭内置代理,true为关闭
no_proxy: true
#代理ip出站
out_ips:
- 192.168.1.0/24
#代理ip进站
#in_ips:
# - 192.168.1.0/24,10.26.0.2
YAML最后一项out_ips: -192.168.1.0/24设置为允许外部流量访问子网,对应上面允许通过某设备访问特定子网-i 192.168.1.0/24,10.26.0.11,将文件保存为vnt_config.yaml,使用-f参数导入
./vnt-cli -f vnt_config.yaml
ShellScript这样设置完成后就可以做到互相访问了
4、openwrt
openwrt可以直接使用ipk安装,在这里感谢lmq8267!在Release页面下载相应系统版本的安装包,解压后会有3个.ipk,其中有一个是vnts,用来自建服务器用的,没特别需求全部安装上即可
先填好你的令牌、接口地址、设备ID、本地网段(out-ip)后保存,在点击右边的高级设置,服务器地址可以填写vnt作者自己的设置加密模式为aes_gcm并填写你的组网密码,完成之点击保存
并应用即可生效
5、openwrt命令行版本
如果ipk包出现一些问题的话可以试试手动配置vnt客户端
(1)、设置开机自启守护进程
将相应系统版本的vnt-cli移动到/usr/bin/vnt-cli
,接下来我们创建一个开启自启的守护程序/etc/init.d/vnt-cli
#!/bin/sh /etc/rc.common
START=99
STOP=15
USE_PROCD=1
start_service() {
procd_open_instance
procd_set_param command /usr/bin/vnt-cli -f /etc/config/vnt.yaml
procd_set_param respawn
procd_close_instance
}
stop_service() {
echo "Stopping vnt-cli"
/usr/bin/vnt-cli --stop
}
ShellScript别忘记赋予执行权限chmod +x /etc/init.d/vnt-cli
,使用/etc/init.d/vnt-cli start
开启服务,/etc/init.d/vnt-cli enable
设置为开机自启
/etc/config/vnt.yaml
下存放你的配置文件,可以参考上面的配置文件格式
使用vnt-cli --info
查看是否启动成功
(2)、设置防火墙转发规则
这一步是为了告诉防火墙允许转发数据到子网设备,如果不设置的话是无法直接访问子设备的,只能两个vnt设备之间通信而已
①创建vnt接口
在网络->接口->添加新接口来创建一个接口,名称叫vnt,协议改为静态地址,设备为tun0,在IPV4地址那栏填写openwrt自己的虚拟ip地址
接着在右边的防火墙设置创建一个vnt的防火墙区域
完成之后点击保持并应用
②设置防火墙转发规则
回到网络->防火墙下面的区域设置会多出来一个vnt的防火墙区域,然后点进去编辑一下,先勾选IP动态伪装,并且将涵盖的网络设置为vnt,允许转发到lan和wan区域,接受来自lan区域的转发
保存并应用就可以实现子网设备的访问了
三、服务端搭建
Github地址:https://github.com/vnt-dev/vnts丨本地下载
vnts默认监听29870和29872端口,其中29870是web管理后台端口(web后台默认账号密码为admin),请开放29872端口的tcp\udp访问,UDP对应默认隧道协议,
默认使用udp连接服务器,也可以使用tcp、ws或wss, 例如:-s tcp://服务器IP:端口
、-s ws://服务器地址
、-s wss://服务器地址
注意:vnts只支持udp、tcp和ws连接并不支持wss,如需要使用wss连接,则需要使用反向代理(如nginx)将wss转换为ws
特别的:如果使用家庭的动态IP(或动态端口)搭建的vnts,则可以用txt记录解析到指定的端口。例如有域名domain.com,动态地址是ip1:port1, 则可以添加域名domain.com的txt记录值为ip1:port1,然后vnt客户端使用-s txt:domain.com
(或-s tcp://txt:domain.com
)连接服务器,vnt会根据txt解析值连接对应的地址
—来自官网手册—
四、搭配frp实现家庭内网自建服务器
上面说了,vnts默认的中转端口是29872,并且解释需要开放tcp和udp协议,但是实测如果只开放一种协议也是可以使用的,只是只能使用对应协议的隧道了,默认是使用UDP隧道的,故frp开放UDP端口就可以了,也可以选择开放TCP端口,但是效率就没有TCP这么高了,如果运营商Qos比较严重的话可以试试用TCP端口,TCP端口需要添加tcp://前缀。也可以使用txt记录解析,详情请看官方手册
目前实测vnt的p2p打洞效率挺高的,只有在开始连接的前几秒打洞是走中转的,其它都是走p2p直连的,因此对frp的流量和速度要求并不高,网上免费的frp服务器提供商(如Sakura Frp、Starry Frp、openfrp等)已经够用了,如果只想走p2p的话可以在设置中修改一下
五、[进阶]在openwrt使用lucky+cloudflare和txt解析实现完美解析
本章内容比较困难,请务必熟悉lucky的webhook功能和cloudflare的页面规则
因为vnt是支持txt解析的,因此我们可以利用vnt的txt解析来直连vnts服务器。如果你是在openwrt上设置的vnt和vnts,那么可以搭配lucky+cloudflare和txt解析来实现完美的vnt解析,具体实现方法在下面👇这篇文章已经写的非常清楚了,只需参考一、二两大点就可以实现
如果有大家对于这点需求较高的话可以在下方留言,需求多的话我可以单独发一个视频来教大家实现
如果完成了txt解析的功能的话就可以继续往下看了
1、vnt客户端配置
其实都是大同小异的,就是可以在vnt-cli的高级设置里面vnts的的在可以改写成127.0.0.1:29872了
其他设备的话可以使用txt://你的域名
来直接解析直连的txt自建服务器
对于openwrt的vnts的话配置还是比较简单的