Administrator
Published on 2024-11-17 / 85 Visits
0
0

openvpn交叉编译

首先从六个方面介绍一下openvpn

OpenVPN 是一个开源的 VPN(虚拟私人网络)解决方案,用于安全地连接网络。它使用标准的 VPN 协议(如 SSL/TLS)来创建加密的隧道,使数据能够在公共网络上安全传输。下面是 OpenVPN 的基本原理和工作流程:

  • 加密和认证

OpenVPN 使用 SSL/TLS 协议来提供加密和认证。SSL/TLS 是一种安全协议,最初用于保护 Web 流量,但 OpenVPN 将其扩展到 VPN 使用。

在连接建立过程中,OpenVPN 会使用公钥加密和对称加密技术来确保数据的安全性。它首先使用公钥加密来进行身份验证,然后在建立连接后,使用对称加密来加密数据流。

  • 隧道建立

当客户端和服务器建立连接时,OpenVPN 会创建一个虚拟的网络接口(TUN/TAP 设备)。这两个设备用于在客户端和服务器之间传输数据包。

TUN 设备用于处理点对点的 IP 数据包(第3层),而 TAP 设备用于处理以太网帧(第2层)。选择哪种设备取决于 VPN 配置和需求。

  • 配置和连接

OpenVPN 使用配置文件来指定如何建立和管理连接。配置文件定义了加密设置、认证方式、网络设置等。

客户端和服务器的配置文件会包括对方的 IP 地址或域名、证书、密钥文件等信息。

  • 身份验证

在连接建立时,OpenVPN 会使用证书和密钥对客户端和服务器进行身份验证。这样可以确保连接的安全性,防止未经授权的访问。

OpenVPN 支持多种认证方式,包括基于证书的认证和基于用户名/密码的认证。

  • 数据传输

一旦连接建立并经过认证,OpenVPN 就会在客户端和服务器之间创建一个加密的隧道。所有经过这个隧道的数据都会被加密和解密,从而保护数据不被第三方窃取或篡改。

数据包通过 TUN/TAP 设备在客户端和服务器之间传输,然后通过加密隧道进行保护。

  • 网络访问

通过 OpenVPN 建立的 VPN 连接可以使客户端访问服务器端网络上的资源。根据配置,客户端可以被分配到特定的虚拟 IP 地址,使其在服务器端网络上表现得像是一个本地客户端。

 

openvpn的应用场景之一

以下是一个系统架构图 左边部分是老年人的家,里面有很多的传感器设备和门口机设备等,其中Blood glucose monitor(血糖监测器)、Loud speaker(扬声器)以及Blood pressures reader(血压计)与家中的室内监控器相连也通过SIP/VPN的网络通信协议与下图右边部分的服务中心相连接。这个系统的主要目的是通过各种传感器和设备来监控老年人的健康状况和生活环境,确保他们的安全,并在紧急情况下提供及时的帮助。在这样一个场景里面,openvpn所起的作用就是提供了一个安全、可靠的数据传输通道,确保了家庭监控系统的数据安全和隐私保护,将服务中心和家中设备看作是一个局域网,家中的设备可以远程与服务中心的IP视频电话进行通信。

 

下面是一张VPN(虚拟私人网络)技术的网络通信过程

A 主机和 B 主机通过 VPN 连接进行通信,就像它们直接连接到同一个局域网上一样

  • 主机和应用层

A 主机和 B 主机上的应用程序(APP)需要进行通信。这些应用程序运行在 TCP/IP 协议栈的顶端,依赖于下层协议来完成数据的发送和接收。

  • VPN 连接建立

用户在 A 主机上启动一个 VPN 客户端,该客户端会与 B 主机所在网络的 VPN 服务器建立一个加密的通信隧道。

  • TCP/IP 协议栈

在 A 主机和 B 主机上,数据包都会通过各自的 TCP/IP 协议栈。TCP/IP 协议栈是互联网通信的基础,包括应用层、传输层、网络层、数据链路层等。

  • TUN/TAP 设备

