VNT介绍

将异地组网变成一个简单的事,轻松应对自建内网服务、联机游戏、点对点&网对网等场景

特点

  • 高性能: 使用rust开发,内存和CPU占用率低,速度快
  • 跨平台: 支持Windows/MacOS/Linux/Android
  • 和WireGuard互通: 能使用WireGuard接入VNT网络,iOS可以使用这种方式接入
  • 穿透多层NAT: 多种打洞策略,轻松穿透锥形网络,遇到对称网络也有一战之力
  • 应对运营商QOS: 多通道UDP,能有效减缓UDP QOS
  • 支持UDP/TCP/WebSocket等协议: 遭遇UDP丢包严重的时候,总有一个协议适合你
  • ipv4/ipv6双协议栈: 可以使用ipv6连接网络
  • 域名解析优化: 可以利用txt记录解析动态公网IP、动态公网端口,家庭宽带也能轻松自建服务器
  • 安全: 支持AES-GCM、CHACHA20-POLY1305等多种加密算法,端到端加密保证数据安全
  • 优化广播: 自适应的点对点广播,降低延迟的同时减少服务器的压力,适合广播/组播游戏
  • 数据压缩: 可开启数据压缩减少网络压力

开源地址

组网场景

vnt组网.drawio

现状:

  • 局域网A与局域网B是物理相互独立的两个局域网。
  • 设备B、C、D都是局域网B中的设备没有公网IPV4和IPV6。

目标:

  • 设备A可以访问局域网B中的任意一台机器。

客户机配置

1.下载二进制文件

  • 下载vnt 二进制文件

下载地址:https://github.com/vnt-dev/vnt/releases

我的客户机是Windows系统,x86 架构,所以我下载vnt-x86_64-pc-windows-msvc-v1.2.16.tar.gz

  • 下载NSSM 服务注册Windows 系统服务,解压后找到对应系统的文件。

http://nssm.cc/download

2.创建配置文件

config.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
tap: false #是否使用tap 仅在windows上支持使用tap
token: xxx #组网token
device_id: Windows #当前设备id
name: Windows22 #当前设备名称
server_address: vnt.wherewego.top:29872 #注册和中继服务器
in_ips: #代理ip入站
- 10.20.40.0/23,10.26.0.21
#password: xxxx #密码
mtu: 1420 #mtu
tcp: false #tcp模式
ip: 10.26.0.22 #指定虚拟ip
use_channel: p2p #relay:仅中继模式.p2p:仅直连模式
server_encrypt: true #服务端加密
parallel: 1 #任务并行度
cipher_model: aes_gcm #客户端加密算法
finger: false #关闭数据指纹
punch_model: ipv4 #打洞模式,表示只使用ipv4地址打洞,默认会同时使用v6和v4
ports:
- 0 #使用随机端口,tcp监听此端口
- 0
cmd: false #关闭控制台输入
no_proxy: true #是否关闭内置代理,true为关闭
first_latency: false #是否优先低延迟通道,默认为false,表示优先使用p2p通道
device_name: vnt-tun #网卡名称
packet_loss: 0 #指定丢包率 取值0~1之间的数 用于模拟弱网
packet_delay: 0 #指定延迟 单位毫秒 用于模拟弱网
dns:
- 223.5.5.5 # 首选dns
- 8.8.8.8 # 备选dns
disable_stats: false # 为true表示关闭统计
allow_wire_guard: false # 为true则表示允许接入wg

参考文档:vnt/vnt-cli/README.md at main · vnt-dev/vnt

中继服务器我使用的是社区公益服务器。

可使用社区服务器

3.注册为系统服务

我的安装路径在D:\Program\vnt,所有配置都存放此目录。

1
2
3
4
5
6
7
8
9
10
11
# 安装服务
nssm install vnt "D:\Program\vnt\vnt-cli.exe" "-f config.yaml"

# 设置工作目录
nssm set vnt AppDirectory "D:\Program\vnt"

# 设置启动类型(自动-延时启动)
nssm set vnt Start SERVICE_DELAYED_AUTO_START

# 启动服务
nssm start vnt

必须以超级管理员身份运行CMD,执行上述命令。

  • 卸载服务
1
2
nssm stop vnt
nssm remove vnt confirm

4.检查连接状态

1
D:\Program\vnt>vnt-cli.exe --info

期望输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Name: Windows22
Virtual ip: 10.26.0.22
Virtual gateway: 10.26.0.1
Virtual netmask: 255.255.255.0
Connection status: Connected
NAT type: Symmetric
Relay server: 8.134.146.7:29872
Udp listen: 0.0.0.0:xxxx, 0.0.0.0:xxxx
Tcp listen: 0.0.0.0:xxxx
Public ips: xx.xx.xx.xx
Local addr: xx.xx.xx.xx
IPv6: None
------------------------------------------
IP forwarding 1
-- 10.26.0.21 --> 10.20.40.0/23

代理机配置

1.下载二进制文件

下载地址:https://github.com/vnt-dev/vnt/releases

我的代理机是Ubuntu 系统,x86 架构,所以我下载vnt-x86_64-unknown-linux-musl-v1.2.16.tar.gz

或者使用wget命令下载

1
wget https://github.com/vnt-dev/vnt/releases/download/v1.2.16/vnt-x86_64-unknown-linux-musl-v1.2.16.tar.gz

2.解压二进制

创建应用程序目录

