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

news2024/5/18 14:19:59

简介

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 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: 5555

peer: 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: 5555

peer: 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 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,并将每个主机配置为服务器,与其对等点之间建立了点对点连接。这种拓扑结构非常适合建立服务器之间的通信,其中每一方都是平等的参与者,或者主机可能需要与其他服务器建立临时连接的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1641878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享一份物联网 SAAS 平台架构设计

一、架构图**** 二、Nginx**** 用于做服务的反向代理。 三、网关**** PaaS平台所有服务统一入口&#xff0c;包含token鉴权功能。 四、开放平台**** 对第三方平台开放的服务入口。 五、MQTT**** MQTT用于设备消息通信、内部服务消息通信。 六、Netty**** Socket通信设…

docker mysql更新升级版本

一、环境说明 操作系统&#xff1a;Centos7 数据库版本&#xff1a;MySql 8.0.22 数据库中数据量不大&#xff0c;处于开发/测试环境&#xff0c;风险较低 二、升级原因 升级是因为测评漏洞&#xff0c;在进行国家三级等级保护测评过程中&#xff0c;漏扫发现多个MySql漏洞…

[论文阅读] 测试时间自适应TTA

最初接触 CVPR2024 TEA: Test-time Energy Adaptation [B站]&#xff08;1:35:00-1:53:00&#xff09;https://www.bilibili.com/video/BV1wx4y1v7Jb/?spm_id_from333.788&vd_source145b0308ef7fee4449f12e1adb7b9de2 实现&#xff1a; 读取预训练好的模型参数设计需要更…

数字化战略|数字化建设总体规划蓝图PPT(建议收藏)

摘要 这份头部咨询公司关于数字化转型的报告为企业管理者和技术人员提供了一份详尽的数字化转型指南。报告从战略出发&#xff0c;详细阐述了数字生态体系建设、数字化核心方案构建、管理协同能力提升以及数据集中管理和应用能力增强等关键环节。对于从业者而言&#xff0c;报…

JAVA语言开发的智慧城管系统源码:技术架构Vue+后端框架Spring boot+数据库MySQL

通过综合应用计算机技术、网络技术、现代通信技术等多种信息技术&#xff0c;充分融合RS遥感技术、GPS全球定位技术、GIS地理信息系统&#xff0c;开始建设一个动态可视的、实时更新的、精细量化的城市管理系统。智慧城管将采用云平台架构方式进行建设&#xff0c;基于现有数字…

protobuf在配置文件管理上的应用

TextFormat::ParseFromString 是 Google Protocol Buffers&#xff08;通常简称为 Protobuf&#xff09;库中的一个函数&#xff0c;用于从文本格式解析消息。Protobuf 是一种用于序列化结构化数据的库&#xff0c;它允许你定义数据的结构&#xff0c;然后自动生成源代码来处理…

neo4j 的插入速度为什么越来越慢,可能是使用了过多图谱查询操作

文章目录 背景描述分析解决代码参考neo4j 工具类Neo4jDriver知识图谱构建效果GuihuaNeo4jClass 背景描述 使用 tqdm 显示&#xff0c;处理的速度&#xff1b; 笔者使用 py2neo库&#xff0c;调用 neo4j 的API 完成节点插入&#xff1b; 有80万条数据需要插入到neo4j图数据中&am…

基于SSM的校园短期闲置资源置换平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的校园短期闲置资源置换平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过…

c语言从入门到函数速成(2)

温馨提醒&#xff1a;本篇文章适合人群&#xff1a;刚学c又感觉那个地方不怎么懂的同学以及以及学了一些因为自身原因停学一段时间后又继续学​​​c的学 好&#xff0c;正片开始&#xff01; 数组 概念&#xff1a;数组中存放的是1个或者多个数据&#xff0c;但是数组元素个…

Topaz Video AI 5.0.3激活版 AI视频无损缩放增强

Topaz Video AI专注于很好地完成一些视频增强任务&#xff1a;去隔行&#xff0c;放大和运动插值。我们花了五年时间制作足够强大的人工智能模型&#xff0c;以便在真实世界的镜头上获得自然的结果。 Topaz Video AI 还将充分利用您的现代工作站&#xff0c;因为我们直接与硬件…

