Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
openvpn-install — 在Debian、Ubuntu、Fedora、CentOS、Arch Linux及更多系统上搭建你自己的OpenVPN服务器 | Kitploit
工具/GitHubGitHub/angristan/openvpn-install
加密/解密工具脚本与自动化网络安全隐私保护
GitHubangristan/openvpn-install

openvpn-install

在Debian、Ubuntu、Fedora、CentOS、Arch Linux及更多系统上搭建你自己的OpenVPN服务器

查看仓库网站
16.1k3.3k12天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

openvpn-install

Say Thanks!

适用于 Debian、Ubuntu、Fedora、openSUSE、CentOS、Amazon Linux、Arch Linux、Oracle Linux、Rocky Linux 和 AlmaLinux 的 OpenVPN 安装程序。

该脚本可让您在几秒钟内设置并管理自己的安全 VPN 服务器。

这是什么?

此脚本旨在您自己的服务器上运行,无论是 VPS、专用服务器,甚至是家中的计算机。

设置完成后,您将能够为每个想要接入的设备生成客户端配置文件。

每个客户端都可以将其互联网流量通过服务器路由,全程加密。```mermaid graph LR A[Phone] -->|Encrypted| VPN B[Laptop] -->|Encrypted| VPN C[Computer] -->|Encrypted| VPN

VPN[OpenVPN Server]

VPN --> I[Internet]

root@kitploit:~
## 为什么选择OpenVPN?

在本脚本创建时,OpenVPN 是开源 VPN 的事实标准。WireGuard 后来出现,在大多数用例中更简单、更快。请查看 [wireguard-install](https://github.com/angristan/wireguard-install)。

话虽如此,当您需要以下功能时,OpenVPN 仍然值得考虑:

- **TCP 支持**:在 UDP 被封锁的限制性环境(企业网络、机场、酒店等)中也能工作
- **密码保护的私钥**:WireGuard 配置以明文存储私钥
- **传统兼容性**:几乎每个平台(包括较老系统)都有客户端

## 功能特点

- 安装并配置一个可立即使用的 OpenVPN 服务器
- CLI 接口,支持自动化和脚本编写(非交互模式,支持 JSON 输出)
- 客户端和服务器证书的续期
- 列出并监控已连接的客户端
- 撤销证书后立即断开客户端连接(通过管理接口)
- 尽可能使用[官方 OpenVPN 仓库](https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos)以获取最新的稳定版本
- 防火墙规则和转发无缝管理(原生 firewalld 和 nftables 支持,iptables 回退)
- 可配置的 VPN 子网(IPv4:默认 `10.8.0.0/24`,IPv6:默认 `fd42:42:42:42::/112`)
- 可配置的隧道 MTU(默认:`1500`)
- 必要时可干净地移除 OpenVPN,包括配置和防火墙规则
- 可自定义的加密设置,增强的默认设置(参见下方的[安全与加密](#security-and-encryption))
- 在可用时使用最新的 OpenVPN 功能(参见下方的[安全与加密](#security-and-encryption))
- 多种 DNS 解析器可供推送给客户端
- 可选择使用 Unbound 自建解析器(支持已存在的 Unbound 安装)
- 可选择 TCP 或 UDP
- 灵活的 IPv4/IPv6 支持:
  - IPv4 或 IPv6 服务器端点(客户端如何连接)
  - 仅 IPv4、仅 IPv6 或双栈客户端(VPN 地址分配和互联网访问)
  - 支持所有组合:4→4、4→4/6、4→6、6→4、6→6、6→4/6
  - 自动防泄漏:在单栈模式下阻止不期望的协议
- 非特权模式:以 `nobody`/`nogroup` 运行
- 在 Windows 10 上阻止 DNS 泄漏
- 随机化的服务器证书名称
- 可选择用密码保护客户端(私钥加密)
- 可选允许多个设备同时使用同一个客户端配置文件(禁用固定 IP 地址)
- **对端指纹认证**(OpenVPN 2.6+):无需 CA 的简化类 WireGuard 认证
- 还有许多其他小功能!

## 兼容性

该脚本支持以下 Linux 发行版:

|                     | 支持情况 |
| ------------------- | ------- |
| AlmaLinux >= 8      | ✅ 🤖   |
| Amazon Linux 2023   | ✅ 🤖   |
| Arch Linux          | ✅ 🤖   |
| CentOS Stream >= 8  | ✅ 🤖   |
| Debian >= 11        | ✅ 🤖   |
| Fedora >= 40        | ✅ 🤖   |
| openSUSE Leap >= 16 | ✅ 🤖   |
| openSUSE Tumbleweed | ✅ 🤖   |
| Oracle Linux >= 8   | ✅ 🤖   |
| Rocky Linux >= 8    | ✅ 🤖   |
| Ubuntu >= 18.04     | ✅ 🤖   |

需要注意的是:

- 该脚本仅定期在标有 🤖 的发行版上进行测试。
  - 仅在 `amd64` 架构上测试。
- 该脚本需要 `systemd`。

### 推荐的 VPS 提供商

- [Vultr](https://umami.stanislas.cloud/q/1HH9Thp8i):全球多地机房,支持 IPv6,每月 2.5 美元起
- [Hetzner](https://umami.stanislas.cloud/q/HdzaOJWq7):全球多地机房,支持 IPv6,20 TB 流量,每月 3.59 欧元起
- [Digital Ocean](https://umami.stanislas.cloud/q/sEVh1l79B):全球多地机房,支持 IPv6,每月 4 美元起

## 使用方式

首先,在您的服务器上下载脚本并使其可执行:```bash
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh

