之前在 NAT穿透的问题 里描述了NAT穿透的问题,这篇文章则介绍 使用 wgcp 完成 WireGuard NAT穿透,点对点连接的过程。

假设一种场景,家里安装了NAS,有gitea、minio等诸多服务,但是宽带没有分配公网IP,如何做到随时直连? 通过 NAT穿透的问题 的描述,可知在外网仍然可以直接访问到内网的设备, 只是需要知道内网设备在NAT上的映射地址,或者说,有某种方式能够协助内网设备和外网设备建立一条能通过 NAT的通讯通道。 wgcp 就是这样一种协助工具。

wgcp 工作原理

wgcp 有客户端程序和服务端程序之分,客户端A向服务端发送获取另一客户端B端点信息的请求, 服务端返回该信息,客户端A和B建立直接连接。

所以服务端就像一个电子公告牌一样,有客户端来获取端点信息了,就告诉它。 而客户端之间建立连接时,必须是以WireGuard名义,发送和接收数据包,所以wgcp 使用加了 BPF filterraw socket 来完成这个过程。而这个过程的代码的实现,也只是复刻了 WireGuardnat-hole-punching C语言的实现而已。

配置

服务端配置如下:

listen_address: 127.0.0.1:5465
broker: 0.0.0.0:5466
token: xxx
  • listen_address 是监听地址,接收来自客户端的请求,websocket协议,所以可以使用任何支持 websocket 转发 的 CDN 网络,比如 cloudflare

  • broker 是建立连接的协调服务,UDP协议。

  • token 鉴权 token。

客户端配置如下:

server_address: ws://127.0.0.1:5465/
listen: false
token: xxx
keepalive: 100
network:
  -
    network: default
    interface: wg0
    id: 2
    peers:
      -
        id: 3
        persistent_keepalive: 25
  • server_address 服务端地址。
  • listen 监听模式,处于监听模式时,客户端会保持和服务端的连接,等待服务端的指令;否则和其它客户端建立连接后退出。
  • token 鉴权 token。
  • keepalive 发送心跳数据包的间隔时间
  • network中:
  • network 网络名称
  • interface wireguard 的 interface 名称
  • id 在此网络中的 id, 目前填写 public key
  • peers 对端节点,即需要建立连接的节点
  • persistent_keepalive WireGuard NAT 保活时间

使用

NAS 上配置好 WireGuard,并填好wgcp的配置,注意开启监听模式。 在某云服务器架设服务端。 然后在笔记本上配置好 WireGuard,使用wgcp即可完成连接。