当前位置: 首页 > news >正文

debian/ubuntu/windows配置wiregurad内网服务器(包含掉线自启动)

文章目录

  • 前言
  • 一、服务器配置
    • 安装wireguard软件
    • 生成私钥公钥
    • 配置服务器参数
    • 配置服务器sysctl参数
    • 启动、停止服务端
  • 二、用户端配置
    • 安装wireguard软件
    • 生成私钥公钥
    • 配置客户端参数
    • 启动、停止客户端
    • 配置服务开机启动
  • 三、服务器添加、删除客户
  • 四、配置掉线自启动
    • 配置掉线自启动脚本
    • 配置定时程序
    • 配置脚本sudo免密执行权限
  • 结尾

前言

本文主要用来讲解如何配置wireguard服务器、客户端及掉线自启动的全套流程。

WireGuard 是一种轻量级的虚拟专用网协议,旨在提供快速、安全、简单的网络连接。它是由 Jason Donenfeld 在 2015 年发明的,并于 2018 年正式发布。

WireGuard 与其他常见的协议相比,有许多优点,如更小的代码库、更快的速度、更低的系统资源消耗、更简单的架构和更安全的加密方式。它通常用于个人电脑、服务器、移动设备等,可以帮助用户保护其在线隐私、提高网络安全性、解除网络限制等。

WireGuard 使用了自己的加密协议,使用了高效的数据包格式和高效的握手机制,可以提高网络速度和效率。它还使用了新型的密钥管理方式,可以更快地完成握手和通信。

总的来说,WireGuard 是一种非常优秀的协议,它提供了快速、安全、简单的网络连接,可以帮助用户保护其在线隐私、提高网络安全性、解除网络限制等。

IPsec 和 Open微皮恩等大多数其他解决方案是几十年前开发的。安全研究人员和内核开发人员 Jason Donenfeld 意识到它们速度慢且难以正确配置和管理。

这让他创建了一个新的开源 微皮恩协议和解决方案,它更加快速、安全、易于部署和管理。

WireGuard 最初是为 Linux 开发的,但现在可用于 Windows、macOS、BSD、iOS 和 Android。它仍在活跃开发中。

除了可以跨平台之外,WireGuard 的最大优点之一就是易于部署。配置和部署 WireGuard 就像配置和使用 SSH 一样容易。

一、服务器配置

安装wireguard软件

sudo apt update && sudo apt install wireguard

目前 WireGuard 已经被合并到 Linux 5.6 内核中了,如果你的内核版本 >= 5.6,就可以用上原生的 WireGuard 了,只需要安装 wireguard-tools 即可,内核版本<5.6,可能需要首先更新内核,否则可能会报错:Unable to access interface: Protocol not supported

生成私钥公钥

wg genkey | sudo tee /etc/wireguard/privatekey-wg0 | wg pubkey | sudo tee /etc/wireguard/publickey-wg0

生成的密钥保存在/etc/wireguard/privatekey-wg0/etc/wireguard/publickey-wg0

配置服务器参数

#创建,编辑配置文件
sudo touch /etc/wireguard/wg0.conf
sudo nano /etc/wireguard/wg0.conf

粘贴如下:

[Interface]
Address = 10.100.1.1/24
SaveConfig = true
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51800
PrivateKey = SERVER_PRIVATE_KEY  #服务器端生成的私钥

使用/etc/wireguard/privatekey-wg0中的值替换SERVER_PRIVATE_KEY

使用如下命令获取网卡名称,替换eth0

ip -o -4 route show to default | awk '{print $5}'

如果希望这个客户端只能访问内网,则设置如下,丢弃所有非10.100.1.0网段的请求

PostUp = iptables -A FORWARD -p all -i wg0 ! -d 10.100.1.0/24 -j DROP
PostDown = iptables -D FORWARD -p all -i wg0 ! -d 10.100.1.0/24 -j DROP

如果想要配置多个端口服务,可生成如/etc/wireguard/privatekey-wg1/etc/wireguard/publickey-wg1的密钥,增加wg1.conf后按照原流程即可。

配置服务器sysctl参数

如果要正常使用wg0的转发,需要启用电脑的ip转发,使用你喜欢的编辑器打开文件/etc/sysctl.conf

