如何在Ubuntu 16.04上使用WireGuard创建一个点对点的VPN

WireGuard是一个现代化的高性能VPN,设计简单易用,同时提供强大的安全性。 WireGuard仅着重于通过使用公钥认证加密的网络接口在各方之间提供安全的连接。 ...

介绍

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

WireGuard可以使用的最简单的拓扑之一是点对点连接。 这建立了两台机器之间的安全连接,而不需要中央服务器的协调。 这种类型的连接也可以在两个以上的成员之间使用来建立一个网状VPN拓扑结构,每个单独的服务器可以直接与其对等体进行通信。 由于每台主机的地位相同,因此这两种拓扑结构最适合在服务器之间建立安全的消息传递,而不是使用单个服务器作为网关来路由流量。

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

先决条件

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

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

安装软件

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

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

sudo add-apt-repository ppa:wireguard/wireguard

出现提示时按ENTER键将新的软件包源添加到您的apt配置。 一旦添加了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设置为您选择的端口:

我们也设置SaveConfigtrue 这将告诉wg-quick服务在关机时自动将其活动配置保存到这个文件中。

注意:启用/etc/wireguard/wg0.conf只要服务关闭, 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]部分,但不是第一个。 现在可以保存并关闭第一个服务器(定义10.0.0.1地址的那个)的配置文件。

定义对等部分

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

首先将PublicKey设置为第一个服务器PublicKey的值。 您可以通过在对端服务器上输入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
6: 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

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

interface: wg0
  public key: public_key_of_this_server
  private key: (hidden)
  listening port: 5555

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

interface: 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
interface: 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
PING 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,并将每台主机配置为与对等端点对点连接的服务器。 这种拓扑非常适合于与对等方建立服务器到服务器通信,其中每一方都是平等的参与者,或者主机可能必须建立到其他服务器的临时连接。


分享按钮