OpenVPN+花生壳实现设备远程访问

2024-03-03 16:30

本文主要是介绍OpenVPN+花生壳实现设备远程访问,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 方案原理
  • 实施步骤
    • 1、花生壳配置
      • 1.1、树莓派安装花生壳
      • 1.2、注册花生壳账户并登录
      • 1.3、花生壳管理平台添加设备
      • 1.4、花生壳管理平台配置内网穿透
    • 2、VPN服务端配置
      • 2.1、安装OpenVPN和证书生成工具
      • 2.2、制作证书
      • 2.3、创建服务端配置文件
    • 3、VPN客户端配置
      • 3.1、安装OpenVPN
      • 3.2、从服务端下载客户端所需证书
      • 3.3、创建客户端配置文件
    • 4、开启VPN服务端
    • 5、开启VPN客户端
      • 5.1、Linux系统
      • 5.2、Windows系统
    • 6、虚拟局域网连通性测试
    • 7、自动化配置
      • 7.1、树莓派开机自启phddns
      • 7.2、树莓派开机自动拨号、邮件上报IP并开启VPN服务端

前言

虚拟专用网(Virtual Private Network,简称VPN),能够在地理位置较远并且处于不同运营商网络下的两个设备之间,跨越公网搭建专用的虚拟局域网络,实现两设备的远程访问。
但前提是至少有一个设备拥有公网IP。只有基于公网IP搭建VPN服务端后,另一个设备的VPN客户端才能访问到公网VPN服务端,从而在客户端与服务端之间搭建虚拟网络。
然而大部分网络运营商只给拨号用户提供二级IP地址,也就是说设备持有的只是一个私网IP。针对这种情况有一种方法是购买公网云服务器,在云服务器上部署VPN服务端,然后两个设备作为VPN客户端统一连接到公网VPN服务端,建立虚拟局域网。
本文借助花生壳的内网穿透功能提供另一种方案,使用花生壳和开源的OpenVPN,无需购买云服务器就能便捷实现设备的远程访问。

方案原理

在这里插入图片描述
方案原理如图所示。在本文中以树莓派和PC为例,其中树莓派集成5G模组且插有SIM卡,通过移动网络运营商接入互联网;PC通过校园网接入互联网。虽然两设备都能访问到互联网,但都是私网IP无法直接互通。
因此借助花生壳提供的内网穿透功能,在树莓派安装VPN服务端后,将树莓派私网IP+VPN服务端口映射到花生壳提供的公网域名+端口上。这样PC上的VPN客户端就能通过公网域名+端口访问到树莓派VPN服务端,从而建立虚拟网络隧道,实现PC对树莓派的远程访问。

实施步骤

1、花生壳配置

1.1、树莓派安装花生壳

进入下载地址,下滑找到树莓派版本下载。

https://hsk.oray.com/download

将下载好的deb安装包上传到树莓派,并安装。

dpkg -i phddns_5.1.0_rapi_aarch64.deb

安装成功后,会显示设备SN码,默认密码以及远程管理地址。
在这里插入图片描述

1.2、注册花生壳账户并登录

1.3、花生壳管理平台添加设备

进入花生壳管理平台,在左侧菜单栏选择"设备列表",填写设备SN码、默认密码添加设备。

1.4、花生壳管理平台配置内网穿透

在花生壳管理平台左侧菜单栏选择"内网穿透",点击添加映射。
花生壳免费提供两条映射,这里使用一条用于配置VPN服务映射。
如下图,映射类型选择TCP,TCP类型选择普通TCP,外网域名选默认域名,外网端口选择动态端口即可,内网主机填写运营商给树莓派分配的IP,内网端口填写1194(OpenVPN服务端口),其余默认即可。
在这里插入图片描述
完成后点击确认,然后可在“内网穿透”页面中,点击刚才新建的映射后面的“诊断”选项,检查花生壳内网穿透映射配置是否正确。
如果有问题,检查树莓派是否已接入互联网,运营商是否有给树莓派分配IP,以及映射配置信息填写是否正确。
在这里插入图片描述
上图中外网地址47xxxx.fun就是后续vpn客户端访问树莓派vpn服务端使用的地址,47557是端口号。

2、VPN服务端配置

2.1、安装OpenVPN和证书生成工具

apt install -y openvpn
apt install -y easy-rsa

2.2、制作证书