VPN 连接通常使用 TUN/TAP 设备来在网络层和数据链路层之间创建虚拟网络接口。TUN 是一种网络层设备,可以处理 IP 数据包;TAP 是数据链路层设备,可以处理以太网帧。

在 A 主机上,VPN 客户端会创建一个 TUN 设备,将 IP 数据包发送到这个设备,然后 TUN 设备将这些数据包封装成可在 Internet 上传输的格式。

  • 数据封装

当 A 主机上的应用程序生成数据并发送到网络时,数据首先到达 TUN 设备。VPN 客户端将这些数据封装成 VPN 协议的数据包,通常是通过添加新的头部信息来实现。

  • 通过 Internet 传输

加密后的数据包通过 Internet 发送到 VPN 服务器,然后 VPN 服务器将数据包发送到 B 主机所在网络的 VPN 服务器或直接发送到 B 主机。

  • 解密和解封装

数据包到达 B 主机的 VPN 客户端后,会被解密并去除 VPN 协议头部,恢复成原始的 IP 数据包。

B 主机上的应用程序接收到数据后,通信过程完成。

 

以下图片同样解释了OpenVPN通信流程

  1. 启动OpenVPN: 用户启动OpenVPN客户端,准备建立VPN连接。

  2. 建立Socket连接: OpenVPN利用Socket通信机制与VPN服务器建立一个安全的连接。Socket是网络通信的基础,允许数据在应用程序之间传输。

  3. 数据写入: 当用户的数据需要发送时,OpenVPN将数据写入(write)到Socket,准备通过网络发送。

  4. 字符驱动处理: 数据通过字符设备驱动程序进一步处理。字符驱动通常处理字符数据流,这里可能涉及到将数据转换或封装成适合网络传输的格式。

  5. 数据封装: 在数据发送前,需要进行封装,这可能包括添加协议头、加密等,以确保数据在传输过程中的安全性和完整性。

  6. TCP/IP协议栈处理: 封装后的数据包通过TCP/IP协议栈进行处理。协议栈负责将数据包按照网络协议进行路由和传输。

  7. TUN/TAP虚拟网卡: 数据包到达虚拟网卡,TUN/TAP设备在这里充当虚拟网络接口,将虚拟网络流量与物理网络流量进行转换。

  8. 物理网卡传输: 虚拟网卡将处理好的数据包发送到物理网卡,物理网卡再将数据包发送到网络中,开始其在网络中的旅程。

  9. 接收端处理: 数据包到达接收端后,会经过相反的过程。首先由物理网卡接收,然后通过TUN/TAP虚拟网卡,再由TCP/IP协议栈进行处理。

  10. 数据提取: 在接收端,字符驱动读取(read)数据,进行必要的解码和解密,以恢复原始数据。

  11. 数据使用: 最终,接收到的数据被传递给应用程序,供用户使用。

成功搭建openvpn我用到了openssl1.1.1t版本,openvpn2.5.10版本,ubuntu20.04虚拟机,制作客户端和服务端证书的工具Easy-RSA,交叉编译工具mips-gcc472-glibc216-64bit.tar(本文以交叉编译到mips32架构的设备上为例),还有一个会思考的脑子

  • openssl1.1.1t

可以在ubuntu系统中通过wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1t.tar.gz命令下载到本地,然后使用tar -xzvf openssl-1.1.1t.tar.gz命令解压

  • openvpn2.5.10

可以在ubuntu系统中通过wget https://swupdate.openvpn.org/community/releases/openvpn-2.5.10.tar.gz命令下载到本地,然后使用tar -xzvf openvpn-2.5.10.tar.gz命令解压

  • Easy-RSA

可以在ubuntu系统中通过sudo apt install openvpn easy-rsa命令进行安装,默认安装在/usr/share/easy-rsa目录下

  • 交叉编译工具mips-gcc472-glibc216-64bit.tar(我是要把openvpn客户端最终要放在mips32架构的嵌入式设备上运行所以才用到这个,如果您只需将客户端安装在ubuntu系统则跳过该项)

