OpenVPN Ubuntu

2024 年 10 月 9 日 | 阅读 11 分钟

什么是 OpenVPN?

OpenVPN 是一个 VPN 虚拟专用网络 系统,它实现多种技术,用于在桥接或路由的远程访问设施和配置中创建安全的站点到站点或点对点连接。它实现了服务器和客户端应用程序。

OpenVPN 允许对等方使用预共享的用户名/密码、证书或密钥对彼此进行身份验证。在多客户端服务器配置中使用时,它允许服务器为所有使用证书和签名机构的客户端发布一个身份验证证书。

它广泛使用 OpenSSL 的加密库、TLS 协议,并包含各种控制和安全功能。此外,它使用一种自定义安全协议,该协议使用 TLS/SSL 进行密钥交换。它可以穿越防火墙和网络地址转换。

OpenVPN 已嵌入并移植到许多系统。例如,DD-WRT 包含 OpenVPN 服务器功能,多协议 VPN 服务器,即 SoftEther VPN 也包括 OpenVPN 协议实现。

它是免费软件,由 James Yonan 定义,根据 GPLv2(GNU 通用公共许可证版本 2)条款发布。也提供商业许可证。

前提条件

我们将需要

  • 一台启用了防火墙和 sudo 非 root 用户的 Ubuntu 22.04 服务器版本。
  • 另一台独立的 Ubuntu 22.04 服务器版本,配置为独立的 CA(证书颁发机构)。

注意:虽然技术上可以使用我们的本地机器或 OpenVPN 服务器作为我们的 CA,但不建议这样做,因为它会使我们的 VPN 面临一些安全漏洞。我们应该将证书颁发机构放在一个独立的设备上,该设备专门用于导入和处理证书请求。

此外,我们还需要一个客户端设备,用于连接到我们的 OpenVPN 服务器。

注意:如果在配置这些服务器时禁用了密码身份验证,在它们之间传输文件时可能会遇到困难。要解决此问题,我们可以重新启用所有服务器上的密码身份验证。我们可以为所有服务器生成一个 SSH 密钥对,将 OpenVPN 服务器的公共 SSH 密钥添加到 CA 机器的 authorized_keys 文件中,反之亦然。

OpenVPN 架构

OpenVPN Ubuntu

加密

OpenVPN 使用 OpenSSL 库来提供控制通道和数据通道的加密。它允许 OpenSSL 执行所有身份验证和加密工作,从而使 OpenVPN 可以使用 OpenSSL 包中的所有密码。

此外,它还可以使用 HMAC 数据包 的身份验证功能,为连接增加额外的安全层。它还可以应用硬件加速以获得更好的加密性能。它支持从 2.3 版本开始提供的 mbed TLS

认证

OpenVPN 包含多种验证对间身份的方法。OpenVPN 提供预共享密钥、基于用户名/密码和基于证书的身份验证。预共享密钥最简单,而基于证书的最功能丰富且最强大。

在 2.0 版本中,可以在有或没有证书的情况下启用密码/用户名身份验证。但是,OpenVPN 依赖第三方模块来使用密码/用户名身份验证。

可扩展性

OpenVPN 可以通过第三方脚本和插件进行开发,这些脚本和插件可以在指定的入口点处找到。其目的是通常用于扩展 OpenVPN,提供更先进的日志记录、通过 RADIUS 集成的增强身份验证、动态防火墙更新、密码/用户名等。动态插件是可加载模块,用 C 语言编写,而脚本接口可以运行 OpenVPN 中存在的任何二进制文件和脚本。

OpenVPN 源代码中包含了一些此类插件的示例,包括一个 PAM 身份验证插件。此外,还存在许多第三方插件,用于对 SQLLDAP 数据库(如 MySQLSQLite)进行身份验证。

网络

OpenVPN 可以通过 传输控制协议用户数据报协议 传输进行操作,在单个 UDP/TCP 端口上复用已建立的 SSL 隧道。OpenVPN 完全支持 IPv6 作为隧道中虚拟网络的协议,并且从 2.3.x 系列 开始,OpenVPN 应用程序也可以通过 IPv6 创建连接。