你需要以 root 身份运行脚本,并且启用 TUN 模块。

交互模式

开始使用的最简单方式是交互式菜单:```bash ./openvpn-install.sh interactive

root@kitploit:~
本指南将带你完成安装和客户端管理。

在你的主目录下,你将看到 `.ovpn` 文件。这些是客户端配置文件。从服务器下载它们(例如使用 `scp`),然后使用你喜欢的 OpenVPN 客户端连接。

如有任何疑问,请先查阅[常见问题](#faq)。如果需要帮助,你可以发起[讨论](https://github.com/angristan/openvpn-install/discussions)。请先搜索已有的问题和讨论。

### CLI 模式

> [!WARNING]
> API 兼容性不保证。版本之间可能发生破坏性变更。如果你以编程方式使用此脚本(例如在自动化或 CI/CD 中),请固定到特定提交,而非使用 master 分支。

对于自动化和脚本编写,请使用 CLI 接口:```bash
# Install with defaults
./openvpn-install.sh install

# Add a client
./openvpn-install.sh client add alice

# List clients
./openvpn-install.sh client list

# Revoke a client (immediately disconnects if connected)
./openvpn-install.sh client revoke alice

命令```text

openvpn-install [options]

Commands: install Install and configure OpenVPN server uninstall Remove OpenVPN server client Manage client certificates server Server management interactive Launch interactive menu

Global Options: --verbose Show detailed output --log Log file path (default: openvpn-install.log) --no-log Disable file logging --no-color Disable colored output -h, --help Show help

root@kitploit:~
运行 `./openvpn-install.sh <command> --help` 以查看命令特定的选项。

#### 客户端管理```bash
# Add a new client
./openvpn-install.sh client add alice

# Add a password-protected client
./openvpn-install.sh client add bob --password

# Revoke a client
./openvpn-install.sh client revoke alice

# Renew a client certificate
./openvpn-install.sh client renew bob --cert-days 365