1
mkdir /opt/vnt

解压文件

1
tar -zxvf vnt-x86_64-unknown-linux-musl-v1.2.16.tar.gz  -C /opt/vnt/

3.创建配置文件

1
vim  /opt/vnt/config.yaml

配置内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
tap: false #是否使用tap 仅在windows上支持使用tap
token: xxx #组网token
device_id: ubuntu #当前设备id
name: Ubuntu 21 #当前设备名称
server_address: vnt.wherewego.top:29872 #注册和中继服务器
out_ips: #代理ip出站
- 0.0.0.0/0
#password: xxxx #密码
mtu: 1420 #mtu
tcp: false #tcp模式
ip: 10.26.0.21 #指定虚拟ip
use_channel: p2p #relay:仅中继模式.p2p:仅直连模式
server_encrypt: true #服务端加密
parallel: 1 #任务并行度
cipher_model: aes_gcm #客户端加密算法
finger: false #关闭数据指纹
punch_model: ipv4 #打洞模式,表示只使用ipv4地址打洞,默认会同时使用v6和v4
ports:
- 0 #使用随机端口,tcp监听此端口
- 0
cmd: false #关闭控制台输入
no_proxy: true #是否关闭内置代理,true为关闭
first_latency: false #是否优先低延迟通道,默认为false,表示优先使用p2p通道
device_name: vnt-tun #网卡名称
packet_loss: 0 #指定丢包率 取值0~1之间的数 用于模拟弱网
packet_delay: 0 #指定延迟 单位毫秒 用于模拟弱网
dns:
- 223.5.5.5 # 首选dns
- 8.8.8.8 # 备选dns
disable_stats: false # 为true表示关闭统计
allow_wire_guard: false # 为true则表示允许接入wg

参考文档:vnt/vnt-cli/README.md at main · vnt-dev/vnt

中继服务器我使用的是社区公益服务器。

可使用社区服务器

开启IP转发

1
sudo nano /etc/sysctl.conf

取消注释或添加:

1
net.ipv4.ip_forward=1

4.创建服务文件

1
vim /etc/systemd/system/vnt.service

配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[Unit]
Description = vntserver
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
User=root
ExecStart = /opt/vnt/vnt-cli -f /opt/vnt/config.yaml

ExecStartPost = /sbin/iptables -I INPUT -i vnt-tun -j ACCEPT
ExecStartPost = /sbin/iptables -I FORWARD -i vnt-tun -o vnt-tun -j ACCEPT
ExecStartPost = /sbin/iptables -I FORWARD -i vnt-tun -j ACCEPT
ExecStartPost = /sbin/iptables -t nat -I POSTROUTING -j MASQUERADE

ExecStopPost = /sbin/iptables -D INPUT -i vnt-tun -j ACCEPT
ExecStopPost = /sbin/iptables -D FORWARD -i vnt-tun -o vnt-tun -j ACCEPT
ExecStopPost = /sbin/iptables -D FORWARD -i vnt-tun -j ACCEPT
ExecStopPost = /sbin/iptables -t nat -D POSTROUTING -j MASQUERADE

Restart = on-failure
RestartSec = 5s

[Install]
WantedBy = multi-user.target

5.启动服务

1
2
3
4
5
systemctl daemon-reload

systemctl enable vnt.service

systemctl start vnt.service

6.检查连接状态

1
cd /opt/vnt/ && ./vnt-cli --info

期望输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Name: Ubuntu 21
Virtual ip: 10.26.0.21
Virtual gateway: 10.26.0.1
Virtual netmask: 255.255.255.0
Connection status: Connected
NAT type: Cone
Relay server: 198.18.0.104:29872
Udp listen: 0.0.0.0:xxxx, 0.0.0.0:xxxx
Tcp listen: 0.0.0.0:xxxx
Public ips: xx.xx.xx.xx
Local addr: xx.xx.xx.xx
IPv6: None
------------------------------------------
Allows network 1
0.0.0.0/0

检查上线的节点

1
D:\Program\vnt>vnt-cli.exe --list
1
2
3
D:\Program\vnt>vnt-cli --list
Name Virtual Ip Status P2P/Relay Rt
Ubuntu 21 10.26.0.21 Online p2p 21

联调网络

1
2
3
4
5
6
7
8
9
10
11
12
D:\Program\vnt>ping 10.20.40.3

正在 Ping 10.20.40.3 具有 32 字节的数据:
来自 10.20.40.3 的回复: 字节=32 时间=22ms TTL=254
来自 10.20.40.3 的回复: 字节=32 时间=20ms TTL=254
来自 10.20.40.3 的回复: 字节=32 时间=20ms TTL=254
来自 10.20.40.3 的回复: 字节=32 时间=20ms TTL=254

10.20.40.3 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 20ms,最长 = 22ms,平均 = 20ms
1
2
3
4
5
6
7
8
9
10
11
12
D:\Program\vnt>ping 10.20.41.21

正在 Ping 10.20.41.21 具有 32 字节的数据:
来自 10.20.41.21 的回复: 字节=32 时间=15ms TTL=64
来自 10.20.41.21 的回复: 字节=32 时间=15ms TTL=64
来自 10.20.41.21 的回复: 字节=32 时间=19ms TTL=64
来自 10.20.41.21 的回复: 字节=32 时间=16ms TTL=64

10.20.41.21 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 15ms,最长 = 19ms,平均 = 16ms