vnt
(全称:Very Nice Tunneling AI编的,官网上没有找到这个说法)是一个轻量级、开源的内网穿透工具,支持 TCP/UDP/HTTP/HTTPS 等协议转发,使用 Go 语言编写,适合将本地服务(如 Web 应用、SSH、数据库等)暴露到公网访问。它类似于 frp
、ngrok
等工具,但配置更简单、资源占用更低。将异地组网变成一个简单的事,轻松应对自建内网服务、联机游戏、点对点&网对网等场景。
目前有三个开源地址:
官网地址:https://rustvnt.com/
一、vnt 特点
支持多种协议转发(TCP、UDP、HTTP/HTTPS)
支持AES-GCM、CHACHA20-POLY1305等多种加密算法,端到端加密保证数据安全
支持自定义域名、SNI 转发
跨平台:支持 Windows、Linux、macOS、Android
高性能: 使用rust开发,内存和CPU占用率低,速度快
和WireGuard互通: 能使用WireGuard接入VNT网络,iOS可以使用这种方式接入
ipv4/ipv6双协议栈: 可以使用ipv6连接网络
域名解析优化: 可以利用txt记录解析动态公网IP、动态公网端口,家庭宽带也能轻松自建服务器
优化广播: 自适应的点对点广播,降低延迟的同时减少服务器的压力,适合广播/组播游戏
二、典型使用场景
将家中 NAS、Web 应用映射到公网
内网服务器的 SSH 远程管理
公司内网开发环境共享
演示 Demo 项目,无需公网 IP
三、快速部署
找两台联网的电脑,如图(官网的)所示,两台主机处于不同的局域网中,正常情况下是不能互通的。可以通过vnt-cli命令,实现虚拟组网。
下载vnt客户端
在 https://github.com/vnt-dev/vnt/releases 找到并下载对应平台的程序(点击Show all查看全部平台)。解压出可执行文件 tar -xzvf xxx.tar.gz 使用其中的vnt-cli程序。
执行命令
命令格式: ./vnt-cli -k <组网编号> --cmd
注:组网编号随意写即可,如果后台运行则不需要--cmd
假设我们的组网编号是 hiya!
A主机:在命令行输入 sudo ./vnt-cli -k hiya! --cmd
输出如下内容:
B主机:在命令行输入
sudo ./vnt-cli -k hiya! --cmd
输出如下内容:
此时,两台电脑已经组成了一个局域网,网关是 10.26.0.1 ,可以相互ping通。
四、自建服务器
以上快速部署的实现方式,是因为vnt内置了一个远程服务器作中转,所以可以很方便的组网。但也有一个问题,如果组网编号不小心和其他人的重复了,就意味着和陌生人组成了一个局域网,在互联网世界里,这是非常危险的。最好的方式,就是自己有个公网地址。
下面假设你已经有了一台公网服务器。
官方提供了docker compose方式进行部署,非常方便。
编写docker-compose.yml
version: "3.8"
services:
vnts:
image: hotwa/vnt-server:latest
container_name: vnts
restart: unless-stopped
# 加入自定义网络并指定静态 IP
networks:
headscale_network:
ipv4_address: 172.24.0.13
ports:
- "29872:29872/tcp" # 数据通道 TCP
- "29872:29872/udp" # 数据通道 UDP
- "29870:29870/tcp" # Web 管理界面
volumes:
- ./vnts-data:/app/key # 用于存放服务端密钥对
- ./vnts-log:/app/log # 日志目录
environment:
# —————— 必填项 ——————
VNT_PORT: "29872" # 数据通道口
VNT_WEB_PORT: "29870" # Web 管理口
VNT_USERNAME: "hiya" # 管理界面用户名
VNT_PASSWORD: "hiya!!!" # 管理界面密码
VNT_WHITE_TOKEN: "hiya" # 连接 token 白名单
# ——— 可选项,根据需要取消注释 ———
VNT_FINGER: "1" # 开启指纹校验(短 flag `--finger`)
VNT_GATEWAY: "10.25.0.100" # 子网网关
VNT_NETMASK: "255.255.255.0" # 子网掩码
#VNT_WG_SECRET_KEY: "<Base64 编码的私钥>" # WireGuard 私钥
networks:
headscale_network:
driver: bridge
ipam:
config:
- subnet: 172.24.0.0/24
注:
1.服务器要提前安装好docker
2.服务器要开启29872的tcp、udp端口,以及29870的tcp端口,做为web管理界面的入口。
3.如果修改了VNT_PORT和VNT_WEB_PORT,同步修改服务器开放的端口。
运行vnts
运行 sudo docker compose up -d
启动服务。
只要能启动成功,说明服务端已经部署完成了。
客户端连接
在客户端上运行 sudo ./vnt-cli -s hiya.top:29872 -W --finger -k hiya
输出以下内容,就算成功了。
此时可以用客户端ping测服务端网关,是可以ping通的。说明已经可以组网了。
注:
1.其他客户端如法炮制即可。
2.安全起见,设置了组网白名单,hiya这个已经不通了。同学们有需要,可以私信我。
五、常用参数
从官网上摘取一些常用的客户端运行参数,正常来说,-k -w -W --finger这几个参数已经可以满足日常使用。
-k <token>
一个虚拟局域网的标识,在同一服务器下,相同token的设备会组建一个局域网。
-n <name>
设备名称,方便区分不同设备
-d <id>
设备id,每台设备的唯一标识,注意不要重复
-c
关闭控制台交互式命令,后台运行时可以加此参数
-s <server>
注册和中继服务器地址,注册和转发数据,以'TXT:'开头表示解析TXT记录,TXT记录内容必须是'host:port'形式的服务器地址。
-w <password>
提升通信安全性,使用该密码生成的密钥对客户端数据进行加密,并且服务端无法解密(包括中继数据)。使用相同密码的客户端才能通信
-W
开启和服务端通信的数据加密,采用rsa+aes256gcm加密客户端和服务端之间通信的数据,可以避免token泄漏、中间人攻击
注意:
-w
<password>
是用于客户端-客户端之间的加密,password不会传递到服务端,只添加这个参数不会加密客户端-服务端通信的数据-W 用于开启客户端-服务端之间的加密
-u <mtu>
设置虚拟网卡的mtu值,大多数情况下使用默认值效率会更高,也可根据实际情况微调这个值,不加密默认为1450,加密默认为1410
--ip <IP>
指定虚拟ip,指定的ip不能和其他设备重复,必须有效并且在服务端所属网段下,默认情况由服务端分配
--model <model>
加密模式,可选值 aes_gcm/aes_cbc/aes_ecb/sm4_cbc/chacha20_poly1305/chacha20/xor,默认使用aes_gcm,通常情况aes_gcm和chacha20_poly1305安全性高。 各种加密模式的安全性和速度都不相同,请按需选取
特别说明:xor只是对数据进行简单异或,仅仅避免了明文传输,安全性很差,同时对性能影响也极小;
--finger
开启数据指纹校验,可增加安全性,如果服务端开启指纹校验,则客户端也必须开启,开启会损耗一部分性能
注意:默认情况下服务端不会对中转的数据做校验,如果要对中转的数据做校验,则需要客户端、服务端都开启此参数
--cmd
开启交互式命令,开启后可以直接在窗口下输入命令,如需后台运行请勿开启
--list
在后台运行时,查看其他设备列表
--all
在后台运行时,查看其他设备完整信息
--info
在后台运行时,查看当前设备信息
--route
在后台运行时,查看数据转发路径
--stop
停止后台运行