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

2024-05-04 17:52

本文主要是介绍如何在 Ubuntu 16.04 上使用 WireGuard 创建点对点 VPN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

WireGuard 是一种现代、高性能的 VPN,旨在提供易于使用的同时又具有强大的安全性。WireGuard 专注于在网络接口上使用公钥认证加密来提供安全连接。这意味着,与大多数 VPN 不同,它不强制执行拓扑结构,因此可以通过操纵周围的网络配置来实现不同的配置。这种模型提供了极大的力量和灵活性,可以根据个人需求进行应用。

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

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

先决条件

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

  • 使用 Ubuntu 16.04 进行初始服务器设置

当您准备好继续时,请使用您的 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 行,使您的文件看起来像这样:

[Interface]
PrivateKey = 生成的私钥
ListenPort = 5555
SaveConfig = 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 = 5555
SaveConfig = true
Address = 10.0.0.1/24

对于我们的第二台服务器,我们将地址定义为 10.0.0.2,这将给我们一个 CIDR 表示为 10.0.0.2/24:

[environment second]
[Interface]
PrivateKey = 生成的私钥
ListenPort = 5555
SaveConfig = true
Address = 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_server
AllowedIPs = 10.0.0.1/32

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

[environment second]
[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
[secondary_label 第一台服务器上的输出]
[environment third]
6: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1link/none inet 10.0.0.1/24 scope global wg0valid_lft forever preferred_lft forever

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

sudo wg

在没有对等定义的服务器上,显示将类似于以下内容:

[secondary_label 第一台服务器上的输出]
[environment third]
interface: wg0public key: public_key_of_this_serverprivate key: (hidden)listening port: 5555

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

[secondary_label 第二台服务器上的输出]
[environment second]
interface: wg0public key: public_key_of_this_serverprivate key: (hidden)listening port: 5555peer: public_key_of_first_serverendpoint: public_IP_of_first_server:5555allowed 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: wg0public key: public_key_of_this_serverprivate key: (hidden)listening port: 5555peer: public_key_of_second_serverendpoint: public_IP_of_second_server:5555allowed 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 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,并将每个主机配置为服务器,与其对等点之间建立了点对点连接。这种拓扑结构非常适合建立服务器之间的通信,其中每一方都是平等的参与者,或者主机可能需要与其他服务器建立临时连接的情况。

这篇关于如何在 Ubuntu 16.04 上使用 WireGuard 创建点对点 VPN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959771

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定