添加或者取消注释行net.ipv4.ip_forward=1

使用sudo sysctl -p 应用修改

启动、停止服务端

#启动服务端
$ sudo wg-quick up wg0## 输出如下
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.100.1.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 停止服务端
$ sudo wg-quick down wg0## 输出如下
[#] wg showconf wg0
[#] ip link delete dev wg0
[#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

校验服务端状态:

sudo wg
## 输出
interface: wg0public key: ********************private key: (hidden)listening port: 51800

二、用户端配置

安装wireguard软件

软件官方下载连接:www.wireguard.com

请添加图片描述

由于greatwall的存在,可以关注微信公众号:机器人梦想家下载。

请添加图片描述

windows 64位安装 *amd64.msi

windows 32位安装 *x86.msi

windows arm安装 *arm64.msi

安卓安装 *.apk

ubuntu或debian使用命令安装sudo apt-get install wireguard

生成私钥公钥

使用wiregurad的工具wg genkeywg pubkey生成公钥和私钥并保存在/etc/wireguard/目录。windows会自动生成,记下来即可。

wg genkey | sudo tee /etc/wireguard/privatekey-wg0 | wg pubkey | sudo tee /etc/wireguard/publickey-wg0

配置客户端参数

#创建,编辑配置文件
sudo touch /etc/wireguard/wg0.conf
sudo nano /etc/wireguard/wg0.conf

粘贴如下:

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY  #客户端生成的私钥
Address = 10.100.1.2/32 #改为想给本机分配的ip[Peer]
PublicKey = SERVER_PUBLIC_KEY  #服务器端生成的公钥
Endpoint = SERVER_IP_ADDRESS:51800  #服务器的公网IP和端口
AllowedIPs = 10.100.1.0/24	#这里是限制只有10.100.1 网段的请求走WireGuard,不影响其它应用上网,设为0.0.0.0/0则是所有请求均走WireGuard
PersistentKeepalive = 120	#握手时间,每隔120s ping一次客户端

替换其中的CLIENT_PRIVATE_KEYSERVER_PUBLIC_KEYSERVER_IP_ADDRESS,按照自己本地生成的配置

多台client注意修改Address为不同的ip地址。

启动、停止客户端

#启动客户端
$ sudo wg-quick up wg0## 输出如下
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.100.1.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 停止客户端
$ sudo wg-quick down wg0## 输出如下
[#] wg showconf wg0
[#] ip link delete dev wg0
[#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

配置服务开机启动

sudo systemctl enable wg-quick@wg0

可以通过下边指令检查服务运行状态:

sudo systemctl status wg-quick@wg0

三、服务器添加、删除客户

# 添加客户端
sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.100.1.2#删除客户端
sudo wg set wg0 peer CLIENT_PUBLIC_KEY remove

可以通过在服务器端运行sudo wg查看client状态

sudo wg
## 输出
interface: wg0public key: ***********************private key: (hidden)listening port: 51800peer: ***********************endpoint: *.*.*.*:36875allowed ips: 10.100.1.2/32latest handshake: 10 seconds agotransfer: 392 B received, 184 B sent

四、配置掉线自启动

配置掉线自启动脚本

掉线自启动一般只需要配置客户端

新建脚本,用于检测是否掉线

touch /home/dev/Documents/pingwireguard.sh
chmod +x /home/dev/Documents/pingwireguard.sh
vim /home/dev/Documents/pingwireguard.sh

粘贴如下:

#!/bin/sh
if ! ping -c 3 10.100.1.1 > /dev/null 2>&1 ;then
echo `date` " The network is down! Now try restarting wg0!\n" 
sudo systemctl restart wg-quick@wg0.service
else
echo `date` "Wireguard network is alive.\n"
fi

配置定时程序

这里使用crontab定时呼叫校验脚本

$ crontab -e

每隔10min执行一遍校验网络是否通畅,增加条如下:

*/10 * * * *  /home/dev/Documents/pingwireguard.sh 

配置脚本sudo免密执行权限

sudo visudo
## 增加如下,dev是你本地运行crontab的用户名
%dev ALL=(ALL:ALL) NOPASSWD :/bin/systemctl restart wg-quick@wg0.service

请注意用户是否有执行root的权限,若没有同时增加如下这句

sudo visudo#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"# Host alias specification# User alias specification# Cmnd alias specification# User privilege specification
root    ALL=(ALL:ALL) ALL
## 为你的用户增加sudo权限, 注意dev修改为你本地运行crontab的用户
dev     ALL=(ALL:ALL) ALL# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
## 增加如下, 注意dev修改为你本地运行crontab的用户名
%dev ALL=(ALL:ALL) NOPASSWD :/bin/systemctl restart wg-quick@wg0.service# See sudoers(5) for more information on "@include" directives:@includedir /etc/sudoers.d
admin ALL=(ALL)  NOPASSWD:ALL

结尾

至此结束所有的配置,本文参考大量的博客进行汇总,最终得到一套比较简单能够配置的方法可以应用于工程实际情况,希望能对大家起到一些帮助。

相关文章:

debian/ubuntu/windows配置wiregurad内网服务器(包含掉线自启动)

文章目录 前言一、服务器配置安装wireguard软件生成私钥公钥配置服务器参数配置服务器sysctl参数启动、停止服务端 二、用户端配置安装wireguard软件生成私钥公钥配置客户端参数启动、停止客户端配置服务开机启动 三、服务器添加、删除客户四、配置掉线自启动配置掉线自启动脚本…...

LeetCode146.LRU缓存

写了一个小时&#xff0c;终于把示例跑过了&#xff0c;没想到啊提交之后第19/22个测试用例没过 我把测试用例的输出复制在word上看看和我的有什么不同&#xff0c;没想到有18页的word&#xff0c;然后我一直检查终于找出了问题&#xff0c;而且这个bug真的太活该了&#xff0c…...

5-7 使用函数求余弦函数的近似

实现一个函数&#xff0c;用下列公式求cos(x)的近似值&#xff0c;精确到最后一项的绝对值小于e&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬…...

Kotlin HashMap entries.filter过滤forEach

Kotlin HashMap entries.filter过滤forEach fun main(args: Array<String>) {val hashMap HashMap<String, Int>()hashMap["a"] 1hashMap["b"] 2hashMap["c"] 3println(hashMap)hashMap.entries.filter {println("filter $…...

css的预处理

CSS的预处理器是一种CSS的扩展&#xff0c;可以让开发者使用更加高效、灵活的方式来编写CSS代码。 常用的CSS预处理器包括&#xff1a; Sass&#xff1a;基于Ruby的CSS预处理器&#xff0c;提供了大量的函数和变量等扩展功能。 Less&#xff1a;基于JavaScript的CSS预处理器&…...

[云原生案例2.2 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】网络插件部分

文章目录 1. Kubernetes的网络类别2. Kubernetes的接口类型3. CNI网络插件 ---- Flannel的介绍及部署3.1 简介3.2 flannel的三种模式3.3 flannel的UDP模式工作原理3.4 flannel的VXLAN模式工作原理3.5 Flannel CNI 网络插件部署3.5.1 上传flannel镜像文件和插件包到node节点3.5.…...

Go开发基础环境搭建

前面&#xff0c;我们写了下关于GO的入门简介&#xff0c;今天我们打算实操&#xff0c;在实操之前需要准备下基础环境。 IDE开发工具 GoLand 是一款由捷克软件开发公司 JetBrains 专为 Go 开发的跨平台商业 IDE。Goland 具有 Strong Code Insight、Navigation & Search、…...

Vue简单使用Echart图表柱形图 vue使用柱形图 vue使用 echart图表柱形图 vue使用柱形图

Vue简单使用Echart图表柱形图 vue使用柱形图 vue使用 echart图表柱形图 vue使用柱形图 1、安装依赖2、页面Demo使用3、效果图 1、安装依赖 官方文档&#xff1a;https://echarts.apache.org/zh/option.html#title 官方在线示例&#xff1a;https://echarts.apache.org/exampl…...

centos 7.9系统安装老版本jenkins,并解决插件问题

1.初衷 因为jenkins随着时间推移&#xff0c;其版本也越来越新&#xff0c;支持它运行的JDK也越来越新。基于不折腾的目标&#xff0c;我们安装一个老的固定版本就行。以前安装新版本&#xff0c;经常碰到的问题就是插件安装不兼容的问题。现在这个问题&#xff0c;可以把以前…...

BMVC 23丨多模态CLIP:用于3D场景问答任务的对比视觉语言预训练

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2306.02329 摘要&#xff1a; 训练模型将常识性语言知识和视觉概念从 2D 图像应用到 3D 场景理解是研究人员最近才开始探索的一个有前景的方向。然而&#xff0c…...

《嵌入式虚拟化技术与应用》:深入浅出阐述嵌入式虚拟机原理,实现“小而能”嵌入式虚拟机!

目录 关于博主前言专家推荐本书适合谁&#xff1f;内容简介书本目录权威作者团队其他 关于博主 &#x1f680;Python爬虫项目实战系列文章&#xff01;&#xff01; ⭐⭐欢迎订阅⭐⭐ 【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码&#xff08;过Authorization认…...

【Java开发】之获取客户端真实 IP 地址

一、应用场景 在投票系统开发中&#xff0c;为了防止刷票&#xff0c;我们需要限制每个 IP 地址只能投票一次&#xff1b;当网站受到诸如 DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务攻击&#xff09;等攻击时&#xff0c;我们需要快速定位攻击者…...

Linux RPM包安装、卸载和升级

我们以安装 apache 程序为例。因为后续章节还会介绍使用源码包的方式安装 apache 程序&#xff0c;读者可以直观地感受到源码包和 RPM 包的区别。 RPM包默认安装路径 通常情况下&#xff0c;RPM 包采用系统默认的安装路径&#xff0c;所有安装文件会按照类别分散安装到表 1 所…...

ROS 多级tf坐标转换

题目 现有一移动机器人&#xff0c;该机器人的基坐标系为“base_link”&#xff0c;机器人包含3个子坐标系分别为“joint1”&#xff0c;“joint2”&#xff0c;“joint3”。 要求&#xff1a;利用多坐标转换&#xff0c;实现joint1下的坐标向joint2下的坐标转换&#xff0c;…...

ceph rados对象存储索引残留问题排查与处理

问题现象 对象存储存储桶无法删除&#xff0c;检查发现生命周期过期后存储桶中有文件残留&#xff0c;未完全删除&#xff0c;但实际访问文件时为404&#xff0c;通过s3cmd无法删除对象&#xff0c;且无报错。 问题定位 检查bucket当前状态&#xff0c;发现桶内有大量object…...

十年测试工龄,揭露软件测试痛点以及分析

做软件测试的同学们&#xff0c;你在平时的测试工作中有哪些困惑或困扰呢&#xff1f;你可以自行简单思考一下。下面我梳理一下&#xff0c;大家可以看看自己是不是也有如此的感受。 从测试整体角度分析&#xff1a; 第一个痛点是入门容易深入难。 很多人认为软件测试也就那么…...

【星海出品】flask(三) 组件

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架 wsgiref 因为我们不希望接触到TCP连接、HTTP原始请求和响应格式&#xff0c;所以&#xff0c;需要一个统一的接口协议来实现这样的服务器软件&#xff0c;让我们专心用Python编写Web业务。 这个…...

关于卷积神经网络的池化层(pooling)

了解池化层 池化层又称“下采样层”或“子采样层”&#xff0c;池化层可以大大降低特征的维度&#xff0c;减少计算量&#xff0c;同时可以避免过拟合问题。 顾名思义&#xff0c;最大池化层就是从输入的矩阵中某一范围内&#xff0c;选择最大的元素进行保留&#xff1b;平均池…...

GNU链接脚本详解

0. 前言 每一个链接都是由链接脚本控制的&#xff0c;链接脚本是用链接命令语言编写的脚本。链接都会用到一个链接脚本&#xff0c;如果你没有指定自己的脚本&#xff0c;就会使用默认的链接脚本。可以用 "--verbose" 命令行选项显示默认的连接脚本。指定命令行参数…...

酷柚易汛ERP-账户管理操作指南

1、应用场景 对账户进行管理&#xff0c;可设置账户当前余额、期初余额和设置是否为默认账户。 2、主要操作 2.1 新增支付账户 打开【资料】-【账款管理】&#xff0c;点击【新增】添加账户类别&#xff0c;输入相关信息并保存&#xff0c;账户编号和名称为必录项。&#x…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...