在使用这个交叉编译工具之前,请先修改 ~/.bashrc文件(可以用这个命令sudo vim ~/.bashrc),按下键盘上的字母i进入编辑模式,在该文件最后一行增加这句话

export PATH=$PATH:/opt/mips-gcc472-glibc216-64bit/bin (冒号后的路径根据自己情况来定,我把交叉编译工具解压到opt目录下了),添加完按键盘Esc退出编辑模式然后输入(:wq)保存  然后在命令行中输入source ~/.bashrc来更新环境变量

 

使用Easy-RSA创建客户端和服务端的密钥和证书

Easy-RSA 是一种公钥基础设施 (PKI) 管理工具,用于在OpenVPN 服务器上生成证书请求。然后在 CA 服务器上验证和签名。在这里我们的 OpenVPN 服务器和CA服务器为同一个 Ubuntu 服务器

OpenVPN 的证书分为三部分:CA证书、Server端证书、Client端证书

 

Easy-RSA的配置文件是vars

作用:

定义证书参数:

vars 文件包含了生成证书时所用的各种默认值,例如证书的有效期、证书颁发机构(CA)的名称、组织信息等。这些参数会被 Easy-RSA 脚本用来自动填充证书请求和生成证书文件。

设置环境变量:

文件中定义的环境变量会影响 Easy-RSA 脚本的行为。例如,设置证书有效期、密钥长度、默认的国家和组织信息等。这些设置可以确保在生成证书时使用一致的配置。

简化证书生成过程:

通过预定义的变量和参数,vars 文件可以大大简化证书生成过程,避免在每次生成证书时都需要手动输入相同的信息。

Easy-RSA的使用方法(先使用cd命令进入easy-rsa的安装目录 一般为/usr/share/easy-rsa)

./easyrsa init-pki生成一个名为 pki 的子目录。这个目录将用来存储所有的证书、密钥和其他 PKI 相关文件

./easyrsa build-ca nopass ca.crt 包含 CA 的公钥,用于验证服务器和客户端证书的有效性。客户端会使用此证书来验证服务器的身份。

./easyrsa build-server-full server nopass 用来制作Server端证书

./easyrsa build-client-full client nopass 用来制作client端证书

./easyrsa gen-dh 用来生成迪菲·赫尔曼密钥

 

在 Easy-RSA 和 OpenVPN 等 VPN 配置中,dh.pem 文件包含了 Diffie-Hellman 参数,这些参数用于执行 Diffie-Hellman 密钥交换协议。dh.pem 文件通常包括一个长整数,代表了协议中的大质数和生成元(base)。这个文件的存在使得服务器能够与客户端进行安全的密钥交换,生成一个会话密钥来加密实际的数据传输。

在 OpenVPN 服务器配置中,dh.pem 文件用于配置服务器与客户端之间的加密通信。服务器会使用这个文件中的参数来生成会话密钥,客户端也会使用相同的参数来生成相同的密钥。

 

制作好的ca.crt和dh.pem在/usr/share/easy-rsa/pki目录下

服务器证书server.crt,client.crt在/usr/share/easy-rsa/pki/issued目录下

ca.key、server.key和client.key在/usr/share/easy-rsa/pki/private目录下

 

———————————————-分割线————————————————–

这里稍微对客户端配置做个解释

client:

这是 OpenVPN 配置文件的一个基本指令,用于指定这是一个客户端配置文件。它告诉 OpenVPN 该配置是用于客户端而不是服务器。

dev tun:

指定使用 TUN 设备。TUN 设备用于处理 IP 数据包,创建一个点对点的虚拟网络接口。TUN 设备将虚拟网络接口的 IP 数据包封装到加密隧道中,进行数据传输。

proto tcp:

指定 VPN 连接使用 TCP(传输控制协议)进行数据传输。TCP 是一种可靠的协议,它确保数据包的顺序和完整性,但可能会带来额外的延迟。如果使用 udp,则使用 UDP(用户数据报协议),它更快但不保证数据包的顺序和完整性。

remote x.x.x.x 1194:

指定 OpenVPN 服务器的 IP 地址和端口号。x.x.x.x 是服务器的 IP 地址,1194 是服务器监听的端口号。客户端将尝试连接到这个 IP 地址和端口以建立 VPN 连接。

resolv-retry infinite:

这个指令设置 DNS 解析的重试行为。infinite 表示客户端将无限期地重试解析远程服务器的地址,直到成功为止。这在网络不稳定或 DNS 服务器不可用时特别有用。

remote-cert-tls server:

指定客户端应该验证服务器的证书,并确保它是一个有效的服务器证书。这是一种额外的安全措施,确保客户端连接到合法的服务器,而不是伪装的服务器。server 参数告诉 OpenVPN 客户端检查服务器证书的类型。

nobind:

指定 OpenVPN 客户端在连接时不绑定到本地特定的端口。默认情况下,OpenVPN 客户端会绑定到一个端口以进行连接。nobind 参数允许客户端在连接时使用任何可用的端口,这样可以避免端口冲突问题。

persist-key:

指定 OpenVPN 在重新启动时保持当前的密钥文件。启用此选项后,OpenVPN 不会丢弃或重新加载密钥文件,这有助于在重新连接时保持相同的密钥状态,避免重新认证的过程。

persist-tun:

指定 OpenVPN 在重新启动时保持虚拟网络接口(TUN/TAP 设备)。启用此选项后,OpenVPN 会保留当前的网络接口配置,即使 VPN 连接中断或重新启动,也不会丢失接口的状态。这有助于减少因连接中断而导致的配置丢失问题。

 

—————————————-分割线—————————————-

这里稍微对服务端配置做个解释

port 1194

描述: 指定 OpenVPN 监听的端口号。

默认: 1194(通常是 OpenVPN 的默认端口)。

用途: 用于配置 OpenVPN 服务器的监听端口。确保防火墙允许此端口的流量。

proto tcp

描述: 指定 OpenVPN 使用 TCP 协议。

默认: UDP(通常是 OpenVPN 的默认协议)。

用途: TCP 提供更可靠的连接,但可能有更高的延迟。使用 proto udp 可以提高性能但不保证可靠性。

dev tun

描述: 使用 TUN 设备创建一个虚拟的 IP 隧道。

默认: 未设置,OpenVPN 将使用默认设备。

用途: TUN 设备用于点对点的 IP 隧道;如果需要以太网级别的桥接,则使用 dev tap。

client-to-client

描述: 允许客户端之间直接通信。

默认: 未启用,客户端只能与服务器通信。

用途: 启用此选项后,所有连接到服务器的客户端将能够相互通信。

ca /etc/openvpn/ca.crt

描述: 指定 CA 根证书文件的位置。

用途: 用于验证客户端和服务器证书的有效性。

cert /etc/openvpn/server.crt

描述: 指定服务器证书文件的位置。

用途: 用于服务器身份验证。

key /etc/openvpn/server.key

描述: 指定服务器私钥文件的位置。

用途: 服务器用于加密和解密数据的私钥,必须保密。

dh /etc/openvpn/dh.pem

描述: 指定 Diffie-Hellman 参数文件的位置。

用途: 用于建立加密密钥交换的安全参数。

topology subnet

描述: 指定网络拓扑为子网模式。

用途: 用于设置 VPN 网络的 IP 地址分配方式。subnet 是推荐模式,net30 是旧的,现已不推荐。

server 10.8.0.0 255.255.255.0

描述: 配置 OpenVPN 服务器的虚拟 IP 地址池。

用途: 分配给客户端的 IP 地址范围。服务器将使用 10.8.0.1,其余地址分配给客户端。