它能够与几乎所有代理服务器一起工作,并且在实现网络地址转换和从防火墙中退出方面表现出色。服务器配置包含将各种网络配置选项 “推送” 给客户端的功能。这些包括路由命令、IP 地址和一些连接选项。OpenVPN 通过 通用 TAP/TUN 驱动程序促进了两种网络接口类型。OpenVPN 可以使用 LZO 压缩库 来压缩数据流。对于 OpenVPN,IANA 分配的官方端口号是 **1194** 端口。

当 OpenVPN 使用 TCP 传输建立隧道时,性能仅在未隧道化的网络链接上有足够的额外带宽以确保隧道化 TCP 定时器不会过期的情况下才能接受。如果情况并非如此,性能会急剧下降。这被称为 “TCP 融化问题”

安全性

OpenVPN 提供多种内部安全功能。它包括来自 OpenSSL 库的最高 256 位加密,尽管一些服务提供商可能提供较低的速率,为客户提供一些最快的 VPN。

它在用户空间运行,而不是需要 IP 堆栈操作。OpenVPN 包括放下 root 权限的能力,并应用 mlockall 以防止将敏感数据交换到磁盘。

OpenVPN 实现了一个基于 TLS 和 SSL 的自定义安全协议,而不是支持 PPTP、L2TP、IPSecIKE。OpenVPN 通过 PKCS#11 基于的加密令牌提供对 **智能卡** 的支持。

OpenVPN 平台

OpenVPNmacOS、QNX、NetBSD、FreeBSD、OpenBSD、Linux、SolarisWindows XP 及更高版本上可用。它适用于多种手机操作系统,包括 Windows Mobile 6.5、Maemo 及以下版本、Android 设备、Android 4.0+ 设备、越狱的 iOS 3.1.2+ 设备 和 **正确安装了内核模块的 iOS 3GS+ 设备**。

它与一些手机操作系统不兼容,包括 Palm 操作系统。它不是一个基于 Web 的 VPN,不像 终端服务 Web 访问Citrix 那样显示为网页:该程序是独立安装和配置的,通过手动编辑文本文件而不是使用基于 GUI 的向导。

OpenVPN 不适用于使用 IPSec over PPTPL2TP 协议的 VPN 客户端。整个软件包由一个用于服务器和客户端连接的二进制文件、一个配置文件(可选)以及多个密钥文件(取决于使用的身份验证方法)组成。

固件实现

OpenVPN 被移植到各种路由器固件包,允许用户使用他们的网络路由器以服务器或客户端模式运行 OpenVPN。例如,运行 OpenVPN 客户端模式的路由器允许网络上的设备访问 VPN,而无需安装 OpenVPN 的能力。

此外,OpenVPN 已被实现到一些制造商的路由器固件中。

软件实现

OpenVPN 已移植到 SoftEther VPN。它是一个多协议开源 VPN 服务器,允许用户通过 OpenVPN 客户端连接到 VPN 服务器。

此外,OpenVPN 也已移植到 Vyos。这是一个开源路由操作系统,是从 Vyatta 软件路由器 分叉而来的。

OpenVPN 配置

OpenVPN 可以通过证书、预共享密钥、用户/密码等来验证用户。

GNOME/NetworkManager 系统菜单

可以使用 `network-manager-openvpn-gnome` 命令在 Debian GNOME 设置(默认)中完全设置 OpenVPN 连接。在 NetworkManager 中,VPN 连接将被视为另一个网络连接,并在 GNOME 系统菜单中的以太网和 WiFi 控件旁边具有权限。

在 GNOME 42 中,要自动激活 OpenVPN 配置,我们使用 `nm-connection-editor` 命令。搜索网络连接,启动其设置,然后在“常规”下选择“自动连接到 VPN”选项。保存后,将 `secondaries=` 行添加到该网络在连接部分中的配置文件中。它包含一个要启用的辅助连接 UUID 列表。通常,配置文件位于 `/etc/NetworkManager/system-connections/`。

用于测试的未加密(原始)VPN 连接

  • 客户端部分

openvpn --remote SERVER_IP --dev tun1 --ifconfig 10.9.8.2 10.9.8.1

