我们通过公共网络访问互联网时,数据会经过我们无法控制的基础设施。任何位于我们和访问的网站之间的人都有可能拦截我们的流量;即使在家庭网络中,互联网服务提供商也能收集到我们浏览的每一个网站的信息。

VPN 通过在联网设备和用户信任的服务器之间创建一个加密隧道来解决这个问题。我们的上网流量不会直接发送到互联网,而是先通过这个安全隧道传输到 VPN 服务器,然后由 VPN 服务器转发到目标地址。因此,任何监视网络的人都只能看到发送到 VPN 服务器的加密数据,而看不到其他任何信息。而对于身处墙内的用户,外网 VPN 服务器当然也是科学上网的重要手段。

WireGuard 是一种现代 VPN 协议,它在各方面都表现出色。与需要数十万行代码的旧式 VPN 技术不同,WireGuard 仅需约 4,000 行代码即可完成相同的任务,这意味着更少的 bug、更高的性能和更便捷的安全审计。

但问题在于:虽然 WireGuard 本身很简单,但仅通过命令行管理多个 VPN 客户端、生成配置文件以及跟踪访问权限可能会变得非常繁琐,因此拥有一个 Web 界面就显得尤为重要。

在本教程中,我们将在 Debian 系统搭建一个完整的 WireGuard VPN 服务器,并提供一个友好的 Web 界面,让我们可以通过浏览器管理所有功能,例如添加新设备、为移动客户端生成二维码以及监控连接,而无需手动修改任何配置文件。

1] 安装 WireGuard 和环境准备

在开始安装之前 ,我们需要如下基本条件:

  • 一台具有公网 IP 的 Linux 主机(众多 VPS 厂商都可以选择,配置无需太高)
  • root 用户或具有 sudo 权限用户访问权限
  • 可以通过 ssh 连接至服务器

在开始安装配置之前,让我们先花点时间了解一下我们要构建的是什么。

WireGuard 设置由对等节点组成——这些设备可以通过加密隧道相互通信。

在我们的示例中,我们将有:

  • 服务器:一台拥有公网 IP 地址的 Linux 服务器,它作为中央枢纽,连接所有设备
  • 客户端:包括笔记本电脑、手机、平板电脑或任何其他需要保护的设备,每个客户端都拥有自己的加密密钥对和配置
  • Web 界面:一个轻量级的 Web 应用程序(我们将使用 WireGuard-UI),它运行在我们的服务器上,并提供一个控制面板来管理所有内容

当客户端想要连接时,它会与服务器建立直接加密隧道,然后服务器会根据其对应的配置方式,路由客户端的互联网流量,或者直接允许访问服务器本地网络上的资源。

安装 WireGuard 服务器

由于 WireGuard 服务器软件已经在 Debian 软件库中可用,所以可以直接使用如下命令进行安装:

# apt update && apt upgrade -y
# apt install wireguard -y

由于 WireGuard 协议已内置于 Linux 内核(适用于 5.6 及更高版本的内核),因此该命令主要安装配置和管理 WireGuard 接口所需的用户空间工具。

图.1 Debian 系统安装 WireGuard

允许 IP 转发

当我们的手机连接到 VPN 服务器并尝试访问某个网站时,服务器需要将该请求从 WireGuard 接口转发到其公共网络接口,然后再将响应转发回来。这就是 IP 转发,对于 VPN 服务器而言,我们需要此功能。

使用如下命令,让 IP 转发功能永久生效:

# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p

配置 WireGuard 的防火墙策略和路由

WireGuard VPN 服务器需要接受 WireGuard 使用的端口(默认为 UDP 端口 51820)上的传入连接。它还需要正确地在 VPN 接口和公共网络接口之间路由流量。

首先,让我们确定服务器的公共网络接口:

# ip route | grep default

图.2 确定 VPN 服务器的网络接口

示例使用的接口是”etho”,每个人接口名称可能会不尽相同,但是差别不大。

如果 Debian 系统启用了默认的 ufw 防火墙,则需要使用如下命令开启相应策略:

/* Allow SSH (default port 22) */
# ufw allow 22/tcp

/* Allow WireGuard */
# ufw allow 51820/udp

/* Allow the web interface (we'll use port 5000) */
# ufw allow 5000/tcp

接下来,我们需要添加一条 NAT(网络地址转换)规则,告诉服务器在将 VPN 流量转发到互联网时,将其伪装成来自服务器本身的流量。

编辑”/etc/ufw/before.rules”文件,在文件顶部,紧接头部注释之后、*filter 行之前,添加以下几行代码,并将 eth0 替换为您的实际接口名称:

# NAT table rules for WireGuard
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
COMMIT

配置的内容意味着:

  • *nat:我们正在使用 NAT 表
  • -s 10.0.0.0/24:用于来自我们 VPN 网络的包(10.0.0.0/24 是我们分配给 VPN 客户端的子网)
  • -o eth0:通过 eth0 接口出站
  • -j MASQUERADE:将源 IP 地址重写为服务器的公网 IP 地址

保存好配置后,使用如下命令重新启动防火墙:

# ufw enable
# ufw reload

2] 安装 WireGuard-UI

现在到了有趣的部分:安装 WireGuard-UI 设置 Web 界面。WireGuard-UI 是一个用 Go 语言编写的简洁易用的 Web 应用程序。

