diff --git a/Cargo.lock b/Cargo.lock index 08a4ae9..c8a796b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -212,6 +212,36 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + [[package]] name = "chrono" version = "0.4.38" @@ -234,6 +264,7 @@ checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", + "zeroize", ] [[package]] @@ -967,6 +998,17 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "polyval" version = "0.6.2" @@ -1324,6 +1366,16 @@ dependencies = [ "digest", ] +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -1612,6 +1664,9 @@ dependencies = [ "anyhow", "bytes", "cbc", + "cfg_aliases", + "chacha20", + "chacha20poly1305", "crossbeam-epoch", "crossbeam-queue", "crossbeam-utils", @@ -1658,6 +1713,7 @@ dependencies = [ "rand", "serde", "serde_yaml", + "signal-hook", "sudo", "uuid", "vnt", diff --git a/README.md b/README.md index 8a3e80a..f7ca20c 100644 --- a/README.md +++ b/README.md @@ -73,23 +73,24 @@ cargo build -p vnt-cli --no-default-features features说明 -| feature | 说明 | 是否默认 | -|------------------|----------------------|------| -| openssl | 使用openssl中的aes_ecb算法 | 否 | -| openssl-vendored | 从源码编译openssl | 否 | -| ring-cipher | 使用ring中的aes_gcm算法 | 否 | -| aes_cbc | 支持aes_cbc加密 | 是 | -| aes_ecb | 支持aes_ecb加密 | 是 | -| aes_gcm | 支持aes_gcm加密 | 是 | -| sm4_cbc | 支持sm4_cbc加密 | 是 | -| server_encrypt | 支持服务端加密 | 是 | -| ip_proxy | 内置ip代理 | 是 | -| port_mapping | 端口映射 | 是 | -| log | 日志 | 是 | -| command | list、route等命令 | 是 | -| file_config | yaml配置文件 | 是 | -| lz4 | lz4压缩 | 是 | -| zstd | zstd压缩 | 否 | +| feature | 说明 | 是否默认 | +|-------------------|--------------------------------|------| +| openssl | 使用openssl中的加密算法 | 否 | +| openssl-vendored | 从源码编译openssl | 否 | +| ring-cipher | 使用ring中的加密算法 | 否 | +| aes_cbc | 支持aes_cbc加密 | 是 | +| aes_ecb | 支持aes_ecb加密 | 是 | +| aes_gcm | 支持aes_gcm加密 | 是 | +| sm4_cbc | 支持sm4_cbc加密 | 是 | +| chacha20_poly1305 | 支持chacha20和chacha20_poly1305加密 | 是 | +| server_encrypt | 支持服务端加密 | 是 | +| ip_proxy | 内置ip代理 | 是 | +| port_mapping | 端口映射 | 是 | +| log | 日志 | 是 | +| command | list、route等命令 | 是 | +| file_config | yaml配置文件 | 是 | +| lz4 | lz4压缩 | 是 | +| zstd | zstd压缩 | 否 | ### ip转发/代理 diff --git a/vnt-cli/README.md b/vnt-cli/README.md index e9ca1be..34f9d55 100644 --- a/vnt-cli/README.md +++ b/vnt-cli/README.md @@ -1,33 +1,54 @@ ## 模块介绍 + 体积小,可以在服务器、路由器等环境使用 + ## 详细参数说明 + ### -k `` + 一个虚拟局域网的标识,在同一服务器下,相同token的设备会组建一个局域网 + ### -n `` + 设备名称,方便区分不同设备 + ### -d `` + 设备id,每台设备的唯一标识,注意不要重复 + ### -c + 关闭控制台交互式命令,后台运行时可以加此参数 + ### -s `` + 注册和中继服务器地址,注册和转发数据,以'TXT:'开头表示解析TXT记录,TXT记录内容必须是'host:port'形式的服务器地址 + ### -e `` + 使用stun服务探测客户端NAT类型,不同类型有不同的打洞策略 + ### -a + 加了此参数表示使用tap网卡,默认使用tun网卡,tun网卡效率更高 注意:仅在windows上支持使用tap,用于兼容低版本windows系统(低版本windows不支持wintun) + ### --nic `` + 指定虚拟网卡名称,默认tun模式使用vnt-tun,tap模式使用vnt-tap + ### -i ``、-o `` -配置点对网(IP代理)时使用,例如A(虚拟ip:10.26.0.2)通过B(虚拟ip:10.26.0.3,本地出口ip:192.168.0.10)访问C(目标网段192.168.0.0/24), +配置点对网(IP代理)时使用,例如A(虚拟ip:10.26.0.2)通过B(虚拟ip:10.26.0.3,本地出口ip:192.168.0.10)访问C( +目标网段192.168.0.0/24), 则在A配置 **'-i 192.168.0.0/24,10.26.0.3'** ,表示将192.168.0.0/24网段的数据都转发到10.26.0.3节点 在B配置 **'-o 192.168.0.0/24'** ,表示允许将数据转发到 192.168.0.0/24 ,允许转发所有网段可以使用 **'-o 0.0.0.0/0'** --i和-o参数均可使用多次,来指定不同网段,例如 **'-o 192.168.1.0/24 -o 192.168.2.0/24'** 表示允许转发目标为192.168.1.0/24或192.168.2.0/24这两个网段的数据 +-i和-o参数均可使用多次,来指定不同网段,例如 **'-o 192.168.1.0/24 -o 192.168.2.0/24'** +表示允许转发目标为192.168.1.0/24或192.168.2.0/24这两个网段的数据 ### -w `` @@ -39,9 +60,11 @@ | 大于等于8 | AES256-GCM | ### -W + 开启和服务端通信的数据加密,采用rsa+aes256gcm加密客户端和服务端之间通信的数据,可以避免token泄漏、中间人攻击 注意: + 1. -w ``是用于客户端-客户端之间的加密,password不会传递到服务端,只添加这个参数不会加密客户端-服务端通信的数据 2. -W 用于开启客户端-服务端之间的加密 @@ -49,54 +72,82 @@ 设置虚拟网卡的mtu值,大多数情况下使用默认值效率会更高,也可根据实际情况微调这个值,不加密默认为1450,加密默认为1410 -### --tcp +### --tcp + 和服务端使用tcp通信。有些网络提供商对UDP限制比较大,这个时候可以选择使用TCP模式,提高稳定性。一般来说udp延迟和消耗更低 + ### --ip `` + 指定虚拟ip,指定的ip不能和其他设备重复,必须有效并且在服务端所属网段下,默认情况由服务端分配 + ### --par `` + 任务并行度(必须为正整数),默认值为1,该值表示处理网卡读写的任务数,组网设备数较多、处理延迟较大时可适当调大此值 + ### --model `` -加密模式,可选值 aes_gcm/aes_cbc/aes_ecb/sm4_cbc,默认使用aes_gcm,通常情况aes_gcm安全性高、aes_ecb性能更好,但是在低性能设备上sm4_cbc也许速度会更快; +加密模式,可选值 +aes_gcm/aes_cbc/aes_ecb/sm4_cbc/chacha20_poly1305/chacha20/xor,默认使用aes_gcm,通常情况aes_gcm和chacha20_poly1305安全性高。 +各种加密模式的安全性和速度都不相同,请按需选取 + +特别说明:xor只是对数据进行简单异或,仅仅避免了明文传输,安全性很差,同时对性能影响也极小; -| 密码位数 | model | 加密算法 | -|-------|---------|------------| -| 1~8位 | aes_gcm | AES128-GCM | -| `>=`8 | aes_gcm | AES256-GCM | -| 1~8位 | aes_cbc | AES128-CBC | -| `>=`8 | aes_cbc | AES256-CBC | -| 1~8位 | aes_ecb | AES128-ECB | -| `>=`8 | aes_ecb | AES256-ECB | -| `>0` | sm4_cbc | SM4-CBC | -### --finger +| 密码位数 | model | 加密算法 | +|-------|-------------------|-------------------| +| 1~8位 | aes_gcm | AES128-GCM | +| `>=`8 | aes_gcm | AES256-GCM | +| 1~8位 | aes_cbc | AES128-CBC | +| `>=`8 | aes_cbc | AES256-CBC | +| 1~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 开启数据指纹校验,可增加安全性,如果服务端开启指纹校验,则客户端也必须开启,开启会损耗一部分性能 注意:默认情况下服务端不会对中转的数据做校验,如果要对中转的数据做校验,则需要客户端、服务端都开启此参数 + ### --punch `` + 取值ipv4/ipv6,选择只使用ipv4打洞或者只使用ipv6打洞,默认两者都会使用 + ### --ports `` + 指定本地监听的端口组,多个端口使用逗号分隔,多个端口可以分摊流量,增加并发、减缓流量限制,tcp会监听端口组的第一个端口,用于tcp直连 - 例1:‘--ports 12345,12346,12347’ 表示udp监听12345、12346、12347这三个端口,tcp监听12345端口 - 例2:‘--ports 0,0’ 表示udp监听两个未使用的端口,tcp监听一个未使用的端口 + ### --cmd + 开启交互式命令,开启后可以直接在窗口下输入命令,如需后台运行请勿开启 + ### --first_latency + 优先使用低延迟通道,默认情况下优先使用p2p通道,某些情况下可能p2p比客户端中继延迟更高,可使用此参数进行优化传输 + ### --no-proxy + 关闭内置的ip代理,内置的代理较为简单,而且一般来说直接使用网卡NAT转发性能会更高, 有需要可以自行配置NAT转发,[可参考‘编译’小节中的NAT配置](https://github.com/lbl8603/vnt#%E7%BC%96%E8%AF%91) + ### --dns `<223.5.5.5>` + 设置域名解析服务器地址,可以设置多个。如果使用TXT记录的域名,则dns默认使用223.5.5.5和114.114.114.114,端口省略值为53 当地址解析失败时,会依次尝试后面的dns,直到有A记录、AAAA记录(或TXT记录)的解析结果 ### --mapping `10.26.0.10:80>` + 端口映射,可以设置多个映射地址,例如 '--mapping udp:0.0.0.0:80->10.26.0.10:80 --mapping tcp:0.0.0.0:80->10.26.0.11:81' 表示将本地udp 80端口的数据转发到10.26.0.10:80,将本地tcp 80端口的数据转发到10.26.0.11:81,转发的目的地址可以使用域名+端口 ### --compressor `` + 启用压缩,默认仅支持lz4压缩,开启压缩后,如果数据包长度大于等于128,则会使用压缩,否则还是会按原数据发送 也支持开启zstd压缩,但是需要自行编译,编译时加入参数--features zstd @@ -104,8 +155,10 @@ 如果宽度速度比较慢,可以考虑使用高级别的压缩 ### -f `` + 指定配置文件 配置文件采用yaml格式,可参考: + ```yaml # 全部参数 tap: false #是否使用tap 仅在windows上支持使用tap @@ -113,7 +166,7 @@ token: xxx #组网token device_id: xxx #当前设备id name: windows 11 #当前设备名称 server_address: ip:port #注册和中继服务器 -stun_server: #stun服务器 +stun_server: #stun服务器 - stun1.l.google.com:19302 - stun2.l.google.com:19302 in_ips: #代理ip入站 @@ -130,7 +183,7 @@ parallel: 1 #任务并行度 cipher_model: aes_gcm #客户端加密算法 finger: false #关闭数据指纹 punch_model: ipv4 #打洞模式,表示只使用ipv4地址打洞,默认会同时使用v6和v4 -ports: +ports: - 0 #使用随机端口,tcp监听此端口 - 0 cmd: false #关闭控制台输入 @@ -149,25 +202,41 @@ mapping: ``` 或者需要哪个配置就加哪个,当然token是必须的 + ```yaml # 部分参数 token: xxx #组网token ``` + ### --use-channel `` + - relay:仅中继模式,会禁止打洞/p2p直连,只使用服务器转发 - p2p:仅直连模式,会禁止网络数据从服务器/客户端转发,只会使用服务器转发控制包 + ### --packet-loss `<0>` + 模拟丢包,取值0~1之间的小数,程序会按设定的概率主动丢包。在模拟弱网环境时会有帮助。 + ### --packet-delay `<0>` + 模拟延迟,整数,单位毫秒(ms),程序会按设定的值延迟发包,可用于模拟弱网 ### --list + 在后台运行时,查看其他设备列表 + ### --all + 在后台运行时,查看其他设备完整信息 + ### --info + 在后台运行时,查看当前设备信息 -### --route + +### --route + 在后台运行时,查看数据转发路径 + ### --stop + 停止后台运行 diff --git a/vnt-cli/src/config/file_config.rs b/vnt-cli/src/config/file_config.rs index 3e7c9e3..0fbe436 100644 --- a/vnt-cli/src/config/file_config.rs +++ b/vnt-cli/src/config/file_config.rs @@ -123,16 +123,6 @@ pub fn read_config(file_path: &str) -> anyhow::Result<(Config, bool)> { if file_conf.password.is_some() && file_conf.cipher_model.is_none() { Err(anyhow!("cipher_model undefined"))? } - #[cfg(not(any( - feature = "aes_gcm", - feature = "server_encrypt", - feature = "aes_cbc", - feature = "aes_ecb", - feature = "sm4_cbc" - )))] - { - CipherModel::None - } #[cfg(any(feature = "aes_gcm", feature = "server_encrypt"))] CipherModel::AesGcm };