vnt(全称:Very Nice Tunneling AI编的,官网上没有找到这个说法)是一个轻量级、开源的内网穿透工具,支持 TCP/UDP/HTTP/HTTPS 等协议转发,使用 Go 语言编写,适合将本地服务(如 Web 应用、SSH、数据库等)暴露到公网访问。它类似于 frpngrok 等工具,但配置更简单、资源占用更低。将异地组网变成一个简单的事,轻松应对自建内网服务、联机游戏、点对点&网对网等场景。

目前有三个开源地址:

官网地址: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>

提升通信安全性,使用该密码生成的密钥对客户端数据进行加密,并且服务端无法解密(包括中继数据)。使用相同密码的客户端才能通信

密码位数

加密算法

小于8

AES128-GCM

大于等于8

AES256-GCM

-W

开启和服务端通信的数据加密,采用rsa+aes256gcm加密客户端和服务端之间通信的数据,可以避免token泄漏、中间人攻击

注意:

  1. -w <password>是用于客户端-客户端之间的加密,password不会传递到服务端,只添加这个参数不会加密客户端-服务端通信的数据

  2. -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只是对数据进行简单异或,仅仅避免了明文传输,安全性很差,同时对性能影响也极小;

密码位数

model

加密算法

< 8

aes_gcm

AES128-GCM

>= 8

aes_gcm

AES256-GCM

< 8

aes_cbc

AES128-CBC

>= 8

aes_cbc

AES256-CBC

< 8

aes_ecb

AES128-ECB

>= 8

aes_ecb

AES256-ECB

> 0

sm4_cbc

SM4-CBC

> 0

chacha20_poly1305

ChaCha20-Poly1305

> 0

chacha20

ChaCha20

> 0

xor

简单异或混淆

--finger

开启数据指纹校验,可增加安全性,如果服务端开启指纹校验,则客户端也必须开启,开启会损耗一部分性能

注意:默认情况下服务端不会对中转的数据做校验,如果要对中转的数据做校验,则需要客户端、服务端都开启此参数

--cmd

开启交互式命令,开启后可以直接在窗口下输入命令,如需后台运行请勿开启

--list

在后台运行时,查看其他设备列表

--all

在后台运行时,查看其他设备完整信息

--info

在后台运行时,查看当前设备信息

--route

在后台运行时,查看数据转发路径

--stop

停止后台运行