lanthora / candy

A reliable, low-latency, and anti-censorship virtual private network

Home Page:https://docs.canets.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

支持对等连接

lanthora opened this issue · comments

支持对等连接,这里记录需要拆分的子功能模块.

基本流程:

  1. 客户端启动,完成登录
  2. 创建 UDP socket,向服务端请求自己在外网的地址和端口
  3. 把这个地址端口和公钥一起广播到网络. 向某个客户端发送 IPv4 数据时,从 STUN 服务获取本服务外网地址和端口,通过服务端转发用于建立对等连接的控制信息
  4. 对端收到建连控制信息后,通过服务端向这个客户端回复自己的地址和端口
  5. 此时双方都持有对方的对端信息,互相发送消息探测连接
  6. 连接成功后,固定频率发送心跳,此后发向这个地址的数据通过对等连接发送

连接需要非对称加密,客户端需要在网络中广播自己的公钥,需要添加广播机制.
客户端只处理服务端认证过的地址和端口,服务端认为所有持有正确口令的客户端都可信,所有数据通过简单的对称加密传输,对称加密的密钥由目的地址和口令生成,收到报文的一方就可以用同一个密钥解密所有客户端发来的数据.

客户端本身需要知道自己在公网的地址和端口. 服务端要提供出这样的能力,实现 UDP 服务.
STUN 协议可以做到这一点,并且有公开的服务端可以用,只需要实现客户端部分,就能拿到地址和端口号

新增配置项 stun = "stun://stun.cloudflare.com[:3478]".添加这个配置表示启用对等连接.RFC 7064 中定义了 stun 的 URI 格式,这个格式我不认为是 URI,同时项目中的 URI 解析器不支持这个格式,所以自定义格式.

推荐几个在国内可以使用的 stun 服务.

  • stun.qq.com
  • stun.chat.bilibili.com
  • stun.miwifi.com