适用于 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]
## 为什么选择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
本指南将带你完成安装和客户端管理。
在你的主目录下,你将看到 `.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
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
运行 `./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
用于脚本编写的 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
}
]
}
./openvpn-install.sh server renew
./openvpn-install.sh uninstall
显示已连接的客户端(数据每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
./openvpn-install.sh install --port 443 --protocol tcp
./openvpn-install.sh install --dns quad9
./openvpn-install.sh install --cipher AES-256-GCM --cert-type rsa --rsa-bits 4096
./openvpn-install.sh install --subnet-ipv4 10.9.0.0
./openvpn-install.sh install --client-ipv4 --client-ipv6
./openvpn-install.sh install --no-client-ipv4 --client-ipv6
./openvpn-install.sh install --endpoint-type 6 --endpoint 2001:db8::1
./openvpn-install.sh install --client-ipv6 --subnet-ipv6 fd00🔢5678::
./openvpn-install.sh install --no-client
./openvpn-install.sh install
--port 443
--protocol tcp
--dns cloudflare
--cipher AES-256-GCM
--client mydevice
--client-cert-days 365
**网络选项:**
- `--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
**用于脚本编写的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。
问: 您推荐哪个提供商?
答: 我推荐以下这些:
问: 您推荐哪个 OpenVPN 客户端?
答: 如果可能,请使用官方的 OpenVPN 2.4 客户端。
openvpn 软件包。有一个针对基于 Debian/Ubuntu 的发行版的官方 APT 仓库。问: 使用您的脚本,我能免受 NSA 的监控吗?
答: 请审查您的威胁模型。即使此脚本注重安全性并使用最先进的加密,如果您想躲避 NSA,也不应该使用 VPN。
问: 是否有 OpenVPN 文档?
答: 是的,请前往 OpenVPN 手册,其中引用了所有选项。
更多问答请参见 FAQ.md。
如果您想讨论变更,特别是重大变更,请在提交 PR 之前打开一个 issue。
[!NOTE] 该脚本创建于 2016 年,当时 OpenVPN 的默认设置相当脆弱。那时,自定义加密设置对于安全配置至关重要。此后,OpenVPN 显著改进了其默认设置,但该脚本仍提供自定义选项。
OpenVPN 2.3 及更早版本随附了过时的默认设置,如 Blowfish (BF-CBC)、TLS 1.0 和 SHA1。自那时起的每个主要版本都带来了重大改进:
--peer-fingerprint 用于无 PKI 设置,以及 DCO 内核加速如果您想了解下面提到的选项的更多信息,请查阅 OpenVPN 手册。该手册非常完整。
证书和 PKI 管理由 Easy-RSA 处理。默认参数在 vars.example 文件中。
该脚本曾支持 LZ4 和 LZO 压缩算法,但由于 VORACLE 攻击 漏洞而不再推荐使用它们。
OpenVPN 2.6+ 默认将 --allow-compression 设置为 no,甚至阻止服务器推送的压缩。鉴于 OpenVPN 正完全移除压缩支持,此脚本不再支持压缩。
[!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_SHA384TLS_AES_128_GCM_SHA256TLS_CHACHA20_POLY1305_SHA256TLS 1.2 自 OpenVPN 2.3.3 起支持。TLS 1.3 自 OpenVPN 2.5 起支持。
OpenVPN 默认使用 2048 位密钥的 RSA 证书。
OpenVPN 2.4 新增了对 ECDSA 的支持。椭圆曲线加密更快、更轻量且更安全。
此脚本提供:
prime256v1/secp384r1/secp521r1 曲线2048/3072/4096 位密钥它默认使用 ECDSA 和 prime256v1。
OpenVPN 默认使用 SHA-256 作为签名哈希,此脚本也是如此。目前它不提供其他选择。
该脚本支持两种认证模式:
传统的基于证书颁发机构(CA)的认证。服务器和所有客户端都有由同一 CA 签发的证书。客户端撤销通过证书撤销列表(CRL)处理。
对于需要以下功能的大型部署,这是推荐模式:
一种类似于 WireGuard 的简化认证模型,使用 SHA256 证书指纹代替 CA 链。每个对等体(服务器和客户端)都有一个自签名证书,对等体通过验证指纹来相互认证。```bash
./openvpn-install.sh install --auth-mode fingerprint
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
可通过 --tls-groups 自定义。
来自 OpenVPN 百科,关于 --auth:
使用消息摘要算法 alg 对数据通道数据包进行 HMAC 身份验证,并对(如果启用)tls-auth 控制通道数据包进行身份验证。(默认为 SHA1)。HMAC 是一种常用的消息认证算法(MAC),它使用数据字符串、安全哈希算法和密钥来生成数字签名。
如果选择了 AEAD 密码模式(例如 GCM),则对于数据通道,指定的 --auth 算法将被忽略,转而使用 AEAD 密码的身份验证方法。注意,alg 仍然指定用于 tls-auth 的摘要算法。
该脚本提供以下选项:
SHA256SHA384SHA512默认值为 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)是一种内核加速功能,通过将数据通道加密/解密保留在内核空间,显著提高 OpenVPN 性能,消除了每个数据包在用户空间和内核空间之间的昂贵上下文切换。
DCO 已合并到 Linux 内核 6.16(2025 年 4 月)。
要求:
ovpn-dco 内核模块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 许可。