安装后,将easy-rsa文件夹复制到openvpn路径下,并进入easy-rsa文件夹。

cp -r /usr/share/easy-rsa/ /etc/openvpn/
cd /etc/openvpn/easy-rsa/

在当前路径初始化pki目录,之后生成的证书文件都会存放在pki目录下。

./easyrsa init-pki

创建根证书,后面给Server端、Client端证书签名时使用,nopass表示不加密,提示“Common Name (eg: your user, host, or server name) [Easy-RSA CA]:”可输入自定义证书名,直接回车表示使用默认证书名。

./easyrsa build-ca nopass

完成后在/etc/openvpn/easy-rsa/pki/路径下生成根证书ca.crt

创建服务端证书,server111是自定义的服务端名称,遇到“Common Name (eg: your user, host, or server name) [server111]:”回车即可。

./easyrsa gen-req server111 nopass

给服务端证书签名,中间遇到“ Confirm request details:”输入yes。

./easyrsa sign-req server server111

完成后在/etc/openvpn/easy-rsa/pki/issued/路径下生成服务端证书server111.crt,在/etc/openvpn/easy-rsa/pki/private/路径下生成服务端密钥server111.key

创建客户端证书,client1为自定义的客户端名称,执行过程中间回车即可。

./easyrsa gen-req client1 nopass

给客户端证书签名,中间遇到“ Confirm request details:”输入yes。

./easyrsa sign-req client client1

完成后在/etc/openvpn/easy-rsa/pki/issued/路径下生成客户端证书client1.crt,在/etc/openvpn/easy-rsa/pki/private/路径下生成客户端密钥client1.key

Diffie-Hellman

./easyrsa gen-dh

完成后在/etc/openvpn/easy-rsa/pki/路径下生成认证算法dh.pem

TLS认证密钥

openvpn --genkey --secret ta.key

完成后在/etc/openvpn/easy-rsa/路径下生成ta.key

将所有证书、密钥文件汇总到同一文件夹下。

mkdir /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/pki/issued/server111.crt /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/pki/private/server111.key /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/pki/issued/client1.crt /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/pki/private/client1.key /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/ta.key /etc/openvpn/keys

2.3、创建服务端配置文件

因为需要在配置文件中指定服务端使用的证书和密钥文件的路径,所以直接在存放证书和密钥的文件夹下创建服务端配置文件,配置文件会在同级路径下搜索,这样文件中直接写需要使用的证书和密钥的文件名即可。

cd /etc/openvpn/keys/
touch server.conf

将以下内容复制到server.conf中。

port 1194
proto tcp
dev tunca ca.crt
cert server111.crt
key server111.key 
dh dh.pem
tls-auth ta.key server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
keepalive 10 120
cipher AES-256-CBC
persist-key
persist-tunstatus /var/log/openvpn/openvpn-status.log
log-append  /var/log/openvpn/openvpn.log
verb 3

3、VPN客户端配置

3.1、安装OpenVPN

Linux系统

apt install -y openvpn

Windows系统

https://openvpn.net/community-downloads/

3.2、从服务端下载客户端所需证书

将以下文件复制过来
ca.crt
ta.key
client1.crt
client1.key
Linux系统复制到/etc/openvpn/下。
Windows系统复制到openvpn安装路径的config文件夹下。

3.3、创建客户端配置文件

Linux系统中,在/etc/openvpn/下创建client1.ovpn文件。

cd /etc/openvpn/
touch client1.ovpn

Windows系统中,在openvpn安装路径的config文件夹下创建client1.ovpn文件。

将以下内容复制到client1.ovpn,其中带注释内容需根据实际情况修改。

client
dev tun
proto tcp# 花生壳内网穿透映射配置后提供的公网域名和端口
remote 47xxxx.fun 47557resolv-retry infinitenobind
persist-key
persist-tun# 证书和密钥文件绝对路径,例如:ca D:\\openvpn\\config\\ca.crt
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1key-direction 1
verb 5

4、开启VPN服务端

在树莓派进入server.conf所在路径,开启服务端。

openvpn --config server.conf &

打开日志显示,显示“Initialization Sequence Completed”即正常。

tail -f /var/log/openvpn/openvpn.log

服务端开启后,可查看服务端设备在虚拟局域网的IP,为10.8.0.1(可在server.conf修改)。

5、开启VPN客户端

5.1、Linux系统

进入client1.ovpn所在路径,开启客户端。

