比zerotier和tailscale更好的内网穿透工具:vnt

工具官网: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)

二、配置客户端

点击右上角添加一个配置

配置名称随意

这个编号是用来判断不同设备是否在同一虚拟局域网的唯一标识token,要和别人的不一样

设备名称用来识别不同设备

虚拟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需要自行编译的服务端才可以开启

没特殊需求,默认不允许即可

这里比较复杂并且通过名字来理解容易搞反概念,我们先看看官网是怎么解释的

将指定网段的数据转发至特定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

将接收的指定网段(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密码不同也能开启服务,看到设备,但是不能互相通信

服务端加密可以选择开启,这样可以在走中转服务器的时候加密对服务器的流量

数据指纹校验需要服务端开启该功能才可以(默认的服务器是支持的),这样可以防止中间人攻击,不过也会消耗小部分性能,不建议在性能较差的设备上开启

完成之后点击连接即可完成加入网络

windows的GUI界面和安卓是一样的,这里就不多介绍了,直接和安卓一样配置好后就可以直接ping了

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

这样设置完成后就可以做到互相访问了

openwrt可以直接使用ipk安装,在这里感谢lmq8267!在Release页面下载相应系统版本的安装包,解压后会有3个.ipk,其中有一个是vnts,用来自建服务器用的,没特别需求全部安装上即可

先填好你的令牌、接口地址、设备ID、本地网段(out-ip)后保存,在点击右边的高级设置,服务器地址可以填写vnt作者自己的设置加密模式为aes_gcm并填写你的组网密码,完成之点击保存

并应用即可生效

如果ipk包出现一些问题的话可以试试手动配置vnt客户端

将相应系统版本的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查看是否启动成功

这一步是为了告诉防火墙允许转发数据到子网设备,如果不设置的话是无法直接访问子设备的,只能两个vnt设备之间通信而已

在网络->接口->添加新接口来创建一个接口,名称叫vnt,协议改为静态地址,设备为tun0,在IPV4地址那栏填写openwrt自己的虚拟ip地址

接着在右边的防火墙设置创建一个vnt的防火墙区域

完成之后点击保持并应用

回到网络->防火墙下面的区域设置会多出来一个vnt的防火墙区域,然后点进去编辑一下,先勾选IP动态伪装,并且将涵盖的网络设置为vnt,允许转发到lan和wan区域,接受来自lan区域的转发

保存并应用就可以实现子网设备的访问了

三、服务端搭建

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解析实现完美解析

因为vnt是支持txt解析的,因此我们可以利用vnt的txt解析来直连vnts服务器。如果你是在openwrt上设置的vnt和vnts,那么可以搭配lucky+cloudflare和txt解析来实现完美的vnt解析,具体实现方法在下面👇这篇文章已经写的非常清楚了,只需参考一、二两大点就可以实现

如果有大家对于这点需求较高的话可以在下方留言,需求多的话我可以单独发一个视频来教大家实现

如果完成了txt解析的功能的话就可以继续往下看了

其实都是大同小异的,就是可以在vnt-cli的高级设置里面vnts的的在可以改写成127.0.0.1:29872了

其他设备的话可以使用txt://你的域名来直接解析直连的txt自建服务器

对于openwrt的vnts的话配置还是比较简单的


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