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整合Redis注解实现增删改查功能(Redis注解使用)

《SpringBoot整合Redis注解实现增删改查功能(Redis注解使用)》文章介绍了如何使用SpringBoot整合Redis注解实现增删改查功能,包括配置、实体类、Repository、Se... 目录配置Redis连接定义实体类创建Repository接口增删改查操作示例插入数据查询数据删除数据更

Java Lettuce 客户端入门到生产的实现步骤

《JavaLettuce客户端入门到生产的实现步骤》本文主要介绍了JavaLettuce客户端入门到生产的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录1 安装依赖MavenGradle2 最小化连接示例3 核心特性速览4 生产环境配置建议5 常见问题

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf

Java 的ArrayList集合底层实现与最佳实践

《Java的ArrayList集合底层实现与最佳实践》本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、... 目录1. 核心概念与底层实现1.1 ArrayList 的本质1.1.1 底层数据结构JDK 1.7

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符