ifconfig-pool-persist /var/log/openvpn/ipp.txt

描述: 保存客户端的虚拟 IP 地址与实际 IP 地址的映射。

用途: 保持客户端的 IP 地址一致性,即使在服务器重启后。

server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

描述: 配置 OpenVPN 进行以太网桥接模式。

用途: 用于桥接 TAP 设备与以太网接口,以允许 VPN 客户端与 LAN 网络设备通信。

push “route 10.8.0.0 255.255.255.0”

描述: 向客户端推送路由信息。

用途: 告诉客户端将虚拟网络 10.8.0.0/24 的流量通过 VPN 发送。

client-config-dir ccd

描述: 指定客户端特定配置的目录。

用途: 允许为每个客户端配置特定的设置,例如固定 IP 地址或路由。

push “redirect-gateway def1 bypass-dhcp”

描述: 强制客户端将其默认网关通过 VPN 发送。

用途: 使所有流量(如 Web 浏览、DNS 查询)都通过 VPN 发送。需要服务器进行 NAT 或桥接。

push “dhcp-option DNS 8.8.8.8”

描述: 向客户端推送 DNS 服务器选项。

用途: 指定客户端使用的 DNS 服务器。8.8.8.8 和 8.8.4.4 是 Google 的公共 DNS 服务器。

client-to-client

描述: 允许客户端之间直接通信。

用途: 启用客户端间的互联。

duplicate-cn

描述: 允许多个客户端使用相同的证书。

用途: 主要用于测试环境,每个客户端应有唯一的证书用于生产环境。

keepalive 10 120

描述: 配置服务器和客户端之间的心跳检测。

用途: 发送 ping 消息以检测连接状态。如果 120 秒内没有收到 ping,连接将被认为已断开。

tls-auth ta.key 0

描述: 启用 HMAC 认证以增加额外的安全层。

用途: 防止 DoS 攻击和 UDP 端口洪水攻击。0 表示服务器端,客户端配置中应使用 1。

data-ciphers AES-256-GCM:AES-128-GCM

描述: 配置数据加密算法。

用途: 指定加密算法的优先顺序,AES-256-GCM 和 AES-128-GCM 是安全的加密算法。

compress lz4-v2

描述: 启用数据压缩(可选)。

用途: 减少通过 VPN 传输的数据量,但可能对某些版本的 OpenVPN 不兼容。

persist-key

描述: 在重新启动时保持密钥文件。

用途: 防止密钥文件丢失,确保重新连接时的密钥保持一致。

persist-tun

描述: 在重新启动时保持虚拟网络接口。

用途: 避免重新启动时丢失 TUN/TAP 设备配置。

status /var/log/openvpn/openvpn-status.log

描述: 指定状态文件的路径。

用途: 输出当前连接状态的日志文件。

log-append /var/log/openvpn/openvpn.log

描述: 指定日志文件的路径并选择追加模式。

用途: 记录 OpenVPN 的活动日志,以便查看和调试。

verb 5

描述: 设置日志详细级别。

用途: 详细的日志信息,适用于调试问题。5 是一个合理的级别,提供足够的详细信息而不会过于冗长。

mute 20

描述: 限制重复日志消息的输出数量。

用途: 防止日志文件中出现大量重复的相同消息。

explicit-exit-notify 1

描述: 在服务器重启时通知客户端。

用途: 当服务器重新启动时,客户端将收到通知以便重新连接。

 

参考文章:

https://blog.csdn.net/m0_56015193/article/details/134590283?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172241329216800180677457%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172241329216800180677457&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-134590283-null-null.142^v100^pc_search_result_base4&utm_term=openvpn%20ubuntu&spm=1018.2226.3001.4187

https://blog.csdn.net/iriczhao/article/details/126149918?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172249397316800180620891%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172249397316800180620891&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-126149918-null-null.142^v100^pc_search_result_base5&utm_term=ubuntu%20nfs&spm=1018.2226.3001.4187


Comment