angristan/openvpn-install

GitHub: angristan/openvpn-install

一款注重安全性与自动化的一键OpenVPN服务器部署脚本,旨在帮助用户在多种Linux发行版上快速构建和管理专有VPN服务。

Stars: 15952 | Forks: 3323

# openvpn-install 适用于 Debian、Ubuntu、Fedora、openSUSE、CentOS、Amazon Linux、Arch Linux、Oracle Linux、Rocky Linux 和 AlmaLinux 的 OpenVPN 安装程序。 该脚本将让你在几秒钟内设置并管理自己的安全 VPN 服务器。 ## 这是什么? 该脚本旨在你自己的服务器上运行,无论是 VPS、独立服务器,甚至是家里的电脑。 设置完成后,你将能够为你想要连接的每台设备生成客户端配置文件。 每个客户端都可以通过服务器路由其互联网流量,并经过完全加密。 ``` 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`。 ### 推荐服务商 - [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/月 ## 使用说明 首先,在你的服务器上下载此脚本并赋予其可执行权限: ``` curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh chmod +x openvpn-install.sh ``` 你需要以 root 身份运行此脚本,并启用 TUN 模块。 ### 交互模式 最简单的入门方式是使用交互式菜单: ``` ./openvpn-install.sh interactive ``` 这将引导你完成安装和客户端管理。 在你的主目录中,你将看到 `.ovpn` 文件。这些是客户端配置文件。将它们从服务器上下载下来(例如使用 `scp`),并使用你最喜欢的 OpenVPN 客户端进行连接。 如果你有任何问题,请先前往 [FAQ](#faq)。如果你需要帮助,可以发起一个 [讨论](https://github.com/angristan/openvpn-install/discussions)。请先搜索现有的 issue 和讨论。 ### CLI 模式 对于自动化和脚本,请使用 CLI 接口: ``` # 使用默认值安装 ./openvpn-install.sh install # 添加客户端 ./openvpn-install.sh client add alice # 列出客户端 ./openvpn-install.sh client list # 撤销客户端(如果已连接则立即断开) ./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 --help` 查看特定命令的选项。 #### 客户端管理 ``` # 添加新客户端 ./openvpn-install.sh client add alice # 添加受密码保护的客户端 ./openvpn-install.sh client add bob --password # 撤销客户端 ./openvpn-install.sh client revoke alice # 续期客户端证书 ./openvpn-install.sh client renew bob --cert-days 365 ``` 列出所有客户端: ``` $ ./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 输出: ``` $ ./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 ./openvpn-install.sh uninstall ``` 显示已连接的客户端(数据每 60 秒刷新一次): ``` $ ./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` 命令支持许多自定义选项: ``` # 自定义端口和协议 ./openvpn-install.sh install --port 443 --protocol tcp # 自定义 DNS 提供商 ./openvpn-install.sh install --dns quad9 # 自定义加密设置 ./openvpn-install.sh install --cipher AES-256-GCM --cert-type rsa --rsa-bits 4096 # 自定义 VPN 子网 ./openvpn-install.sh install --subnet-ipv4 10.9.0.0 # 为客户端启用双栈 (IPv4 + IPv6) ./openvpn-install.sh install --client-ipv4 --client-ipv6 # 仅 IPv6 客户端(无 IPv4) ./openvpn-install.sh install --no-client-ipv4 --client-ipv6 # IPv6 端点(服务器监听 IPv6,客户端通过 IPv6 连接) ./openvpn-install.sh install --endpoint-type 6 --endpoint 2001:db8::1 # 用于双栈设置的自定义 IPv6 子网 ./openvpn-install.sh install --client-ipv6 --subnet-ipv6 fd00:1234: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 ` - 客户端连接的公共 IP 或主机名(默认:自动检测) - `--endpoint-type <4|6>` - 端点 IP 版本(默认:`4`) - `--ip ` - 服务器监听 IP(默认:自动检测) - `--client-ipv4` - 为 VPN 客户端启用 IPv4(默认:启用) - `--no-client-ipv4` - 为 VPN 客户端禁用 IPv4 - `--client-ipv6` - 为 VPN 客户端启用 IPv6(默认:禁用) - `--no-client-ipv6` - 为 VPN 客户端禁用 IPv6 - `--subnet-ipv4 ` - IPv4 VPN 子网(默认:`10.8.0.0`) - `--subnet-ipv6 ` - IPv6 VPN 子网(默认:`fd42:42:42:42::`) - `--port ` - OpenVPN 端口(默认:`1194`) - `--port-random` - 使用随机端口 (49152-65535) - `--protocol ` - 协议(默认:`udp`) - `--mtu ` - 隧道 MTU(默认:`1500`) **DNS 选项:** - `--dns ` - DNS 提供商(默认:`cloudflare`)。选项:`system`、`unbound`、`cloudflare`、`quad9`、`quad9-uncensored`、`fdn`、`dnswatch`、`opendns`、`google`、`yandex`、`adguard`、`nextdns`、`custom` - `--dns-primary ` - 自定义主 DNS(需要 `--dns custom`) - `--dns-secondary ` - 自定义辅 DNS(需要 `--dns custom`) **安全选项:** - `--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`) - `--cert-curve ` - ECDSA 曲线(默认:`prime256v1`)。选项:`prime256v1`、`secp384r1`、`secp521r1` - `--rsa-bits <2048|3072|4096>` - RSA 密钥大小(默认:`2048`) - `--hmac ` - HMAC 算法(默认:`SHA256`)。选项:`SHA256`、`SHA384`、`SHA512` - `--tls-sig ` - TLS 模式(默认:`crypt-v2`)。选项:`crypt-v2`、`crypt`、`auth` - `--auth-mode ` - 认证模式(默认:`pki`)。选项:`pki`(基于 CA)、`fingerprint`(对端指纹,需要 OpenVPN 2.6+) - `--tls-version-min <1.2|1.3>` - 最低 TLS 版本(默认:`1.2`) - `--tls-ciphersuites ` - TLS 1.3 密码套件,以冒号分隔(默认:`TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256`) - `--tls-groups ` - 密钥交换组,以冒号分隔(默认:`X25519:prime256v1:secp384r1:secp521r1`) - `--server-cert-days ` - 服务器证书有效期(天)(默认:`3650`) **客户端选项:** - `--client ` - 初始客户端名称(默认:`client`) - `--client-password [pass]` - 使用密码保护客户端密钥(默认:无密码) - `--client-cert-days ` - 客户端证书有效期(天)(默认:`3650`) - `--no-client` - 跳过初始客户端创建 **其他选项:** - `--multi-client` - 允许多个设备使用相同的证书(默认:禁用) #### 自动化示例 **批量创建客户端:** ``` #!/bin/bash for user in alice bob charlie; do ./openvpn-install.sh client add "$user" done ``` **从文件创建客户端:** ``` #!/bin/bash while read -r user; do ./openvpn-install.sh client add "$user" done < users.txt ``` **用于脚本编程的 JSON 输出:** ``` # 获取 JSON 格式的客户端列表 ./openvpn-install.sh client list --format json | jq '.clients[] | select(.status == "valid")' # 获取 JSON 格式的已连接客户端 ./openvpn-install.sh server status --format json ``` ## 分支 此脚本基于 [Nyr 及其贡献者](https://github.com/Nyr/openvpn-install) 的杰出作品。 自 2016 年以来,这两个脚本已经分化并且不再相同,尤其是在底层实现上。该脚本的主要目标是增强安全性。但从那时起,该脚本已被完全重写并添加了许多功能。不过,该脚本仅兼容较新的发行版,因此如果你需要使用非常旧的服务器或客户端,我建议使用 Nyr 的脚本。 ## 常见问题解答 更多问答请见 [FAQ.md](FAQ.md)。 **问:** 你推荐哪家服务商? **答:** 我推荐这些: - [Vultr](https://www.vultr.com/?ref=8948982-8H):全球节点,支持 IPv6,起价为 \$2.5/月 - [Hetzner](https://hetzner.cloud/?ref=ywtlvZsjgeDq):全球节点,支持 IPv6,20 TB 流量,起价为 €3.59/月 - [Digital Ocean](https://m.do.co/c/ed0ba143fe53):全球节点,支持 IPv6,起价为 \$4/月 **问:** 你推荐哪个 OpenVPN 客户端? **答:** 如果可能的话,使用官方的 OpenVPN 2.4 客户端。 - Windows:[官方 OpenVPN 社区客户端](https://openvpn.net/index.php/download/community-downloads.html)。 - Linux:你所用发行版自带的 `openvpn` 包。对于基于 Debian/Ubuntu 的发行版,有一个 [官方 APT 仓库](https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos)。 - macOS:[Tunnelblick](https://tunnelblick.net/)、[Viscosity](https://www.sparklabs.com/viscosity/)、[OpenVPN for Mac](https://openvpn.net/client-connect-vpn-for-mac-os/)。 - Android:[OpenVPN for Android](https://play.google.com/store/apps/details?id=de.blinkt.openvpn)。 - iOS:[官方 OpenVPN Connect 客户端](https://itunes.apple.com/us/app/openvpn-connect/id590379981)。 **问:** 使用你的脚本能让我免受 NSA 的监控吗? **答:** 请重新评估你的威胁模型。即使这个脚本考虑了安全性并使用了最先进的加密技术,但如果你想躲避 NSA,你不应该使用 VPN。 **问:** OpenVPN 文档吗? **答:** 有,请前往 [OpenVPN 手册](https://openvpn.net/community-docs/community-articles/openvpn-2-6-manual.html),其中引用了所有选项。 更多问答请见 [FAQ.md](FAQ.md)。 ## 安全与加密 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,默认阻止压缩,用于无 PKI 设置的 `--peer-fingerprint`,以及 DCO 内核加速 如果你想了解下面提到的选项的更多信息,请前往 [OpenVPN 手册](https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage)。它非常全面。 证书和 PKI 管理由 [Easy-RSA](https://github.com/OpenVPN/easy-rsa) 处理。默认参数在 [vars.example](https://github.com/OpenVPN/easy-rsa/blob/v3.2.2/easyrsa3/vars.example) 文件中。 ### 压缩 此脚本曾经支持 LZ4 和 LZO 压缩算法,但由于 [VORACLE 攻击](https://community.openvpn.net/Security%20Announcements/VORACLE) 漏洞,不鼓励使用它们。 OpenVPN 2.6+ 将 `--allow-compression` 默认为 `no`,甚至阻止服务器推送的压缩。既然 OpenVPN 正在完全移除压缩支持,此脚本也不再支持它。 ### TLS 版本 OpenVPN 2.5 及更早版本默认接受 TLS 1.0,这已经有[近 20 年的历史](https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.0)。 此脚本默认使用 `tls-version-min 1.2` 以兼容所有 OpenVPN 2.4+ 客户端。你可以选择设置 `tls-version-min 1.3`,适用于所有客户端均支持 TLS 1.3 的环境。 在 OpenVPN 2.5 中添加了 **TLS 1.3 支持**,并需要 OpenSSL 1.1.1+。TLS 1.3 通过简化的握手提供了更高的安全性和性能。 此脚本通过 `--tls-ciphersuites` 配置 TLS 1.3 密码套件(与 TLS 1.2 的 `--tls-cipher` 选项分开)。默认的 TLS 1.3 密码套件是: - `TLS_AES_256_GCM_SHA384` - `TLS_AES_128_GCM_SHA256` - `TLS_CHACHA20_POLY1305_SHA256` 从 OpenVPN 2.3.3 开始支持 TLS 1.2。从 OpenVPN 2.5 开始支持 TLS 1.3。 ### 证书 OpenVPN 默认使用具有 2048 位密钥的 RSA 证书。 OpenVPN 2.4 添加了对 ECDSA 的支持。椭圆曲线密码学更快、更轻量且更安全。 此脚本提供: - ECDSA:`prime256v1`/`secp384r1`/`secp521r1` 曲线 - RSA:`2048`/`3072`/`4096` 位密钥 它默认使用带有 `prime256v1` 的 ECDSA。 OpenVPN 默认使用 `SHA-256` 作为签名哈希,此脚本也是如此。目前它不提供其他选择。 ### 认证模式 此脚本支持两种认证模式: #### PKI 模式(默认) 传统的基于证书颁发机构 (CA) 的认证。服务器和所有客户端都拥有由同一 CA 签名的证书。客户端撤销通过证书撤销列表 (CRL) 处理。 这是需要以下功能的大型部署的推荐模式: - 集中式的证书管理 - 基于标准 CRL 的撤销 - 兼容所有 OpenVPN 版本 #### 对端指纹模式 (OpenVPN 2.6+) 一种简化的、类似 WireGuard 的认证模型,使用 SHA256 证书指纹代替 CA 链。每个对端(服务器和客户端)都有一个自签名证书,对端之间通过验证指纹进行认证。 ``` # 使用指纹模式安装 ./openvpn-install.sh install --auth-mode fingerprint ``` 优点: - 设置更简单:无需 CA 基础设施 - 更易于理解:类似于 SSH 的 `known_hosts` 模型 - 非常适合小型设置:家庭网络、实验室、小团队 工作原理: 1. 服务器生成一个自签名证书并存储其指纹 2. 每个客户端生成一个自签名证书 3. 客户端指纹被添加到服务器的 `` 块中 4. 客户端使用服务器的指纹来验证服务器 5. 撤销是指从服务器配置中删除指纹(不需要 CRL) 权衡:撤销客户端需要重新加载 OpenVPN(指纹位于 server.conf 中)。在 PKI 模式下,CRL 文件会在新连接时自动重新读取。 ### 数据通道 默认情况下,OpenVPN 2.4 及更早版本使用 `BF-CBC` 作为数据通道密码。Blowfish 是一种古老(1993 年)且较弱的算法。甚至连官方的 OpenVPN 文档也承认这一点。 事实上,AES 是当今的标准。它是当今可用最快且更安全的密码。[SEED](https://en.wikipedia.org/wiki/SEED) 和 [Camellia]() 迄今为止没有漏洞,但比 AES 慢且相对不太受信任。 AES-256 比 AES-128 慢 40%,在使用 AES 时,没有任何真正的理由使用 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 wiki,关于 `--auth`: 此脚本提供以下选项: - `SHA256` - `SHA384` - `SHA512` 它默认使用 `SHA256`。 ### `tls-auth`、`tls-crypt` 和 `tls-crypt-v2` 来自 OpenVPN wiki,关于 `tls-auth`: 关于 `tls-crypt`: 因此两者都提供了额外的安全层并缓解了 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 Client Authentication" 扩展密钥用法的证书。这可以防止服务器证书被用于冒充客户端。 同样,客户端配置了 `remote-cert-tls server`,以确保它们只连接到提供有效服务器证书的服务器。这可以防止拥有有效客户端证书的攻击者建立恶意服务器。 ### 数据通道卸载 (DCO) [Data Channel Offload](https://openvpn.net/as-docs/openvpn-data-channel-offload.html) (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 可用性状态。 ## 致谢 如果你想的话,可以[说声谢谢](https://saythanks.io/to/angristan)! ## 贡献者与许可证 非常感谢[贡献者们](https://github.com/Angristan/OpenVPN-install/graphs/contributors)和 Nyr 的原创作品。 本项目基于 [MIT 许可证](https://raw.githubusercontent.com/Angristan/openvpn-install/master/LICENSE) ## Star 历史 [![Star History Chart](https://api.star-history.com/svg?repos=angristan/openvpn-install&type=Date)](https://star-history.com/#angristan/openvpn-install&Date)
标签:Arch Linux, Awesome, CentOS, CISA项目, Debian, Nftables, OpenVPN, Shell脚本, TCP代理, VPN, VPS, WireGuard替代, 个人VPN, 二进制发布, 安全通信, 应用安全, 开源工具, 数字证书, 服务器搭建, 流量路由, 系统管理, 网络加密, 网络安全, 网络安全, 证书管理, 运维自动化, 远程访问, 防火墙配置, 隐私保护, 隐私保护, 隧道协议