首先,创建一个用于存放 WireGuard-UI 的目录:

# mkdir -p /opt/wireguard-ui
# cd /opt/wireguard-ui

然后根据主机的 CPU 架构下载最新版的 WireGuard-UI 发行版文件(示例使用 AMD64架构):

# wget https://github.com/ngoduykhanh/wireguard-ui/releases/download/v0.6.2/wireguard-ui-v0.6.2-linux-amd64.tar.gz
# tar -zxvf wireguard-ui-v0.6.2-linux-amd64.tar.gz

解压后,就会有一个 wireguard-ui 可执行文件,如果文件不具备可执行权限,可以使用如下命令对其进行授权:

# chmod +x wireguard-ui

使用方便起见,我们创建一个wireguard-ui 服务,编辑”/lib/systemd/system/wireguard-ui.service”,内容如下:

[Unit]
Description=WireGuard UI
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/wireguard-ui
ExecStart=/opt/wireguard-ui/wireguard-ui
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

之后,就可以使用如下命令启动 wireguard-ui 服务了:

# systemctl daemon-reload
# systemctl enable wireguard-ui
# systemctl start wireguard-ui

使用如下命令查看一下服务状态:

systemctl status wireguard-ui

如果内容如下图所示,即表示 wireguard-ui 已经正常启动了:

图.3 查看 wireguard-ui 服务状态

通过浏览器访问”http://YOUR_SERVER_IP:5000″,就可以进入 wireguard-ui 的登录界面,使用默认的用户名”admin”和登录密码”admin”,就可以进入到 wireguard-ui 的管理页面:

图.4  Wireguard-UI 管理页面

安全起见,建议首次登录后立即点击”Administattor:admin”按钮更新管理员密码。

3] 配置 WireGuard 服务器

我们使用 Wireguard-ui 来配置 VPN 服务器。登录后,将进入 WireGuard-UI 控制面板。要开始配置服务器,则点击左侧边栏中的”WireGuard Server”菜单,并将接口名称设置为 10.0.0.1/24(WireGuard 默认接口),监听端口设置为 51820。

在”Post Up Script”输入框输入:

iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

在”Post Down Script”输入框输入:

iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

如果 eth0 与实际网络接口名称不同,请务必将其替换为实际的网络接口名称,并将地址设置为 10.0.0.1/24,这将是服务器的内部 VPN IP 地址。

单击”Save”再点击”Apply Config”后,WireGuard 将创建 wg0 接口,监听 51820 端口上的 VPN 连接,为我们的服务器分配 VPN IP 地址,并配置防火墙规则以正确转发 VPN 流量。

图.5 配置 WireGuard VPN 服务器

服务器配置完成后,点击”Wireguard Clients”,然后点击”New Client”,就会弹出客户端配置对话框,输入”Name”和”Email”内容,其他保持默认即可,点击”Submit”按钮就会生成一个客户端配置文件:

图.6 生成客户端配置文件

配置文件生成后,具有三个主要功能按钮,其中:

  • Download:点击后将客户端配置文件下载到本地,用于 WireGuard 桌面客户端使用
  • QR Code:点击后会生成一个二维码,用于 WireGuard 移动客户端扫描下载配置文件
  • Email:点击可以将配置文件邮件发送至之前设置的邮箱

配置好服务端和客户端,就可以正式使用 Wireguard VPN 服务了。

4] 使用客户端连接

现在需要将配置应用到我们的设备上,WireGuard-UI 通过二维码(适用于移动设备)和可下载的配置文件(适用于计算机)简化了这一过程。

对于移动设备(手机/平板电脑):

  • 从应用商店安装 WireGuard 应用(支持 iOS 和 Android 系统)
  • 在 WireGuard-UI 网页界面中,找到您新建的客户端,然后点击二维码图标
  • 在手机上打开 WireGuard 应用,点击”+”按钮,然后选择”从二维码创建”
  • 扫描浏览器中显示的二维码
  • 为创建的连接命名,然后点击”创建隧道”

完成!切换开关进行连接,移动设备会将所有流量路由到 VPN 服务器。

对于台式机/笔记本电脑:

  • 从 wireguard.com/install 安装 WireGuard
  • 在 WireGuard-UI 界面中,点击客户端旁边的下载图标以下载 .conf 文件
  • 在电脑上打开 WireGuard 应用程序,点击”从文件导入隧道”,然后选择下载的配置文件
  • 点击”激活”进行连接。

客户端连接成功后,就可以在 VPN 服务器查看连接状态了:

# wg show

示例显示如下:

interface: wg0
  public key: [your server's public key]
  private key: (hidden)
  listening port: 51820

peer: [client's public key]
  endpoint: [client's IP]:random_port
  allowed ips: 10.0.0.2/32
  latest handshake: 45 seconds ago
  transfer: 2.50 MiB received, 15.23 MiB sent

这显示了我们的客户端已连接、上次与服务器通信的时间以及已传输的数据量。

至此,我们成功部署了一台 WireGuard VPN 服务器,并配备了基于 Web 的管理界面。WireGuard-UI 提供了一个简洁的控制面板,方便我们添加新设备、生成二维码以及监控活动连接,而无需手动处理密钥、配置文件和路由规则。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注