#rendezvous #nat #peer #hole #traversal #protocols #help

bin+lib rndz

一个简单的 rendezvous 协议实现,用于帮助 NAT 遍历或打洞。

1 个不稳定版本

0.1.3 2022 年 5 月 16 日
0.1.2 2022 年 5 月 16 日

#8 in #rendezvous

MIT 许可证

125KB
3K SLoC

rndz

一个简单的 rendezvous 协议实现,用于帮助 NAT 遍历或打洞。

其原理简单,即一个 rendezvous 服务器用于观察对等体的地址并转发连接请求。当观察到两个对等体互相发送数据包时,NAT 设备或防火墙规则将允许流量通过。

tcp 监听/连接

client1

use rndz::tcp::Client;

let c1 = Client::new(rndz_server_addr, "c1", None)?;
c1.listen()?;
while let Ok(stream) = c1.accept()?{
//...
}

client2

use rndz::tcp::Client;
let c2 = Client::new(rndz_server_addr, "c2", None)?;
let stream = c.connect("c1")?;

配对两个 udp 套接字

client1

use rndz::udp::Client;

let c1 = Client::new(rndz_server_addr, "c1", None)?;
c1.listen()?;
c1.as_socket().recv_from(...)?;

client2

use rndz::udp::Client;
let c2 = Client::new(rndz_server_addr, "c2", None)?;
c.connect("c1")?;
c.as_socket().send(b'hello')?;

测试

rndz 服务器

$ rndz server --listen-addr 0.0.0.0:8888    //if you want client communicate with ipv6, use [::]:8888

client1

$ rndz client --id c1 --server-addr rndz_server:8888 

client2

$ rndz client --id c2 --server-addr rndz_server:8888 --remote-peer c1

可移植性

因为它依赖于套接字选项 SO_REUSEADDRSO_REUSEPORT 的行为,以及 代码connected UDP 套接字,所以它并不适用于所有平台。

在 Linux 上测试通过;udp::Client::listen() 在 Windows 上不工作..

用于项目

quic-tun 基于 QUIC 的端口转发

minivtun-rs 基于 UDP 的 VPN

rndz-go golang 实现 rndz

依赖项

~7–17MB
~215K SLoC