适用于 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`)
**安全选项:**