0%

Wireguard 配置部署及技术讲解

wiregurad目前已经正式合入linux kernal, 日后的应用范围也一定会越来越广, 本文将会介绍如何使用wireguard创建自己的虚拟局域网, 并完成网关设置

Wireguard 安装

对于Ubuntu ≥ 19.10以上的用户, 直接安装即可

1
$ sudo apt install wireguard

对于19.04及以下用户

1
2
3
$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get update
$ sudo apt-get install wireguard

Wireguard 组网设置

早期的教程中经常使用名为 wg-quick 的命令, 我个人非常不建议使用该工具, 而且官网也移除了关于此命令的相关描述, 因此接下来的操作都讲直接使用 wgip 命令完成。

wireguard必须在要组网的所有设备上都进行以下操作

添加网卡

首先我们需要添加一块网卡, 并将其命名为 wg0

1
$ sudo ip link add dev wg0 type wireguard

设置ip

添加网卡后为这张网卡配置ip, wireguard无法使用dhcp等功能,我们必须手动为其配置ip, 并且每个设备的ip都不能重复。

注意此处的子网掩码。这里指定的掩码将会在之后被用于设置ip route, 通常wg会自动设置, 但我们也可以手动设置, 这在之后会进行讲解。

因为我需要让所有设备都连接到一台公网设备, 所以我给我的公网设备分配了192.168.100.1的ip。其他设备依次使用192.168.100.(2/3/4)

1
$ sudo ip address add dev wg0 192.168.100.1/24

生成连接密钥

密钥是wg连中最为重要的一环。在两个节点之间, 数据的的接受和发送都需要单独的密钥对。

以A, B两设备为例。A需要持有A的私钥和B的公钥。B需要持有B的私钥和A的公钥。 B向A发送数据需要使用A的公钥。A接受B的数据需要使用A的私钥。

因此两个节点互联共需要2对共4个密钥。注意三个节点互联需要3对共6个密钥而不是4对共8个。因为节点的公钥可以给多个其他节点使用,不需要生成新的密钥对。

生成一对密钥

生成私钥

1
2
$ wg genkey
6EQR4ABmq4otoOhSYVCJP4BBWKgLzIlTJ4QSPQZAR3s=

生成公钥

生成公钥需要使用之前的私钥

1
2
$ echo 6EQR4ABmq4otoOhSYVCJP4BBWKgLzIlTJ4QSPQZAR3s= | wg pubkey
eCffMZ/2nN8nPDPap5lW4K4gDRw+UANqIQIvBebvTS4=

编写配置文件

以下以一个公网设备A和一个私网(家宽)设备B为例

有公网ip的设备 A

对于有公网ip的设备, 我们不需要指定 peer 的地址(因为存在NAT指定了也没用), 我们只需要配置私钥和连接端口即可。

1
2
3
4
5
6
7
8
9
10
11
# file: A.conf
[Interface]
# Interface on A
PrivateKey = <A的私钥>
ListenPort = 10240

[Peer]
# A to B
PublicKey = <B的公钥>
AllowedIPs = 192.168.100.2/32
PersistentKeepalive = 10

无公网ip设备 B

对于有无公网ip的设备, 需要使用Endpoint指定 peer A 的地址, 这样才能在 A, B 之间建立起链接。

1
2
3
4
5
6
7
8
9
10
11
12
# file: B.conf
[Interface]
# Interface on B
PrivateKey = <B的私钥>
ListenPort = 51820

[Peer]
# B to A
PublicKey = <A的公钥>
Endpoint = <A的公网ip:10240>
AllowedIPs = 192.168.100.0/24
PersistentKeepalive = 10

AllowedIPs

需要注意两份配置的 AllowedIPs 不同, 对于A来说, peer B 的地址必须为192.168.100.2/32, 而对于B来说, 局域网中的所有 peer 都需要通过A来访问, 所以 AllowedIPs 被设置为 192.168.100.0/24

AllowedIPs类似于一个白名单机制, 只有目的地址在AllowedIPs中的包才允许发往该 peer。

应用配置文件

1
$ sudo wg setconf wg0 xxxx.conf

启用网卡

1
$ sudo ip link set up dev wg0

添加路由

创建网卡之后, 我们还需要设置路由, 告诉系统使用wg0网卡处理发往192.168.100.0/24地址的数据。

1
$ sudo ip route add 192.168.100.0/24 dev wg0

或者使用完整写法

1
2
$ sudo ip route add 192.168.100.0/24 dev wg0 proto kernel scope link src 192.168.100.x
# 192.168.100.x 指本机ip

如果设置的时候提示 RTNETLINK answers: File exists 则表示wg已经自动设置过路由。可以使用以下命令查看

1
2
3
$ sudo ip route 
default via 192.168.1.1 dev enp6s0 proto dhcp src 192.168.1.4 metric 100
192.168.100.0/24 dev wg0 proto kernel scope link src 192.168.100.2

查看连接状态

1
2
3
4
5
6
7
8
9
10
11
12
$ sudo wg
interface: wg0
public key: SaarEV3HLvcAaaLhorieaaalNMhCaaaxqVmIpmKwjWY=
private key: (hidden)
listening port: 10240

peer: taaSMAMx4fMaaXfd1g4Z/c+AaapQRapYnStJ/wVFNjk=
endpoint: 111.20.8.222:51820
allowed ips: 192.168.100.2/32
latest handshake: 1 minute, 48 seconds ago
transfer: 256.64 KiB received, 200.38 KiB sent
persistent keepalive: every 10 seconds

网关设置

请查看iptables forward 及 nat 相关讲解