此外,我们可以 ping 服务器以检查是否可以访问它。

  • 服务器部分

我们可以在服务器 shell 中执行以下命令

openvpn --remote CLIENT_IP --dev tun1 --ifconfig 10.9.8.1 10.9.8.2

如果我们的客户端有任何静态 IP#,我们可以执行以下命令

openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2

静态密钥 VPN 连接

  • 静态密钥 VPN 服务器配置

我们可以在服务器的 `/etc/openvpn` 目录中执行以下命令来生成一个静态密钥

openvpn --genkey secret static.key

注意:在 Debian 10 的 OpenVPN 2.4 版本中,可以使用 `--secret` 而不是 `secret`。

  • 静态密钥 VPN 客户端配置

我们可以从服务器复制 `/etc/openvpn/static.key` 文件,并创建一个新的 `/etc/openvpn/tun0.conf` 文件。

使用以下命令手动启动双方的 OpenVPN

openvpn --config /etc/openvpn/tun0.conf --verb 6

我们可以 ping 10.9.8.2 端口以验证 VPN 是否已从服务器激活,从客户端 ping 10.9.8.1 端口。

TLS 启用的 VPN 连接

  • 初始化 easy-rsa

Easy-rsa 是一个单独的包,可以从 OpenVPN 安装中获取,从 Jessie 版本开始

请记住

  • .key 文件本身不需要保密。
  • 无需在系统之间复制任何 .key 文件。
  • .csr 和 .crt 文件可以在不安全的通道上传输,包括明文电子邮件。
  • 所有系统都将拥有其密钥/证书对。

生成 CA 密钥/证书

  • 生成 CA(证书颁发机构)的 CA 密钥/证书

./easyrsa build-ca

这将在 `/etc/openvpn/easy-rsa/{pki,pki/private}` 目录中生成 `ca.crt` 和 `ca.key`。

  • 生成服务器的密钥/证书

./easyrsa build-server-full server

这将在 `/etc/openvpn/easy-rsa/pki/{issued/server.crt,private/server.key}` 目录中生成 `server.key` 和 `server.crt`,并使用我们的根证书进行签名。

生成 DIFFIE-HELLMAN 参数

生成 DIFFIE-HELLMAN 参数(服务器完成 SSL/TLS 连接所必需)

./easyrsa gen-dh

生成用于身份验证的静态密钥

如果我们生成了任何静态密钥,我们可以重命名并传输它。否则,我们可以运行以下命令

openvpn --genkey secret /etc/openvpn/server/ta.key

注意:在 Debian 10 的 OpenVPN 2.4 版本中,可以使用 `--secret` 选项而不是 `secret` 选项。

生成客户端的密钥/证书

为所有客户端生成密钥:我们可以使用以下两个命令

  • 生成无密码的密钥

./easy build-client-full clientname nopass

  • 生成带密码的密钥:我们将为所有客户端提示“输入 PEM 密码短语”

./easyrsa build-client-full clientname

这将在 `/etc/openvpn/easy-rsa/pki/{issued/clientname.crt,private/clientname.key}` 目录中生成密钥。

OpenVPN 许可

OpenVPN 有两个不同的版本

  • OpenVPN Community Edition 是一个开源免费版本。
  • OpenVPN Access Server 是基于 Community Edition 的服务器,但提供额外的专有和付费功能,如 Web UI 管理、SMB 服务器、LDAP 集成,并提供一套配置和安装工具,据报道可以简化 VPN 远程访问解决方案的快速部署。

此版本严重依赖 iptables 进行负载均衡,并且由于这个原因从未在 Windows 上提供。此外,此版本可以动态创建客户端安装程序,这些安装程序会添加一个客户端配置文件以连接到特定的 Access Server 实例。

但是,用户不需要拥有 Access Server 客户端即可连接到 Access Server 实例;可以使用 OpenVPN Community Edition 的客户端。

在 Ubuntu 上安装 OpenVPN

OpenVPN 是一个流行的、快速的开源程序,用于创建虚拟专用网络。它应用 UDP 和 TCP 传输协议。VPN 隧道通过 OpenVPN 协议捕获,并带有 TLS/SSL 身份验证、凭据、证书、MAC 地址簿和多因素身份验证。

