如何在Ubuntu16.04上使用WireGuard创建点对点VPN

来自菜鸟教程
跳转至:导航、​搜索

介绍

WireGuard 是一种现代的高性能 VPN,旨在易于使用,同时提供强大的安全性。 WireGuard 仅专注于通过使用公钥身份验证加密的网络接口在各方之间提供安全连接。 这意味着,与大多数 VPN 不同,没有强制实施拓扑,因此可以通过操纵周围的网络配置来实现不同的配置。 该模型提供了强大的功能和灵活性,可以根据您的个人需求进行应用。

WireGuard 可以使用的最简单的拓扑之一是点对点连接。 这在两台机器之间建立了安全链接,而无需中央服务器的调解。 这种类型的连接也可以在两个以上的成员之间使用,以建立网状 VPN 拓扑,其中每个单独的服务器都可以直接与其对等方对话。 因为每台主机都是平等的,所以这两种拓扑最适合在服务器之间建立安全的消息传递,而不是使用单个服务器作为网关来路由流量。

在本指南中,我们将演示如何使用两台 Ubuntu 16.04 服务器与 WireGuard 建立点对点 VPN 连接。 我们将从安装软件开始,然后为每个主机生成加密密钥对。 之后,我们将创建一个简短的配置文件来定义对等方的连接信息。 一旦我们启动接口,我们将能够通过 WireGuard 接口在服务器之间发送安全消息。

先决条件

要遵循本指南,您需要访问 two Ubuntu 16.04 服务器。 在每台服务器上,您需要创建一个具有 sudo 权限的非 root 用户来执行管理操作。 您还需要在每个系统上配置一个基本防火墙。 您可以通过完成以下教程来满足这些要求:

当您准备好继续时,使用您的 sudo 用户登录到每个服务器。

安装软件

WireGuard 项目为 Ubuntu 系统提供了一个带有最新软件包的 PPA。 我们需要在我们的两台服务器上安装 WireGuard,然后才能继续。 在每台服务器上,执行以下操作。

首先,将 WireGuard PPA 添加到系统以配置对项目包的访问:

sudo add-apt-repository ppa:wireguard/wireguard

当提示将新包源添加到 apt 配置时,按 ENTER。 添加 PPA 后,更新本地包索引以获取有关新可用包的信息,然后安装 WireGuard 内核模块和用户区组件:

sudo apt-get update
sudo apt-get install wireguard-dkms wireguard-tools

接下来,我们可以开始在每台服务器上配置 WireGuard。

创建私钥

WireGuard VPN 中的每个参与者都使用公钥加密向其对等方进行身份验证。 新对等点之间的连接可以通过交换公钥和执行最小配置来建立。

要生成私钥并将其直接写入 WireGuard 配置文件,请在每个服务器 上键入以下