列出所有客户端:```text $ ./openvpn-install.sh client list ══ Client Certificates ══ [INFO] Found 3 client certificate(s)

Name Status Expiry Remaining


alice Valid 2035-01-15 3650 days bob Valid 2035-01-15 3650 days charlie Revoked 2035-01-15 unknown

root@kitploit:~
用于脚本编写的 JSON 输出:```text
$ ./openvpn-install.sh client list --format json | jq
{
  "clients": [
    {
      "name": "alice",
      "status": "valid",
      "expiry": "2035-01-15",
      "days_remaining": 3650
    },
    {
      "name": "bob",
      "status": "valid",
      "expiry": "2035-01-15",
      "days_remaining": 3650
    },
    {
      "name": "charlie",
      "status": "revoked",
      "expiry": "2035-01-15",
      "days_remaining": null
    }
  ]
}

服务器管理```bash

Renew server certificate

./openvpn-install.sh server renew

Uninstall OpenVPN

./openvpn-install.sh uninstall

root@kitploit:~
显示已连接的客户端(数据每60秒刷新一次):```text
$ ./openvpn-install.sh server status
══ Connected Clients ══
[INFO] Found 2 connected client(s)

   Name    Real Address          VPN IP      Connected Since   Transfer
   ----    ------------          ------      ---------------   --------
   alice   203.0.113.45:52341    10.8.0.2    2025-01-15 14:32  ↓1.2M ↑500K
   bob     198.51.100.22:41892   10.8.0.3    2025-01-15 09:15  ↓800K ↑200K

[INFO] Note: Data refreshes every 60 seconds.

安装选项

install 命令支持许多自定义选项:```bash

Custom port and protocol

./openvpn-install.sh install --port 443 --protocol tcp

Custom DNS provider

./openvpn-install.sh install --dns quad9

Custom encryption settings

./openvpn-install.sh install --cipher AES-256-GCM --cert-type rsa --rsa-bits 4096

Custom VPN subnet

./openvpn-install.sh install --subnet-ipv4 10.9.0.0

Enable dual-stack (IPv4 + IPv6) for clients

./openvpn-install.sh install --client-ipv4 --client-ipv6

IPv6-only clients (no IPv4)

./openvpn-install.sh install --no-client-ipv4 --client-ipv6

IPv6 endpoint (server listens on IPv6, clients connect via IPv6)

./openvpn-install.sh install --endpoint-type 6 --endpoint 2001:db8::1

Custom IPv6 subnet for dual-stack setup

./openvpn-install.sh install --client-ipv6 --subnet-ipv6 fd00🔢5678::

Skip initial client creation

./openvpn-install.sh install --no-client

Full example with multiple options

./openvpn-install.sh install
--port 443
--protocol tcp
--dns cloudflare
--cipher AES-256-GCM
--client mydevice
--client-cert-days 365

root@kitploit:~
**网络选项:**

- `--endpoint <host>` - 客户端的公网 IP 或主机名(默认:自动检测)
- `--endpoint-type <4|6>` - 端点 IP 版本(默认:`4`)
- `--ip <addr>` - 服务器监听 IP(默认:自动检测)
- `--client-ipv4` - 为 VPN 客户端启用 IPv4(默认:启用)
- `--no-client-ipv4` - 禁用 VPN 客户端的 IPv4
- `--client-ipv6` - 为 VPN 客户端启用 IPv6(默认:禁用)
- `--no-client-ipv6` - 禁用 VPN 客户端的 IPv6
- `--subnet-ipv4 <x.x.x.0>` - IPv4 VPN 子网(默认:`10.8.0.0`)
- `--subnet-ipv6 <prefix>` - IPv6 VPN 子网(默认:`fd42:42:42:42::`)
- `--port <num>` - OpenVPN 端口(默认:`1194`)
- `--port-random` - 使用随机端口(49152-65535)
- `--protocol <udp|tcp>` - 协议(默认:`udp`)
- `--mtu <size>` - 隧道 MTU(默认:`1500`)

**DNS 选项:**

- `--dns <provider>` - DNS 提供商(默认:`cloudflare`)。选项:`system`、`unbound`、`cloudflare`、`quad9`、`quad9-uncensored`、`fdn`、`dnswatch`、`opendns`、`google`、`yandex`、`adguard`、`nextdns`、`custom`
- `--dns-primary <ip>` - 自定义主 DNS(需要 `--dns custom`)
- `--dns-secondary <ip>` - 自定义辅助 DNS(需要 `--dns custom`)

**安全选项:**

- `--cipher <cipher>` - 数据加密算法(默认:`AES-128-GCM`)。选项:`AES-128-GCM`、`AES-192-GCM`、`AES-256-GCM`、`AES-128-CBC`、`AES-192-CBC`、`AES-256-CBC`、`CHACHA20-POLY1305`
- `--cert-type <ecdsa|rsa>` - 证书类型(默认:`ecdsa`)
- `--cert-curve <curve>` - ECDSA 曲线(默认:`prime256v1`)。选项:`prime256v1`、`secp384r1`、`secp521r1`
- `--rsa-bits <2048|3072|4096>` - RSA 密钥大小(默认:`2048`)
- `--hmac <alg>` - HMAC 算法(默认:`SHA256`)。选项:`SHA256`、`SHA384`、`SHA512`
- `--tls-sig <mode>` - TLS 模式(默认:`crypt-v2`)。选项:`crypt-v2`、`crypt`、`auth`
- `--auth-mode <mode>` - 认证模式(默认:`pki`)。选项:`pki`(基于 CA)、`fingerprint`(对等指纹,需要 OpenVPN 2.6+)
- `--tls-version-min <1.2|1.3>` - 最小 TLS 版本(默认:`1.2`)
- `--tls-ciphersuites <list>` - TLS 1.3 密码套件,冒号分隔(默认:`TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256`)
- `--tls-groups <list>` - 密钥交换组,冒号分隔(默认:`X25519:prime256v1:secp384r1:secp521r1`)
- `--server-cert-days <n>` - 服务器证书有效期(天数)(默认:`3650`)

**客户端选项:**

- `--client <name>` - 初始客户端名称(默认:`client`)
- `--client-password [pass]` - 使用密码保护客户端密钥(默认:无密码)
- `--client-cert-days <n>` - 客户端证书有效期(天数)(默认:`3650`)
- `--no-client` - 跳过初始客户端创建

**其他选项:**

- `--multi-client` - 允许同一证书用于多个设备(默认:禁用)

#### 自动化示例

**批量创建客户端:**```bash
#!/bin/bash
for user in alice bob charlie; do
  ./openvpn-install.sh client add "$user"