OpenVPN 可用于各种系统和设备。它具有与市场上几乎所有 VPN 协议相同的客户端-服务器架构。OpenVPN 访问服务器在 Linux 系统上运行,客户端可以安装在多种 Linux 系统、macOS、Windows 以及 iOS、Android 和 Windows Mobile 等移动操作系统上。

OpenVPN 访问服务器接受多个传入 VPN 连接,OpenVPN 客户端或与 OpenVPN 兼容的开源客户端可以启动到服务器的连接。

在本文中,我们将学习如何在 Ubuntu 上设置 OpenVPN 访问服务器,并从多种 Linux 系统连接 VPN 客户端。

在 Ubuntu 中设置 OpenVPN 服务器

  • 手动配置和安装 OpenVPN 服务器并非易事。这就是为什么我们将使用一个脚本来设置我们的安全 OpenVPN 服务器。

在下载和执行脚本之前,请记住该脚本将自动检测服务器的 **私有 IP 地址**。但是,我们需要注意服务器的公共 IP 地址,尤其是在它在 **NAT** 后面运行时。

要检查服务器的公共 IP 地址,我们需要在终端窗口中执行以下 **wget** 命令

  • 使用 curl 命令行工具下载安装程序脚本,然后使用 **chmod** 命令使其可执行。命令如下
  • 执行安装程序脚本

首次运行时,此脚本将提示我们一些问题,我们需要仔细阅读它们,并根据我们的偏好来回答以设置我们的 OpenVPN 服务器。

  • VPN 安装完成后,会在当前工作目录下写入一个客户端配置文件。这是我们在下一节中用于配置 OpenVPN 客户端的文件。
  • 通过执行以下命令检查其状态,确保 OpenVPN 服务已启动并正在运行

OpenVPN Ubuntu
  • 另外,确保 OpenVPN 守护进程正在监听脚本建议使用的端口,使用以下命令

OpenVPN Ubuntu
  • 如果我们检查网络接口,将为 VPN 隧道建立一个新接口。我们可以通过运行 `ip` 命令来确认这一点

OpenVPN Ubuntu

设置 OpenVPN 客户端

  • 现在是时候设置我们的 OpenVPN 客户端并将它们连接到 VPN 服务器了。我们需要在客户端机器上安装 OpenVPN 包

OpenVPN Ubuntu
  • 另外,我们还需要在桌面系统上安装 `network-manager-openvpn` 包,以便使用图形界面进行 VPN 设置

OpenVPN Ubuntu
  • 安装完上述包后,启动 **OpenVPN 服务**,启用它以便在系统重启时自动启动,并检查其状态以确认它已启动并正在运行

OpenVPN Ubuntu

OpenVPN Ubuntu

OpenVPN Ubuntu
  • 我们现在需要使用 OpenVPN 服务器导入 **OpenVPN 客户端** 设置。
  • 打开 **系统设置** 选项,然后进入 **网络**。在 VPN 下按 **添加** 按钮以获取必要选项。
    OpenVPN Ubuntu
  • 在弹出窗口中选择 **“从文件导入”** 选项。然后,浏览我们的文件管理器并选择我们使用服务器下载的客户端配置文件,即 **.ovpn** 文件。
    OpenVPN Ubuntu
  • 在其他 Linux 桌面系统上,按系统面板上的网络图标,然后进入 **网络连接**。然后,按 **加号** 按钮添加新连接。从下拉菜单中选择 **“导入已保存的 VPN 配置…”** 选项。
    OpenVPN Ubuntu
    建立连接并传输文件。
  • 传输文件后将添加 VPN 设置。然后,我们需要按 **添加**。
  • 我们的 VPN 客户端设置应该已成功添加。我们可以通过激活 VPN 来连接到 **OpenVPN** 服务器。
  • VPN 连接现在应该已成功建立。
  • 如果我们使用 `ip add` 命令检查我们的网络接口连接,应该会有一个 VPN 隧道接口。

OpenVPN Ubuntu