如何在 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 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.mfbz.cn/a/591257.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【简单讲解下npm常用命令】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《电-氢-混氢天然气耦合的城市综合能源系统低碳优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

政安晨:【Keras机器学习示例演绎】(三十二)—— 在 Vision Transformers 中学习标记化

目录 导言 导入 超参数 加载并准备 CIFAR-10 数据集 数据扩增 位置嵌入模块 变压器的 MLP 模块 令牌学习器模块 变换器组 带有 TokenLearner 模块的 ViT 模型 培训实用程序 使用 TokenLearner 培训和评估 ViT 实验结果 参数数量 最终说明 政安晨的个人主页&…

STM32单片机实战开发笔记-EXIT外部中断检测

嵌入式单片机开发实战例程合集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11av8rV45dtHO0EHf8e_Q0Q?pwd28ab 提取码&#xff1a;28ab EXIT模块测试 功能描述 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型&a…

政安晨:【Keras机器学习示例演绎】(三十三)—— 知识提炼

目录 设置 构建 Distiller() 类 创建学生和教师模型 准备数据集 培训教师 将教师模型蒸馏给学生模型 从头开始训练学生进行比较 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够…

基于Spring Boot的医疗服务系统设计与实现

基于Spring Boot的医疗服务系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 医疗服务系统首页界面图&#xff0c;公告信息、医疗地图…

快速幂笔记

快速幂即为快速求出一个数的幂&#xff0c;这样可以避免TLE&#xff08;超时&#xff09;的错误。 传送门&#xff1a;快速幂模板 前置知识&#xff1a; 1) 又 2) 代码&#xff1a; #include <bits/stdc.h> using namespace std; int quickPower(int a, int b) {int…

容斥原理以及Nim基础(异或,SG函数)

容斥原理&#xff1a; 容斥的复杂度为O&#xff08;2^m)&#xff0c;所以可以通过&#xff0c;对于实现&#xff0c;一共2^n-1种&#xff0c;我们可以用二进制来实现 下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; typedef long long LL; cons…

uniapp 文字转语音(文字播报、语音合成)、震动提示插件 Ba-TTS

简介&#xff08;下载地址&#xff09; Ba-TTS 是一款uniapp语音合成&#xff08;tts&#xff09;插件&#xff0c;支持文本转语音&#xff08;无服务费&#xff09;&#xff0c;支持震动提示。 支持语音合成&#xff0c;文本转语音支持震动&#xff08;可自定义任意震动效果…

【云原生】Docker 实践(四):使用 Dockerfile 文件的综合案例

【Docker 实践】系列共包含以下几篇文章&#xff1a; Docker 实践&#xff08;一&#xff09;&#xff1a;在 Docker 中部署第一个应用Docker 实践&#xff08;二&#xff09;&#xff1a;什么是 Docker 的镜像Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerf…

【LinuxC语言】信号的基本概念与基本使用

文章目录 前言一、信号的概念二、信号的使用2.1 基本的信号类型2.2 signal函数 总结 前言 在Linux环境下&#xff0c;信号是一种用于通知进程发生了某种事件的机制。这些事件可能是由操作系统、其他进程或进程本身触发的。对于C语言编程者来说&#xff0c;理解信号的基本概念和…

36.Docker-Dockerfile自定义镜像

镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 镜像是分层机构&#xff0c;每一层都是一个layer BaseImage层&#xff1a;包含基本的系统函数库、环境变量、文件系统 EntryPoint:入口&#xff0c;是镜像中应用启动的命令 其他&#xff1a;在…

从0开始学习制作一个微信小程序 学习部分(6)组件与事件绑定

系列文章目录 学习篇第一篇我们讲了编译器下载&#xff0c;项目、环境建立、文件说明与简单操作&#xff1a;第一篇链接 第二、三篇分析了几个重要的配置json文件&#xff0c;是用于对小程序进行的切换页面、改变图标、控制是否能被搜索到等的操作第二篇链接、第三篇链接 第四…

QT的TcpServer

Server服务器端 QT版本5.6.1 界面设计 工程文件&#xff1a; 添加 network 模块 头文件引入TcpServer类和TcpSocket&#xff1a;QTcpServer和QTcpSocket #include <QTcpServer> #include <QTcpSocket>创建server对象并实例化&#xff1a; /*h文件中*/QTcpServer…

基于SSM SpringBoot vue宾馆网上预订综合业务服务系统

基于SSM SpringBoot vue宾馆网上预订综合业务服务系统 系统功能 首页 图片轮播 宾馆信息 饮食美食 休闲娱乐 新闻资讯 论坛 留言板 登录注册 个人中心 后台管理 登录注册 个人中心 用户管理 客房登记管理 客房调整管理 休闲娱乐管理 类型信息管理 论坛管理 系统管理 新闻资讯…

Docker-Compose编排LNMP并部署WordPress

前言 随着云计算和容器化技术的快速发展&#xff0c;使用 Docker Compose 编排 LNMP 环境已经成为快速部署 Web 应用程序的一种流行方式。LNMP 环境由 Linux、Nginx、MySQL 和 PHP 组成&#xff0c;为运行 Web 应用提供了稳定的基础。本文将介绍如何通过 Docker Compose 编排 …

BUUCTF---misc---被偷走的文件

1、题目描述 2、下载附件&#xff0c;是一个流量包&#xff0c;拿去wireshark分析&#xff0c;依次点开流量&#xff0c;发现有个流量的内容显示flag.rar 3、接着在kali中分离出压缩包&#xff0c;使用下面命令&#xff0c;将压缩包&#xff0c;分离出放在out3文件夹中 4、在文…

Java -- (part21)

一.File类 1.概述 表示文件或者文件夹的路径抽象表示形式 2.静态成员 static String pathSeparator:路径分隔符:; static String separator:名称分隔符:\ 3.构造方法 File(String parent,String child) File(File parent,String child) Flie(String path) 4.方法 获…

在M1芯片安装鸿蒙闪退解决方法

在M1芯片安装鸿蒙闪退解决方法 前言下载鸿蒙系统安装完成后&#xff0c;在M1 Macos14上打开闪退解决办法接下来就是按照提示一步一步安装。 前言 重新安装macos系统后&#xff0c;再次下载鸿蒙开发软件&#xff0c;竟然发现打不开。 下载鸿蒙系统 下载地址&#xff1a;http…

Android使用kts上传aar到JitPack仓库

Android使用kts上传aar到JitPack 之前做过sdk开发&#xff0c;需要将仓库上传到maven、JitPack或JCenter,但是JCenter已停止维护&#xff0c;本文是讲解上传到JitPack的方式,使用KTS语法&#xff0c;记录使用过程中遇到的一些坑. 1.创建项目(library方式) 由于之前用鸿神的w…