done

从文件创建客户端:```bash #!/bin/bash while read -r user; do ./openvpn-install.sh client add "$user" done < users.txt

root@kitploit:~
**用于脚本编写的JSON输出:**```bash
# Get client list as JSON
./openvpn-install.sh client list --format json | jq '.clients[] | select(.status == "valid")'

# Get connected clients as JSON
./openvpn-install.sh server status --format json

分支

此脚本基于 Nyr 及其贡献者 的出色工作。

自 2016 年起,这两个脚本已经分化,不再相似,尤其是在内部实现上。该脚本的主要目标是增强安全性。但自那时起,该脚本已被完全重写,并添加了许多功能。不过,该脚本仅兼容较新的发行版,因此如果您需要使用非常旧的服务器或客户端,建议使用 Nyr 的脚本。

常见问题

更多问答请参见 FAQ.md。

问: 您推荐哪个提供商?

答: 我推荐以下这些:

  • Vultr:全球地点,支持 IPv6,起价 $2.5/月
  • Hetzner:全球地点,IPv6,20 TB 流量,起价 €3.59/月
  • Digital Ocean:全球地点,支持 IPv6,起价 $4/月

问: 您推荐哪个 OpenVPN 客户端?

答: 如果可能,请使用官方的 OpenVPN 2.4 客户端。

  • Windows:官方 OpenVPN 社区客户端。
  • Linux:来自您发行版的 openvpn 软件包。有一个针对基于 Debian/Ubuntu 的发行版的官方 APT 仓库。
  • macOS:Tunnelblick、Viscosity、OpenVPN for Mac。
  • Android:OpenVPN for Android。
  • iOS:官方 OpenVPN Connect 客户端。