Redis核心数据结构——跳表(生成数据到文件和从文件中读取数据、模块合并、)

生成文件和从文件中读取数据。 需求如下&#xff1a; 你的任务是实现 SkipList 类中的数据持久化成员函数和数据加载成员函数。 持久化数据成员函数签名&#xff1a;void dump_file(); 该成员函数负责将存储引擎内的数据持久化到文件中。数据的持久化格式是将每个键值对写入文…

封装umi-request时通过 AbortController 配置取消请求

一、关键部分 一、在封装的request.ts中 声明一个 abortControllers 对象用于存储要取消的请求&#xff08;我用了-s表示复数&#xff0c;多个abortcontroller对象&#xff0c;与下面&#x1f447;的单个abortController区分&#xff09;封装取消请求的函数cancelRequest, 传入…

GraphPad Prism:医学绘图的革命性工具,Mac/Win双平台首选

在医学研究的道路上&#xff0c;数据的可视化与分析是不可或缺的一环。GraphPad Prism&#xff0c;作为一款专业的医学绘图工具&#xff0c;正以其强大的功能和卓越的性能&#xff0c;在Mac与Win双平台上引领着医学绘图的新潮流。 GraphPad Prism不仅仅是一款绘图软件&#xf…

Ubuntu22.04有线网络连接但是没网,网络图标显示问号

Ubuntu22.04有线网络连接但是没网&#xff0c;网络图标显示问号 问题描述解决方案 问题描述 有线网络连接 但是没网 且网络图标显示问号 解决方案 进入设置->隐私->在 连接情况 中关闭连接检查 关闭后 网络正常

使用Qt for android 获取android PDA设备扫码数据

安装Qt Android 模块、Qt Creator、JDK8 Qt Creator版本太高不行&#xff0c;亲测最新版的会导致无法使用jdk 8&#xff08;2024-05-04 我的Qt版本是5.15.2&#xff0c;所以我选择了Qt Creator5.0.3进行开发 5.0.3 下载JDK8 JDK8 安装Qt Creator、JDK8 安装Qt Creator没什么…

【银角大王——Django课程——用户表的基本操作2】

用户表的基本操作2 编辑用户按钮删除按钮入职日期——不显示时分&#xff0c;只显示年月日——使用DataField函数不使用DateTimeField修改models记得重新执行命令&#xff0c;更新数据库结构修改前修改后 编辑用户按钮 点击编辑&#xff0c;跳转到编辑页面&#xff08;将编辑的…

函数之对决!!:数学函数 VS C++函数

前言 有人问过我&#xff0c;C里的函数是否跟我们数学里的函数一样&#xff1f;于是&#xff0c;我就写下了这篇文章。 一、数学函数 1、一次函数 一次函数&#xff0c;也称为线性函数&#xff0c;是数学中函数的一种&#xff0c;通常表示为ykxb&#xff08;其中k和b是常数&am…

springboot+vue中小学文具商城购物系统网站

技术栈 前端&#xff1a;vue.jsElementUI 开发工具&#xff1a;IDEA 或者eclipse都支持 编程语言: java 框架&#xff1a; ssm/springboot 数据库: mysql 版本不限 数据库工具&#xff1a;Navicat/SQLyog都可以 详细技术&#xff1a;javaspringbootvueMYSQLMAVEN文具网站为用户…

jQuery的简单使用

jQuery的简单使用 jQuery查找父、子、兄弟节点jQuery查找内容元素筛选遍历元素操作元素width() / height() 设置宽高.css() 设值样式attr() / prop() 设置属性增加、删除、切换class删除和清空 操作元素总结选择表达式链式操作取值和赋值函数 HTML_1 <table id"table_…

第16章 基于结构的测试技术(白盒测试技术)

一、静态测试技术 &#xff08;一&#xff09;概述 不运行程序代码的情况下&#xff0c;通过质量准则或其他准则对测试项目进行检查的测试类型&#xff0c;人工或工具检查。 1、代码检查 2、编码规则检查 3、静态分析 静态分析概述 不需要执行程序 控制流分析 通过生成…