在家里搭建了NAS、PT等服务后,在外面访问家里的资源成为一个迫在眉睫的需求,而 VPN 本来就是设计为实现这个需求的软件。经过痛苦的数小时 Cisco IPSec 配置并且部署失败后,最终选择了 WireGuard 作为 VPN 方案。
WireGuard 协议中所有节点均为对等节点 Peer,不存在服务端和客户端的概念。但是我们可以人为划分节点角色,不同角色使用不同的配置也可以实现C/S模式。
架构设计
家里已经有一个物理网络10.42.0.0/24
,网关为路由器10.42.0.1
,有几种可行方案:
- 路由器
10.42.0.1
提供了 OpenVPN 服务端,但其版本未知,存在极大安全风险。 - 单独搭建 VPN 服务端,配置 ARP 转发到路由器
10.42.0.1
,由路由器提供网关身份。Jimmy Xu 强烈不建议这么做,ARP 转发很麻烦。
最终采用以下方案:
单独搭建 VPN 服务端,使用独立的虚拟网络10.42.1.0/24
;路由器对 VPN 服务端口做端口转发,将 VPN 服务端暴露到互联网;VPN 服务端同时具备物理网络身份10.42.0.2
;VPN 服务端和路由器(物理网络网关)相互做静态路由。
graph LR client[WG Client
22.22.22.22
10.42.1.2] -. WireGuard .- server client -- WG UDP --- router subgraph HOME:10.42.0.0/24 router[Router
11.11.11.11
10.42.0.1] router -- WG UDP
Port Forward --- server[WG Server
10.42.0.2
10.42.1.1] router --- NAS[NAS
10.42.0.11] router --- Camera[Camera
10.42.0.12] end
(Update 2019-05-15) 由于购置了 OpenWRT 路由器,路由器10.42.0.1
可以提供 WireGuard VPN 服务了,所以改用架构更为简洁的第一种方案。
- 在路由器上搭建 VPN 服务端,使用独立的网络
10.42.1.0/24
; - 在路由器的 WAN 口放开互联网对 VPN 服务端口的访问;
- 路由器同时作为两个网络
10.42.0.0/24
和10.42.1.0/24
的网关。
graph LR client[WG Client
22.22.22.22
10.42.1.2] -. WireGuard .- router subgraph HOME:10.42.0.0/24 router[Router
11.11.11.11
10.42.0.1
10.42.1.1] router --- NAS[NAS
10.42.0.11] router --- Camera[Camera
10.42.0.12] end
- | VPN Server | VPN Client |
---|---|---|
External IP | 11.11.11.11 |
22.22.22.22 |
Internal IP | 10.42.1.1/24 |
10.42.1.2/24 |
WG Port | 12450 |
- |
基础环境
- Arch Linux: 5.0.7-1-ARCH
- WireGuard: 0.0.20190406
生成密钥
生成私钥
1 | $ wg genkey > prikey |
生成公钥
1 | $ wg pubkey < prikey > pubkey |
一行搞定
1 | $ wg genkey | tee prikey | wg pubkey | tee pubkey |
WireGuard 配置
服务端
1 | [Interface] |
客户端
1 | [Interface] |
网关配置
物理网关需要配置静态路由到 VPN网关;VPN 服务端为物理网络成员,无需配置路由。
1 | $ ip route add 10.42.1.0/24 via 10.42.0.2 |