之前在 NAT穿透的问题 里描述了NAT穿透的问题,这篇文章则介绍 使用 wgcp 完成 WireGuard NAT穿透,点对点连接的过程。
假设一种场景,家里安装了NAS,有gitea、minio等诸多服务,但是宽带没有分配公网IP,如何做到随时直连?
通过 NAT穿透的问题 的描述,可知在外网仍然可以直接访问到内网的设备,
只是需要知道内网设备在NAT上的映射地址,或者说,有某种方式能够协助内网设备和外网设备建立一条能通过
NAT的通讯通道。
wgcp
就是这样一种协助工具。
wgcp
工作原理
wgcp
有客户端程序和服务端程序之分,客户端A向服务端发送获取另一客户端B端点信息的请求,
服务端返回该信息,客户端A和B建立直接连接。
所以服务端就像一个电子公告牌一样,有客户端来获取端点信息了,就告诉它。
而客户端之间建立连接时,必须是以WireGuard
名义,发送和接收数据包,所以wgcp
使用加了 BPF filter
的
raw socket
来完成这个过程。而这个过程的代码的实现,也只是复刻了 WireGuard
的 nat-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
即可完成连接。