1 个不稳定版本
0.1.3 | 2022 年 5 月 16 日 |
---|---|
0.1.2 |
|
#8 in #rendezvous
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_REUSEADDR
和 SO_REUSEPORT
的行为,以及 代码 和 connected
UDP 套接字,所以它并不适用于所有平台。
在 Linux 上测试通过;udp::Client::listen()
在 Windows 上不工作..
用于项目
quic-tun 基于 QUIC 的端口转发
minivtun-rs 基于 UDP 的 VPN
rndz-go golang 实现 rndz
依赖项
~7–17MB
~215K SLoC