使用WireGuard组建虚拟局域网

什么是wireguard?

以下引用自 WireGuard 项目主页:

WireGuard 是一种极其简单但快速且现代的 VPN,它利用了最先进的加密技术。它的目标是比 IPsec 更快、更简单、更精简和更有用,同时避免令人头疼的问题。旨在提供比 OpenVPN 更高的性能。WireGuard 被设计为在嵌入式接口和超级计算机等上运行的通用 VPN,适用于许多不同的环境。最初仅支持 Linux 平台,现在可以进行跨平台(Windows、macOS、BSD、iOS、Android)的广泛部署。目前仍然在大力开发中,但已经被认为是业内最安全、最容易使用和最简单的 VPN 解决方案。

本文主要介绍如何使用WireGuard组建虚拟局域网,并结合自己的实践经验,给出笔者在使用wireguard中遇到的问题。

关键词:WireGuard

前言

有人可能会问,为什么不使用Frp或其他端口映射工具?需求之一是希望七层应用(包括DNS)都不需要特别的设置:而端口映射在应用层,每当有一个新的应用都要重新配置一遍。VPN虚拟出来的网络处于网络层,路由规则一次性配好后,就不需要再为了新的七层应用再配置一遍。

部署前提:需要一台可以被公网访问的电脑,不管是通过DMZ,还是一对一NAT的方式,或者是其他方式。

基础设置

Server端

为了方便,这里使用docker。

注:安装docker环境不在本文的讨论范围内。

安装Wireguard内核

1
sudo apt-get install wireguard-dkms -y

Docker开启IP地址转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# 应用 sysctl 参数而无需重新启动
sudo sysctl --system

拉取Wireguard镜像

1
docker pull lscr.io/linuxserver/wireguard:latest

设置Server端环境变量

1
2
3
4
5
6
7
# env
SERVERURL=1.2.3.4 # 任意client都可以直接访问的公网IP
SERVERPORT=51820 # Server向外暴露的端口
PEERS=5 # Peer 数目
PEERDNS=119.29.29.29 # Peer DNS
INTERNAL_SUBNET=192.168.7.0/24 # 虚拟局域网IP
ALLOWEDIPS=192.168.7.0/24 # 允许被访问的IP

设置docker-compose.yml

主要是server端容器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: "3.3"

services:
wireguard:
image: lscr.io/linuxserver/wireguard:latest
restart: always
env_file:
- ./env # 将上文的环境变量存为env
environment:
TZ: "Asia/Shanghai"
PUID: "1000" # 配置文件映射到宿主机的UID
PGID: "1000" # 配置文件映射到宿主机的PID
volumes:
- ./config:/config # 配置文件路径
- /lib/modules:/lib/modules
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
ports:
- 51820:51820/udp # 向外映射的端口,需要开启UDP支持

启动Server端

1
docker-compose up -d

Client端

从config目录下选择一个peerX,文件夹内的peerX.conf就是客户端的配置文件。

客户端使用wg命令行的方式进行安装。

1
2
sudo apt-get install wireguard-dkms -y  # 如果当前内核版本大于5.6则不用安装
sudo apt-get install wireguard-tools -y

将配置文件复制到/etc/wireguard文件夹,执行以下命令启动

1
wg-quick up peerX                      # peerX要和配置文件名的basename一致

如果在启动过程发现了如下问题:

1
/usr/bin/wg-quick: line 32: resolvconf: command not found

执行以下命令修复

1
sudo ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf

启动完毕以后检查执行情况

1
wg 

附加设置

1
PersistentKeepalive = 1

上面的设置是每隔1秒发送一个数据包,保持数据连接

进阶设置

Wireguard全互联架构

基于WireGuard协议的VPN工具

未完待续...