(umask 077 && printf "[Interface]\nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null)
wg genkey | sudo tee -a /etc/wireguard/wg0.conf | wg pubkey | sudo tee /etc/wireguard/publickey

第一条命令将配置文件的初始内容写入 /etc/wireguard/wg0.conf。 子 shell 中的 umask 值,以便我们在不影响常规环境的情况下创建具有受限权限的文件。

第二个命令使用 WireGuard 的 wg 命令生成一个私钥,并将其直接写入我们的受限配置文件。 我们还将密钥通过管道传回 wg pubkey 命令以派生关联的公钥,我们将其写入名为 /etc/wireguard/publickey 的文件中以便于参考。 在定义配置时,我们需要与第二台服务器交换此文件中的密钥。

创建初始配置文件

接下来,我们将在编辑器中打开配置文件以设置其他一些细节:

sudo nano /etc/wireguard/wg0.conf

在内部,您应该会看到生成的私钥在名为 [Interface] 的部分中定义。 本节包含连接本地端的配置。

配置接口部分

我们需要定义此节点将使用的 VPN IP 地址以及它将侦听来自对等点的连接的端口。 首先添加 ListenPortSaveConfig 行,使您的文件看起来像这样:

/etc/wireguard/wg0.conf

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true

这将设置 WireGuard 将侦听的端口。 这可以是任何免费的、可绑定的端口,但在本指南中,我们将为两台服务器在端口 5555 上设置我们的 VPN。 将每个主机上的 ListenPort 设置为您选择的端口:

我们还将 SaveConfig 设置为 true。 这将告诉 wg-quick 服务在关闭时自动将其活动配置保存到此文件。

注意:启用SaveConfig后,每当服务关闭时,wg-quick服务都会覆盖/etc/wireguard/wg0.conf文件的内容。 如果您需要修改 WireGuard 配置,请在编辑 /etc/wireguard/wg0.conf 文件之前关闭 wg-quick 服务,或者使用 wg 命令更改正在运行的服务(这些将在服务关闭时保存在文件中)。 服务运行期间对配置文件所做的任何更改都将在 wg-quick 存储其活动配置时被覆盖。


接下来,为每个服务器添加一个唯一的 Address 定义,以便 wg-quick 服务在调出 WireGuard 界面时可以设置网络信息。 我们将使用 10.0.0.0/24 子网作为 VPN 的地址空间。 对于每台计算机,您需要在此范围内(10.0.0.1 到 10.0.0.254)选择一个唯一地址,并使用 CIDR 表示法 指定地址和子网。

我们将给我们的 第一个服务器 一个地址 10.0.0.1,用 CIDR 表示法表示为 10.0.0.1/24:

/etc/wireguard/wg0.conf 在第一台服务器上

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.1/24

在我们的 第二个服务器 上,我们将地址定义为 10.0.0.2,这为我们提供了 10.0.0.2/24 的 CIDR 表示:

/etc/wireguard/wg0.conf 在第二台服务器上

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.2/24

这是 [Interface] 部分的结尾。

我们可以在配置文件中输入有关服务器对等点的信息,也可以稍后使用 wg 命令手动输入。 如上所述,将 SaveConfig 选项设置为 truewg-quick 服务将意味着对等信息最终将通过任一方法写入文件。

为了演示定义对等身份的两种方式,我们将在第二个服务器的配置文件中创建一个 [Peer] 部分,而不是第一个。 您现在可以保存并关闭 first 服务器的配置文件(定义 10.0.0.1 地址的那个)。

定义对等部分

在仍然打开的配置文件中,在 [Interface] 部分的条目下方创建一个名为 [Peer] 的部分。

首先将 PublicKey 设置为 first 服务器的公钥的值。 您可以通过在对端服务器上键入 cat /etc/wireguard/publickey 来找到此值。 我们还将 AllowedIPs 设置为隧道内有效的 IP 地址。 由于我们知道第一台服务器使用的具体 IP 地址,我们可以直接输入,以 /32 结尾表示包含单个 IP 值的范围:

/etc/wireguard/wg0.conf 在第二台服务器上

[Interface]
. . .

[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32

最后,我们可以将 Endpoint 设置为第一台服务器的公共 IP 地址和 WireGuard 监听端口(本例中我们使用端口 5555)。 如果 WireGuard 在另一个地址上接收到来自此对等方的合法流量,它将更新此值,从而允许 VPN 适应漫游条件。 我们设置初始值,以便该服务器可以发起联系:

/etc/wireguard/wg0.conf 在第二台服务器上

[Interface]
. . .

[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32
Endpoint = public_IP_of_first_server:5555

完成后,保存并关闭文件以返回命令提示符。

启动 VPN 并连接到对等点

我们现在准备在每台服务器上启动 WireGuard 并配置我们两个对等方之间的连接。

打开防火墙并启动 VPN

首先,在每台服务器的防火墙中打开 WireGuard 端口:

sudo ufw allow 5555

现在,使用我们定义的 wg0 接口文件启动 wg-quick 服务:

sudo systemctl start wg-quick@wg0

这将启动机器上的 wg0 网络接口。 我们可以通过键入以下内容来确认:

ip addr show wg0
Output on first server6: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1
    link/none 
    inet 10.0.0.1/24 scope global wg0
       valid_lft forever preferred_lft forever

我们可以使用wg工具查看VPN的活动配置信息:

sudo wg

在没有对等定义的服务器上,显示将如下所示:

Output on first serverinterface: wg0
  public key: public_key_of_this_server
  private key: (hidden)
  listening port: 5555

在已定义对等配置的服务器上,输出还将包含该信息:

Output on second serverinterface: wg0
  public key: public_key_of_this_server
  private key: (hidden)
  listening port: 5555

peer: public_key_of_first_server
  endpoint: public_IP_of_first_server:5555
  allowed ips: 10.0.0.1/32

为了完成连接,我们现在需要使用 wg 命令将第二台服务器的对等信息添加到第一台服务器。

在命令行上添加缺少的对等信息

第一台服务器(不显示对等信息的服务器)上,使用以下格式手动输入对等信息。 第二台服务器的公钥可以在第二台服务器的 sudo wg 的输出中找到:

sudo wg set wg0 peer public_key_of_second_server endpoint public_IP_of_second_server:5555 allowed-ips 10.0.0.2/32

您可以通过在第一台服务器上再次键入 sudo wg 来确认信息现在处于活动配置中:

sudo wg
Output on first serverinterface: wg0
  public key: public_key_of_this_server
  private key: (hidden)
  listening port: 5555

peer: public_key_of_second_server
  endpoint: public_IP_of_second_server:5555
  allowed ips: 10.0.0.2/32

我们的点对点连接现在应该可用了。 尝试从第一台服务器 ping 第二台服务器的 VPN 地址:

ping -c 3 10.0.0.2
Output on first serverPING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.635 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.615 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.841 ms

--- 10.0.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.615/0.697/0.841/0.102 ms

如果一切正常,您可以通过重新启动服务将第一台服务器上的配置保存回 /etc/wireguard/wg0.conf 文件:

sudo systemctl restart wg-quick@wg0

如果您想在启动时启动隧道,您可以通过键入以下命令在每台机器上启用该服务:

sudo systemctl enable wg-quick@wg0

现在,只要机器启动,VPN 隧道就会自动启动。

结论

WireGuard 因其灵活性、轻量级实施和现代加密技术而成为许多用例的绝佳选择。 在本指南中,我们在两台 Ubuntu 16.04 服务器上安装了 WireGuard,并将每台主机配置为一台服务器,并与它的对等点建立点对点连接。 此拓扑非常适合与对等方建立服务器到服务器通信,其中每一方都是平等的参与者,或者主机可能必须与其他服务器建立临时连接。