问: 使用您的脚本,我能免受 NSA 的监控吗?

答: 请审查您的威胁模型。即使此脚本注重安全性并使用最先进的加密,如果您想躲避 NSA,也不应该使用 VPN。


问: 是否有 OpenVPN 文档?

答: 是的,请前往 OpenVPN 手册,其中引用了所有选项。


更多问答请参见 FAQ.md。

贡献

讨论变更

如果您想讨论变更,特别是重大变更,请在提交 PR 之前打开一个 issue。

安全与加密

[!NOTE] 该脚本创建于 2016 年,当时 OpenVPN 的默认设置相当脆弱。那时,自定义加密设置对于安全配置至关重要。此后,OpenVPN 显著改进了其默认设置,但该脚本仍提供自定义选项。

OpenVPN 2.3 及更早版本随附了过时的默认设置,如 Blowfish (BF-CBC)、TLS 1.0 和 SHA1。自那时起的每个主要版本都带来了重大改进:

  • OpenVPN 2.4 (2016):新增了 ECDSA、ECDH、AES-GCM、NCP(密码协商)和 tls-crypt
  • OpenVPN 2.5 (2020):默认密码从 BF-CBC 更改为 AES-256-GCM:AES-128-GCM,新增了 ChaCha20-Poly1305、tls-crypt-v2 和 TLS 1.3 支持
  • OpenVPN 2.6 (2023):默认最低 TLS 1.2,默认阻止压缩,--peer-fingerprint 用于无 PKI 设置,以及 DCO 内核加速

如果您想了解下面提到的选项的更多信息,请查阅 OpenVPN 手册。该手册非常完整。

证书和 PKI 管理由 Easy-RSA 处理。默认参数在 vars.example 文件中。

压缩

该脚本曾支持 LZ4 和 LZO 压缩算法,但由于 VORACLE 攻击 漏洞而不再推荐使用它们。

OpenVPN 2.6+ 默认将 --allow-compression 设置为 no,甚至阻止服务器推送的压缩。鉴于 OpenVPN 正完全移除压缩支持,此脚本不再支持压缩。

TLS 版本

[!NOTE] OpenVPN 2.6+ 默认最低 TLS 1.2。早期版本默认接受 TLS 1.0。

OpenVPN 2.5 及更早版本默认接受 TLS 1.0,这已接近 20 年历史。

此脚本默认使用 tls-version-min 1.2 以兼容所有 OpenVPN 2.4+ 客户端。对于所有客户端都支持 TLS 1.3 的环境,您可以选择设置 tls-version-min 1.3。

TLS 1.3 支持 在 OpenVPN 2.5 中新增,需要 OpenSSL 1.1.1+。TLS 1.3 通过简化握手提供了更高的安全性和性能。

该脚本通过 --tls-ciphersuites(与 TLS 1.2 的 --tls-cipher 选项分开)配置 TLS 1.3 密码套件。默认的 TLS 1.3 密码套件是:

  • TLS_AES_256_GCM_SHA384
  • TLS_AES_128_GCM_SHA256
  • TLS_CHACHA20_POLY1305_SHA256

TLS 1.2 自 OpenVPN 2.3.3 起支持。TLS 1.3 自 OpenVPN 2.5 起支持。

证书

OpenVPN 默认使用 2048 位密钥的 RSA 证书。

OpenVPN 2.4 新增了对 ECDSA 的支持。椭圆曲线加密更快、更轻量且更安全。

此脚本提供:

  • ECDSA:prime256v1/secp384r1/secp521r1 曲线
  • RSA:2048/3072/4096 位密钥

它默认使用 ECDSA 和 prime256v1。

OpenVPN 默认使用 SHA-256 作为签名哈希,此脚本也是如此。目前它不提供其他选择。

