简介
WireGuard 是一种现代、高性能的 VPN,旨在提供易于使用的同时又具有强大的安全性。WireGuard 专注于在网络接口上使用公钥认证加密来提供安全连接。这意味着,与大多数 VPN 不同,它不强制执行拓扑结构,因此可以通过操纵周围的网络配置来实现不同的配置。这种模型提供了极大的力量和灵活性,可以根据个人需求进行应用。
WireGuard 可以使用的最简单的拓扑结构之一是点对点连接。这在两台机器之间建立了一个安全链接,无需通过中央服务器进行中介。这种连接类型也可以在两个以上的成员之间使用,以建立网状 VPN 拓扑,其中每个单独的服务器可以直接与其对等方通信。由于每个主机地位相同,这两种拓扑结构最适合在服务器之间建立安全消息传递,而不是使用单个服务器作为路由流量的网关。
在本指南中,我们将演示如何使用两台 Ubuntu 16.04 服务器建立 WireGuard 的点对点 VPN 连接。我们将从安装软件开始,然后为每个主机生成加密密钥对。之后,我们将创建一个简短的配置文件来定义对等方的连接信息。一旦启动接口,我们就能够通过 WireGuard 接口在服务器之间发送安全消息。
先决条件
要按照本指南操作,您需要访问两台 Ubuntu 16.04 服务器。在每台服务器上,您需要创建一个具有 sudo
权限以执行管理操作的非根用户。您还需要在每个系统上配置基本防火墙。您可以通过完成以下教程来满足这些要求:
当您准备好继续时,请使用您的 sudo
用户登录到每台服务器。
安装软件
WireGuard 项目为 Ubuntu 系统提供了最新的软件包的 PPA。在继续之前,我们需要在我们的两台服务器上安装 WireGuard。在每台服务器上,执行以下操作。
首先,将 WireGuard PPA 添加到系统中以配置访问项目的软件包:
sudo add-apt-repository ppa:wireguard/wireguard
在提示时按 ENTER 以将新的软件包源添加到您的 apt
配置。添加了 PPA 后,更新本地软件包索引以获取有关新可用软件包的信息,然后安装 WireGuard 内核模块和用户空间组件:
sudo apt-get updatesudo 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 地址以及它将用于从对等方接收连接的端口。首先添加 ListenPort
和 SaveConfig
行,使您的文件看起来像这样:
[Interface]PrivateKey = 生成的私钥ListenPort = 5555SaveConfig = true
这设置了 WireGuard 将监听的端口。这可以是任何空闲的可绑定端口,但在本指南中,我们将为两台服务器都在端口 5555 上设置我们的 VPN。在每个主机上将 ListenPort
设置为您选择的端口:
我们还将 SaveConfig
设置为 true
。这将告诉 wg-quick
服务在关闭时自动将其活动配置保存到此文件中。
接下来,在每台服务器上为 wg-quick
服务设置网络信息时,为每台服务器添加一个唯一的 Address
定义。我们将使用 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:
[environment third][Interface]PrivateKey = 生成的私钥ListenPort = 5555SaveConfig = trueAddress = 10.0.0.1/24
对于我们的第二台服务器,我们将地址定义为 10.0.0.2,这将给我们一个 CIDR 表示为 10.0.0.2/24:
[environment second][Interface]PrivateKey = 生成的私钥ListenPort = 5555SaveConfig = trueAddress = 10.0.0.2/24
这是[Interface]
部分的结束。
我们可以在配置文件中输入关于服务器对等方的信息,也可以稍后使用 wg
命令手动输入。如上所述,wg-quick
服务与 SaveConfig
选项设置为 true
将意味着对等方信息最终将使用任一方法写入文件。
为了演示定义对等方身份的两种方式,我们将在第二台服务器的配置文件中创建一个 [Peer]
部分,但不在第一台服务器上创建。您现在可以保存并关闭第一台服务器(定义 10.0.0.1 地址的服务器)的配置文件。
定义对等节点部分
在仍然打开的配置文件中,在[Interface]
部分的条目下创建一个名为[Peer]
的部分。
首先将PublicKey
设置为第一个服务器的公钥的值。您可以通过在另一台服务器上输入cat /etc/wireguard/publickey
来找到这个值。我们还将设置AllowedIPs
为隧道内有效的IP地址。由于我们知道第一个服务器正在使用的特定IP地址,我们可以直接输入该值,以/32
结尾表示包含单个IP值的范围:
[environment second][Interface]. . .[Peer]PublicKey = public_key_of_first_serverAllowedIPs = 10.0.0.1/32
最后,我们可以将Endpoint
设置为第一个服务器的公共IP地址和WireGuard监听端口(在本示例中我们使用了端口5555)。如果WireGuard从此对等方接收到合法流量,它将更新此值,从而使VPN能够适应漫游条件。我们设置初始值以便此服务器可以发起联系:
[environment second][Interface]. . .[Peer]PublicKey = public_key_of_first_serverAllowedIPs = 10.0.0.1/32Endpoint = 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
[secondary_label 第一台服务器上的输出][environment third]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
在没有对等定义的服务器上,显示将类似于以下内容:
[secondary_label 第一台服务器上的输出][environment third]interface: wg0 public key: public_key_of_this_server private key: (hidden) listening port: 5555
在已经定义了对等配置的服务器上,输出还将包含该信息:
[secondary_label 第二台服务器上的输出][environment second]interface: wg0 public key: public_key_of_this_server private key: (hidden) listening port: 5555peer: public_key_of_first_server endpoint: public_IP_of_first_server:5555 allowed ips: 10.0.0.1/32
为了完成连接,我们现在需要使用wg
命令将第二台服务器的对等信息添加到第一台服务器上。
在命令行上添加缺失的对等信息
在第一台服务器(不显示对等信息的那台)上,使用以下格式手动输入对等信息。第二台服务器的公钥可以在第二台服务器的sudo wg
输出中找到:
[environment third]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
来确认信息现在在活动配置中:
[environment third]sudo wg
[secondary_label 第一台服务器上的输出][environment third]interface: wg0 public key: public_key_of_this_server private key: (hidden) listening port: 5555peer: public_key_of_second_server endpoint: public_IP_of_second_server:5555 allowed ips: 10.0.0.2/32
我们的点对点连接现在应该可用。尝试从第一台服务器向第二台服务器的VPN地址ping:
[environment third]ping -c 3 10.0.0.2
[secondary_label 第一台服务器上的输出][environment third]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 ms64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.615 ms64 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 1998msrtt 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,并将每个主机配置为服务器,与其对等点之间建立了点对点连接。这种拓扑结构非常适合建立服务器之间的通信,其中每一方都是平等的参与者,或者主机可能需要与其他服务器建立临时连接的情况。