如何在 Ubuntu 18.04 上设置 WireGuard VPN

WireGuard 是具有最新加密技术的现代 VPN(虚拟专用网)技术。与 IPsec 和 OpenVPN 等其他类似解决方案相比,WireGuard 更快,更易于配置且性能更高。它是一个跨平台,几乎可以在任何地方运行,包括 Linux,Windows,Android 和 macOS。Wireguard 是对等 VPN。它不使用客户端-服务器模型。

WireGuard 通过在充当隧道的每个对等设备上创建网络接口来工作。对等体通过交换和验证公共密钥(类似于 SSH 模型)来相互认证。公钥与隧道中允许的 IP 地址列表进行映射。 VPN 流量封装在 UDP 中。

在本教程中,我们将在充当 VPN 服务器的 Ubuntu 18.04 计算机上设置 WireGuard。我们还将向您展示如何将 WireGuard 配置为客户端。客户端的流量将通过 Ubuntu 18.04 服务器进行路由。

此设置可用于防御中间人攻击,匿名浏览网络,绕过受地域限制的内容,或允许您的同事在远程工作时安全地连接到公司网络。

先决条件

您需要一台 Ubuntu 18.04 服务器,您可以以 root 用户或具有 sudo 特权的帐户访问。

设置 WireGuard 服务器

在本节中,我们将在 Ubuntu 机器上安装 WireGuard 并将其设置用作服务器。我们还将配置该系统以通过它路由客户的流量。

在 Ubuntu 18.04 上安装 WireGuard

WireGuard 维护自己的 APT 仓库,我们将从该仓库中安装软件包,并在有新版本可用时对其进行更新。

更新软件包列表,并安装管理系统存储库所需的工具。您的机器上可能已经装有该软件包:

1
2
sudo apt update
sudo apt install software-properties-common

添加 WireGuard 仓库:

1
sudo add-apt-repository ppa:wireguard/wireguard

出现提示时,按 Enter 键继续。add-apt-repository 也将自动更新软件包列表。

安装 WireGuard 软件包:

1
sudo apt install wireguard

WireGuard 作为内核模块运行,该模块被编译为 DKMS 模块。成功完成后,您将看到以下输出:

1
2
3
4
5
6
7
8
9
10
wireguard:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/4.15.0-88-generic/updates/dkms/

depmod...

DKMS: install completed.

更新内核时,将针对新内核编译 WireGuard 模块。

配置 WireGuard

WireGuard 附带了两个名为 wgwg-quick 的命令行工具,可用于配置和管理 WireGuard 接口。

运行以下命令以生成公钥和私钥:

1
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

这些文件将在 /etc/wireguard 目录中生成。您可以使用 cat 或更少的字体查看文件。私钥绝对不能与任何人共享。

生成密钥后,我们需要配置将路由 VPN 流量的隧道设备。

可以使用 ipwg 从命令行设置设备,也可以使用文本编辑器创建配置文件。

创建一个名为 wg0.conf 的新文件,并添加以下内容:

1
sudo nano /etc/wireguard/wg0.conf
1
2
3
4
5
6
7
[Interface]
Address = 10.0.0.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE

该接口可以命名为任何名称,但是建议使用诸如包含 wg0wgvpn0 之类的名称。界面部分中的设置具有以下含义:

  • 地址 - wg0接口的以逗号分隔的 v4 或 v6 IP地址列表。使用专用于专用网络的范围内的 IP(10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16)。
  • ListenPort - WireGuard 接受传入连接的端口。
  • PrivateKey - 由 wg genkey 命令生成的私钥。(要查看文件内容,请运行:sudo cat/etc/wireguard/privatekey
  • SaveConfig - 设置为 true 时,关闭时接口的当前状态将保存到配置文件中。
  • PostUp - 在启动界面之前执行的命令或脚本。在此示例中,我们使用 iptables 启用伪装。这将允许流量离开服务器,从而使 VPN 客户端可以访问 Internet。
    确保在 -A POSTROUTING 之后替换 ens3 以匹配公共网络接口的名称。您可以通过运行以下命令轻松找到该接口:
    1
    ip -o -4 route show to default | awk '{print $5}'
  • PostDown - 在关闭接口之前执行的命令或脚本。接口关闭后,iptables 规则将被删除。

wg0.confprivatekey 文件对普通用户不可读。使用 chmod 将权限设置为 600:

1
sudo chmod 600 /etc/wireguard/{privatekey,wg0.conf}

完成后,使用配置文件中指定的属性启动 wg0 接口:

1
sudo wg-quick up wg0

该命令将产生类似于以下内容的输出:

1
2
3
4
5
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.0.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE

运行 wg show wg0 检查接口状态和配置:

1
sudo wg show wg0
1
2
3
4
interface: wg0
public key: r3imyh3MCYggaZACmkx+CxlD6uAmICI8pe/PGq8+qCg=
private key: (hidden)
listening port: 51820

您也可以运行 ip a show wg0 来验证接口状态:

1
ip a show wg0
1
2
3
4
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.0.0.1/24 scope global wg0
valid_lft forever preferred_lft forever

要在启动时启用 WireGuard 接口,请运行以下命令:

1
sudo systemctl enable wg-quick@wg0

服务器网络和防火墙配置

为了使 NAT 正常工作,我们需要启用 IP 转发。打开 /etc/sysctl.conf 文件,并添加或取消注释以下行:

1
sudo nano /etc/sysctl.conf
1
net.ipv4.ip_forward=1

保存文件并应用更改:

1
sudo sysctl -p
1
net.ipv4.ip_forward = 1

如果使用 UFW 管理防火墙,则需要在端口 51820 上打开 UDP 通信:

1
sudo ufw allow 51820/udp

仅此而已。已设置将作为服务器的 Ubuntu 对等端。

Linux 和 macOS 客户端设置

有关所有受支持平台的安装说明,请访问 https://wireguard.com/install/。在 Linux 系统上,您可以使用分发软件包管理器来安装软件包,而在带有 brew 的 macOS 上也可以安装软件包。安装 WireGuard 后,请按照以下步骤配置客户端设备。

设置 Linux 和 macOS 客户端的过程几乎与服务器相同。首先生成公钥和私钥:

1
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

创建文件 wg0.conf 并添加以下内容:

1
2
3
4
5
6
7
8
9
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.0.0.2/24


[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = SERVER_IP_ADDRESS:51820
AllowedIPs = 0.0.0.0/0

接口部分中的设置与设置服务器时的含义相同:

  • Address - wg0 接口的以逗号分隔的 v4 或 v6 IP 地址列表。
  • PrivateKey - 要在客户端计算机上查看文件的内容,请运行: sudo cat /etc/wireguard/privatekey

对等部分包含以下字段:

  • PublicKey - 您要连接的对等方的公共密钥。(服务器的 /etc/wireguard/publickey 文件的内容)。
  • Endpoint - 您要连接的对等方的 IP 或主机名,后跟冒号,然后是远程对等方侦听的端口号。
  • AllowedIPs - v4 或 v6 IP 地址的逗号分隔列表,允许从该对等方传入的流量,并将该对等体的传出流量定向到该列表。我们使用 0.0.0.0/0 是因为我们正在路由流量,并希望服务器对等方发送具有任何源 IP 的数据包。

如果您需要配置其他客户端,只需使用其他专用 IP 地址重复相同的步骤即可。

Windows 客户端安装程序

WireGuard 网站下载并安装 Windows msi 软件包。

安装完成后,打开 WireGuard 应用程序,然后单击 “添加隧道” -> “添加空隧道…”,如下图所示:

windows-add-tunnel

将自动创建一个公钥对并将其显示在屏幕上。

windows-tunnel

输入隧道的名称,并按如下所示编辑配置:

1
2
3
4
5
6
7
8
9
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.0.0.2/24


[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = SERVER_IP_ADDRESS:51820
AllowedIPs = 0.0.0.0/0

在接口部分中,添加新行以定义客户端隧道地址。

在对等部分中,添加以下字段:

  • PublicKey - Ubuntu 服务器的公共密钥(/etc/wireguard/publickey 文件)。
  • Endpoint - Ubuntu 服务器的 IP 地址,后跟冒号和 WireGuard 端口(51820)。
  • AllowedIPs - 0.0.0.0/0

完成后,单击“保存”按钮。

将客户端对等方添加到服务器

最后一步是将客户端公钥和 IP 地址添加到服务器:

1
sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.0.0.2

确保使用在客户端计算机上生成的公用密钥(sudo cat /etc/wireguard/publickey)更改 CLIENT_PUBLIC_KEY 并调整客户端IP 地址(如果不同)。Windows 用户可以从 WireGuard 应用程序复制公钥。

完成后,返回客户端计算机并打开隧道接口。

Linux 和 macOS 客户端

在 Linux 客户端上,运行以下命令以打开界面:

1
sudo wg-quick up wg0

现在,您应该已连接到 Ubuntu 服务器,并且来自客户端计算机的流量应通过该服务器进行路由。您可以使用以下方法检查连接:

1
sudo wg
1
2
3
4
5
6
7
8
9
10
11
interface: wg0
public key: sZThYo/0oECwzUsIKTa6LYXLhk+Jb/nqK4kCCP2pyFg=
private key: (hidden)
listening port: 48052
fwmark: 0xca6c

peer: r3imyh3MCYggaZACmkx+CxlD6uAmICI8pe/PGq8+qCg=
endpoint: XXX.XXX.XXX.XXX:51820
allowed ips: 0.0.0.0/0
latest handshake: 1 minute, 22 seconds ago
transfer: 58.43 KiB received, 70.82 KiB sent

您也可以打开浏览器,键入 “what is my ip”,然后您应该会看到 Ubuntu 服务器的 IP 地址。

要停止隧道,请关闭 wg0 接口:

1
sudo wg-quick down wg0

Windows 客户端

如果您在 Windows 上安装了 WireGuard,请单击“激活”按钮。连接对等体后,隧道状态将更改为“活动”:

windows-connect-tunnel

结论

我们向您展示了如何在 Ubuntu 18.04 计算机上安装 WireGuard 并将其配置为 VPN 服务器。通过此设置,您可以通过保持流量数据私有来匿名浏览 Web。