认证模式

该脚本支持两种认证模式:

PKI 模式(默认)

传统的基于证书颁发机构(CA)的认证。服务器和所有客户端都有由同一 CA 签发的证书。客户端撤销通过证书撤销列表(CRL)处理。

对于需要以下功能的大型部署,这是推荐模式:

  • 集中式证书管理
  • 基于标准 CRL 的撤销
  • 与所有 OpenVPN 版本的兼容性

对等指纹模式(OpenVPN 2.6+)

一种类似于 WireGuard 的简化认证模型,使用 SHA256 证书指纹代替 CA 链。每个对等体(服务器和客户端)都有一个自签名证书,对等体通过验证指纹来相互认证。```bash

Install with fingerprint mode

./openvpn-install.sh install --auth-mode fingerprint

root@kitploit:~
Benefits:

- 简化设置:无需CA基础设施
- 更易理解:类似SSH的`known_hosts`模型
- 适合小型环境:家庭网络、实验室、小团队

工作原理:

1. 服务器生成自签名证书并存储其指纹
2. 每个客户端生成自签名证书
3. 客户端指纹被添加到服务器的`<peer-fingerprint>`块中
4. 客户端使用服务器的指纹验证服务器
5. 撤销操作则从服务器配置中移除指纹(无需CRL)

权衡:撤销客户端需要重新加载OpenVPN(指纹在server.conf中)。在PKI模式下,新连接时会自动重新读取CRL文件。

### 数据通道

> [!NOTE]
> OpenVPN 2.5中默认数据通道密码已更改。先前版本默认使用`BF-CBC`,而OpenVPN 2.5+默认使用`AES-256-GCM:AES-128-GCM`。OpenVPN 2.6+还在默认密码列表中包含了`CHACHA20-POLY1305`(如果可用)。

默认情况下,OpenVPN 2.4及更早版本使用`BF-CBC`作为数据通道密码。Blowfish是一种古老(1993年)且弱小的算法。即使是官方OpenVPN文档也承认这一点。

> 默认值为BF-CBC,即Cipher Block Chaining模式下的Blowfish。
>
> 不再推荐使用BF-CBC,因为其64位块大小。这种小块大小允许基于碰撞的攻击,如SWEET32所示。详情请参见<https://community.openvpn.net/openvpn/wiki/SWEET32>。
> INRIA的安全研究人员公布了一种针对64位块密码(如3DES和Blowfish)的攻击。他们表明,当相同数据被频繁发送时,能够恢复明文,并展示了如何利用跨站点脚本漏洞来足够频繁地发送感兴趣的数据。这适用于HTTPS,也适用于HTTP-over-OpenVPN。更详尽的解释请参见<https://sweet32.info/>。
>
> OpenVPN的默认密码BF-CBC受到此攻击影响。

事实上,AES是当今的标准。它是当前最快、最安全的密码。[SEED](https://en.wikipedia.org/wiki/SEED)和[Camellia](https://github.com/angristan/openvpn-install/blob/HEAD/%3Chttps:/en.wikipedia.org/wiki/Camellia_(cipher)>)目前不易受攻击,但比AES慢且相对不那么受信任。

> 在当前支持的密码中,OpenVPN目前建议使用AES-256-CBC或AES-128-CBC。OpenVPN 2.4及更新版本也支持GCM。对于2.4+,我们推荐使用AES-256-GCM或AES-128-GCM。

AES-256比AES-128慢40%,并且使用256位密钥而不是128位密钥并无实际理由(来源:[1](http://security.stackexchange.com/questions/14068/why-most-people-use-256-bit-encryption-instead-of-128-bit),[2](http://security.stackexchange.com/questions/6141/amount-of-simple-operations-that-is-safely-out-of-reach-for-all-humanity/6149#6149))。此外,AES-256更容易受到[时序攻击](https://en.wikipedia.org/wiki/Timing_attack)的影响。

AES-GCM是一种[AEAD密码](https://en.wikipedia.org/wiki/Authenticated_encryption),意味着它同时为数据提供保密性、完整性和真实性保证。

ChaCha20-Poly1305是另一种AEAD密码,提供与AES-GCM类似的安全性。它在没有硬件AES加速(AES-NI)的设备上(如旧款CPU和许多基于ARM的设备)特别有用,因为在这些设备上,它的速度可能比AES快得多。

脚本支持以下密码:

- `AES-128-GCM`
- `AES-192-GCM`
- `AES-256-GCM`
- `AES-128-CBC`
- `AES-192-CBC`
- `AES-256-CBC`
- `CHACHA20-POLY1305`(需要OpenVPN 2.5+)

默认值为`AES-128-GCM`。

OpenVPN 2.4增加了一项称为“NCP”的功能:*Negotiable Crypto Parameters*(可协商密码参数)。这意味着你可以像HTTPS一样提供密码套件。默认设置为`AES-256-GCM:AES-128-GCM`,当与OpenVPN 2.4客户端一起使用时,会覆盖`--cipher`参数。为了简单起见,脚本将`--cipher`(作为非NCP客户端的后备)、`--data-ciphers`(现代OpenVPN 2.5+命名)和`--ncp-ciphers`(用于OpenVPN 2.4兼容性的旧别名)都设置为上面选择的密码。

### 控制通道

OpenVPN 2.4默认会协商最佳可用密码(例如ECDHE+AES-256-GCM)

#### TLS 1.2密码(`--tls-cipher`)

根据证书类型,脚本提供以下选项:

- ECDSA:
  - `TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256`
  - `TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384`
  - `TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256`(需要OpenVPN 2.5+)
- RSA:
  - `TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256`
  - `TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384`
  - `TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256`(需要OpenVPN 2.5+)

默认值为`TLS-ECDHE-*-WITH-AES-128-GCM-SHA256`。

#### TLS 1.3密码(`--tls-ciphersuites`)

当协商TLS 1.3时,使用另一套密码套件。这些通过`--tls-ciphersuites`配置,并使用OpenSSL命名约定:

- `TLS_AES_256_GCM_SHA384`
- `TLS_AES_128_GCM_SHA256`
- `TLS_CHACHA20_POLY1305_SHA256`

默认情况下,所有三个密码套件均已启用。TLS 1.3密码套件更简单,因为它们不包含密钥交换算法(密钥交换通过密钥共享单独协商)。

### 密钥交换

OpenVPN历史上默认使用2048位DH参数进行密钥交换。此脚本曾提供DH(可配置密钥大小)和ECDH作为替代选项。

OpenVPN 2.4增加了ECDH支持,而OpenVPN 2.7将`dh none`(ECDH)设为默认值,因为有限域DH正在被弃用。由于ECDH现已普遍支持且更受青睐,此脚本不再提供传统DH。

脚本配置`tls-groups`时使用以下偏好列表:```
X25519:prime256v1:secp384r1:secp521r1
  • X25519:快速的现代曲线(Curve25519),广泛支持
  • prime256v1:NIST P-256,兼容性最佳
  • secp384r1:NIST P-384,更高安全性
  • secp521r1:NIST P-521,最高安全性

