进阶使用
一、数据加密
端到端数据加密
开启此加密,中继节点也无法解密数据(服务器中继节点可能不受信任)
- 指定密码,命令行版本使用
-w <password>
参数,界面版本是组网密码
- (可选)指定加密方式,命令行使用
--model <model>
参数,值可选aes_gcm、chacha20_poly1305等,界面版本是加密算法
,下拉选中后保存 - 如下图所示,请注意 所有客户端必须使用相同的密码和加密方式,才能正常组网互通
客户端到服务端数据加密
使用 -W
参数开启服务端加密,界面版本默认开启
客户端和服务器通过rsa非对称加密算法协商加密密钥,请留意服务端公钥指纹,确保加密过程安全。客户端和服务端会传递组网编号,如果加密过程遭到破坏则有可能导致组网编号泄露。当然如果开启了端到端加密,那即使组网编号泄露,虚拟网络也还是安全的。使用公共服务器是建议开启端到端加密的
二、数据压缩
命令行使用--compressor <lz4>
,界面版本下拉选择压缩
,数据压缩是自适应的,程序会根据压缩效果自动判断是否压缩数据
请注意 **命令行版本默认只有lz4压缩,没有zstd压缩,各版本混用时请选择对方支持的压缩算法,否则启用压缩可能会导致数据无法互通 **
三、指定虚拟IP
服务端会根据各设备id自动分配未使用的IP地址,不同设备的IP地址不能相同,如果要指定特定的IP,则可以添加参数--ip <ip>
,界面版本则输入虚拟IPv4
, 服务端会限制虚拟IP的网段,只能使用对应网段内未使用的IP
四、点对网
两个设备组网后,如果要访问对方设备内网下的其他设备(或者把对方的设备当跳板访问其他IP),就需要用到点对网的配置了
- 前提条件:两个局域网均有运行了vnt的设备(图中的A1和C1),并且跳板节点能访问对方的IP( 图中C1能访问C2,也就是说C2的防火墙对C1开放)
- 原理:图中的跳板节点是C1,A1通过C1访问C2,跳板节点也可以是局域网C的路由器
- 配置参数1:跳板节点设备C1增加参数
-o 0.0.0.0/0
,该参数表示允许转发所有目标的流量,这个参数是处于内网安全考虑的,也可以是-o 192.168.2.12/32
,表示只能转发到C2 - 配置参数2:设备A1增加参数
-i 192.168.2.0/24,10.26.0.3
,该参数表示拦截目标是192.168.2.0/24的流量,转发到10.26.0.3节点,也就是图中的跳板节点C1 - 配置上述参数后,即可在A1上使用C2的内网IP(192.168.2.12)直接访问C2,可以尝试在A1上ping 192.168.2.12,会发现能访问了( 如果C2开启ping)
再进阶,使用系统的IP转发,这会进一步提高点对网的性能,在低性能设备上这很有用,
在跳板节点上如下操作,增加参数`--no-proxy`,再执行如下命令
Windows:
#设置nat,名字可以自己取,网段是vnt的网段
New-NetNat -Name vntnat -InternalIPInterfaceAddressPrefix 10.26.0.0/24
#查看设置
Get-NetNat
Linux:
# 开启ip转发
sudo sysctl -w net.ipv4.ip_forward=1
# 开启nat转发 表示来源10.26.0.0/24的数据通过nat映射后再从vnt-tun以外的其他网卡发出去
sudo iptables -t nat -A POSTROUTING ! -o vnt-tun -s 10.26.0.0/24 -j MASQUERADE
# 或者这样 表示来源10.26.0.0/24的数据通过nat映射后再从eth0网卡发出去
sudo iptables -t nat -A POSTROUTING -o eth0 -s 10.26.0.0/24 -j MASQUERADE
# 查看设置
iptables -vnL -t nat
MacOS:
# 开启ip转发
sudo sysctl -w net.ipv4.ip_forward=1
# 配置NAT转发规则
# 在/etc/pf.conf文件中添加以下规则,en0是出口网卡,10.26.0.0/24是来源网段
nat on en0 from 10.26.0.0/24 to any -> (en0)
# 加载规则
sudo pfctl -f /etc/pf.conf -e
五、网对网
在上一节,局域网A中的设备A2(未运行vnt)能不能直接访问局域网C中的设备C2(未运行vnt)?,这其实已经脱离了VNT的范畴,接下来实现这一目标
为了简化流程,我们把vnt运行到双方局域网的默认网关路由器中(不在路由器中也可以,无非就是再加路由,这里对此不作讨论)
拓扑图如下
- 路由器配置点对网:路由器A增加参数
-i 192.168.2.0/24,10.26.0.3
,路由器C增加参数-o 0.0.0.0/0
,该参数表示将192.168.2.0/24目标的转发到10.26.0.3,也就是路由器C - 根据点对网那一节可知,这样配置就能让路由器A能访问路由器C下的所有内网IP,当然我们的目标是让局域网A下的所有设备都能访问到局域网C下的设备
- 原理:由于局域网A的默认网关是路由器A,也就是说在设备A1访问C2的内网IP(192.168.2.12),数据会发到路由器A的网卡( 假设是eth0),而路由器A是能访问C2的,所以再添加转发规则,将数据转发到vnt网卡,即可连通整个链路
- 命令操作 :在路由器A上执行
sudo iptables -t nat -A POSTROUTING -o vnt的虚拟网卡(一般为vnt-tun) -s 192.168.1.0/24 -j MASQUERADE
该参数表示将数据发送到vnt - 配置完之后,你会发现设备A1能通过路由器A、路由器C访问到设备C2了,如果要C2访问A1或者A2,则再反过来进行上述配置,就能双方互通了
六、端口映射
使用参数--mapping <mapping>
就可以建立一个本地端口到目标端口的映射,用iptables端口转发也能实现相同的作用,这其实和组网无关,增加这个功能是为了简化映射过程( 启动vnt就开启映射,关闭vnt就结束映射,用iptables就麻烦些了)。比如在公网服务器和内网设备运行vnt,可以直接通过公网IP的某个端口访问内网服务
- tcp端口映射:
--mapping tcp:0.0.0.0:80-domain:80
,访问本地80端口,即可转发到目标80端口 - udp端口映射:
--mapping udp:0.0.0.0:80-domain:80
,访问本地80端口,即可转发到目标80端口
七、自定义端口
使用参数--ports <port1,port2>
来指定监听的端口,其中UDP监听port1、port2端口,TCP监听port1端口,比如
--ports 0,0
表示随机监听两个UDP端口,随机监听一个TCP端口--ports 11000,11001,11001
表示UDP监听11000,11001,11001,TCP监听11000
自定义端口有如下作用
- 可以放行指定的端口,从而提高打洞成功率
- 放行TCP端口则可以进行TCP-P2P通信
- 一个端口对应一个UDP Socket通道,适量增加UDP通道有利于提升网络稳定性(默认两个通道)
八、流量统计
命令行使用chart_a
和chart_b[:ip]
查看统计,可以使用启动参数--disable-stats
关闭统计,在低性能设备上统计流量会有比较明显的性能损失,可以自行选择是否关闭。
chart_a
是流量总计,chart_b[:ip]
是指定IP的历史流量趋势图
九、模拟弱网环境
--packet-delay
:控制延迟,比如原本ping是10ms延迟的,加了--packet-delay 10
之后会变成20ms--packet-loss
:控制丢包率,比如原本ping不丢包的,加了--packet-loss 0.5
之后就会有50%概率丢包
十、多开组网
vnt支持同时组多个局域网,但请注意多开时要使用不同的网段、不同的网卡名称,命令行多开时要将vnt复制到不同的文件进行启动