openvpn --config client.ovpn

成功连接服务端后,显示如下。
在这里插入图片描述
可查看客户端设备在虚拟机局域网中的IP为10.8.0.14,与服务端设备在同一网段。
在这里插入图片描述

5.2、Windows系统

打开openvpn后,在任务栏中找到openvpn图标,右键选择“选项”,打开如下界面,并选择“高级”,在“配置文件”处选择存放客户端相关文件的文件夹路径,点击确定。
在这里插入图片描述
再次双击任务栏中openvpn图标,开始连接服务端,图标中电脑屏幕变绿表示连接成功。
在这里插入图片描述
可查看客户端设备在虚拟机局域网中的IP为10.8.0.10,与服务端设备在同一网段。在这里插入图片描述

6、虚拟局域网连通性测试

在PC上ping 10.8.0.1,测试PC与树莓派间的虚拟网络是否互通。如果互通,就可使用10.8.0.1这是IP来访问树莓派中服务和资源,如ssh服务。
在这里插入图片描述
在这里插入图片描述

7、自动化配置

7.1、树莓派开机自启phddns

设置开机自启,树莓派开机后自动登录phddns客户端,连接花生壳服务器。

phddns enable

在这里插入图片描述
可在花生壳管理平台“设备列表”中,查看设备登录情况。
在这里插入图片描述

7.2、树莓派开机自动拨号、邮件上报IP并开启VPN服务端

树莓派开机接入运营商网络后,运营商会为树莓派动态分配IP,导致使用花生壳建立的内网穿透映射失效。
使用下面的shell脚本和python程序,实现树莓派开机自动拨号上网,并将获取到的IP通过邮件形式自动上报,然后开启VPN服务端。
shell脚本auto_email_ip.sh,注释内容根据实际情况修改。

#!/bin/bash
export PATH='/home/pi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/snap/bin'
# ethx是接入运营商网络使用的网卡
echo root | sudo -s udhcpc -i ethx
while true; do (echo `ip a show ethx |egrep '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\>' | awk '{print $2}'`)&& break;sleep 1;done;
# python程序路径
python3 /root/code/email_ip/email_ip.py 
openvpn --config /etc/openvpn/keys/server.conf &
# 此程序可以使用一个邮箱账户自己给自己发邮件,也就是说my_sender和my_user使用一个邮箱即可
# coding=utf-8
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import os
import time# RTCQDBHTITKEQAGN
#发送内容t
def mail(t):ret=Truetry:msg=MIMEText(t,'plain','utf-8')msg['From']=formataddr(["PI",my_sender])          # 括号里的对应发件人邮箱昵称、发件人邮箱账号msg['To']=formataddr(["Admin",my_user])              # 括号里的对应收件人邮箱昵称、收件人邮箱账号msg['Subject']="树莓派IP地址上报"                   # 邮件的主题,也可以说是标题server=smtplib.SMTP("smtp.163.com", 25)             # 发件人邮箱中的SMTP服务器,端口是25server.login(my_sender, my_pass)                    # 括号中对应的是发件人邮箱账号、邮箱密码server.sendmail(my_sender,[my_user,],msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件server.quit()  # 关闭连接except Exception:  # 如果 try 中的语句没有执行,则会执行下面的 ret=Falseret=Falsereturn retcmd='ip a show ethx |egrep \'\\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-9][0-9])\\>\' | awk \'{print $2}\''
t = "empty"
while t == "empty":with os.popen(cmd,"r") as p:t = p.read()if not t:t = "empty"time.sleep(5)# 设置发件人和收件人信息
my_sender='xxx@163.com'  # 自己的邮箱账号
my_pass = ''   			# 发件人邮箱授权码
my_user=my_sender    	# 自己的邮箱账号ret=mail(t)if ret:print("发送邮件成功")
else:print("发送邮件失败")

设置开机自动运行shell脚本。

crontab -e

在配置文件最后一行添加 @reboot /root/code/email_ip/auto_email_ip.sh
在这里插入图片描述
完成上述配置后,树莓派开机后会自动接入运营商网络,获取到IP后自动发邮件上报,并自动开启vpn服务。
用户只需要在花生壳管理平台中修改内网穿透映射配置中的树莓派内网IP,然后启动vpn客户端即可在PC和树莓派间建立连接。

这篇关于OpenVPN+花生壳实现设备远程访问的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库