可通过 --tls-groups 自定义。

HMAC 摘要算法

来自 OpenVPN 百科,关于 --auth:

使用消息摘要算法 alg 对数据通道数据包进行 HMAC 身份验证,并对(如果启用)tls-auth 控制通道数据包进行身份验证。(默认为 SHA1)。HMAC 是一种常用的消息认证算法(MAC),它使用数据字符串、安全哈希算法和密钥来生成数字签名。

如果选择了 AEAD 密码模式(例如 GCM),则对于数据通道,指定的 --auth 算法将被忽略,转而使用 AEAD 密码的身份验证方法。注意,alg 仍然指定用于 tls-auth 的摘要算法。

该脚本提供以下选项:

  • SHA256
  • SHA384
  • SHA512

默认值为 SHA256。

tls-auth、tls-crypt 和 tls-crypt-v2

来自 OpenVPN 百科,关于 tls-auth:

在 TLS 控制通道上增加额外的 HMAC 身份验证层,以缓解 DoS 攻击和针对 TLS 堆栈的攻击。

简而言之,--tls-auth 在 OpenVPN 的 TCP/UDP 端口上启用了一种“HMAC 防火墙”,其中携带错误 HMAC 签名的 TLS 控制通道数据包可以立即被丢弃而不作出响应。

