方永、南天紫雲

道亦有道

WireGuard点对点连接
2022年06月05日

之前在 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

客户端配置如下:

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

使用

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