关于 tls-crypt:

使用 keyfile 中的密钥加密并认证所有控制通道数据包。(有关更多背景信息,请参见 --tls-auth。)

加密(并认证)控制通道数据包:

  • 通过隐藏用于 TLS 连接的证书,提供更多隐私;
  • 使识别 OpenVPN 流量变得更加困难;
  • 针对永远无法获得预共享密钥的攻击者(即无前向保密性),提供“穷人的”后量子安全。

因此,两者都提供了额外的安全层并缓解了 DoS 攻击。OpenVPN 默认不使用它们。

tls-crypt 是 OpenVPN 2.4 的一个功能,除了身份验证外还提供加密(与 tls-auth 不同)。它更注重隐私。

tls-crypt-v2 是 OpenVPN 2.5 的一个功能,它基于 tls-crypt 构建,使用每个客户端密钥而不是共享密钥。每个客户端收到一个从服务器密钥派生的唯一密钥。这提供了:

  • 更好的安全性:如果客户端密钥被泄露,其他客户端不会受到影响
  • 更简单的密钥管理:可以单独撤销客户端密钥,而无需重新生成服务器密钥
  • 可扩展性:更适合拥有众多客户端的大型部署

脚本支持所有三种选项:

  • tls-crypt-v2(默认):每个客户端密钥,安全性更好
  • tls-crypt:所有客户端共享密钥,兼容 OpenVPN 2.4+
  • tls-auth:仅 HMAC 身份验证(无加密),兼容较旧客户端

证书类型验证(remote-cert-tls)

服务器配置了 remote-cert-tls client,要求连接的客户端拥有带有“TLS Web 客户端身份验证”扩展密钥用途的证书。这可以防止服务器证书被用来冒充客户端。

类似地,客户端配置了 remote-cert-tls server,以确保它们只连接到出示有效服务器证书的服务器。这可以防止攻击者使用有效客户端证书设置恶意服务器。

数据通道卸载(DCO)

数据通道卸载(DCO)是一种内核加速功能,通过将数据通道加密/解密保留在内核空间,显著提高 OpenVPN 性能,消除了每个数据包在用户空间和内核空间之间的昂贵上下文切换。

DCO 已合并到 Linux 内核 6.16(2025 年 4 月)。

要求:

  • OpenVPN 2.6.0 或更高版本
  • Linux 内核 6.16+(内置)或 ovpn-dco 内核模块
  • UDP 协议(不支持 TCP)
  • AEAD 密码(AES-128-GCM、AES-256-GCM 或 CHACHA20-POLY1305)

脚本的默认设置(AES-128-GCM、UDP)兼容 DCO。当 DCO 可用且配置兼容时,OpenVPN 将自动使用它以提升性能。

注意: 要获得完全加速,服务器和客户端都必须支持 DCO。客户端支持在 OpenVPN 2.6+(Linux、Windows、FreeBSD)和 OpenVPN Connect 3.4+(Windows)中可用。macOS 目前不支持 DCO,但客户端仍然可以连接到支持 DCO 的服务器,并在服务器端获得部分性能提升。

脚本会在安装过程中显示 DCO 可用性状态。

表示感谢

如果您愿意,可以表示感谢!

鸣谢与许可

感谢所有贡献者以及 Nyr 的原始工作。

本项目基于 MIT 许可。

Star 历史

Star History Chart

下载工具