OpenVPN

OpenVPN是一个用于创建虚拟私人网络加密通道的软件包，最早由James Yonan编写。OpenVPN允许建立的VPN使用公开密钥、电子证书、或者用户名／密码来进行身份验证。

它大量使用了OpenSSL加密库中的SSL/TLS协议函数库。

目前OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Microsoft Windows以及Android和iOS上运行，并包含了许多安全性的功能。它不与IPsec兼容。

## 原理

OpenVPN的技术核心是虚拟网卡，其次是SSL协议实现。

### 虚拟网卡

在OpenVPN中，如果用户访问一个远程的虚拟地址（属于虚拟网卡配用的地址系列，区别于真实地址），则操作系统会通过路由机制将数据包（TUN模式）或数据帧（TAP模式）发送到虚拟网卡上，服务程序接收该数据并进行相应的处理后，会通过SOCKET从外网上发送出去。这完成了一个单向传输的过程，反之亦然。当远程服务程序通过SOCKET从外网上接收到数据，并进行相应的处理后，又会发送回给虚拟网卡，则该应用软件就可以接收到。

### 加密

OpenVPN使用OpenSSL库来加密数据与控制信息。这意味着，它能够使用任何OpenSSL支持的算法。它提供了HMAC功能以提高连接的安全性。此外，OpenSSL的硬件加速也能提高它的性能。2.3.0以后版本引入PolarSSL。OpenVPN 依赖 OpenSSL 或 mbed TLS，支援 AES、AES-GCM、ChaCha20-Poly1305 等现代加密算法，并可使用 TLS 1.2 / 1.3 进行金钥交换。OpenVPN 也支援完美前向保密（Perfect Forward Secrecy, PFS），透过定期重新产生会话金钥，降低单一金钥遭受破解时造成的风险。

## 功能

### 身份验证

OpenVPN提供了多种身份验证方式，用以确认连接双方的身份，包括：

- 预共享密钥
- 数字证书
- 用户名／密码组合

预共享密钥最为简单，但它只能用于建立点对点的VPN；基于PKI的第三方证书提供了最完善的功能，但是需要额外维护一个PKI证书系统。OpenVPN2.0后引入了用户名／口令组合的身份验证方式，它可以省略客户端证书，但是仍需要一份服务器证书用作加密。

### 功能与端口

- OpenVPN所有的通信都基于一个单一的IP端口，默认且推荐使用UDP协议通讯，同时也支持TCP。IANA（Internet Assigned Numbers Authority）指定给OpenVPN的官方端口为1194。OpenVPN 2.0以后版本每个进程可以同时管理数个并发的隧道。OpenVPN使用通用网络协议（TCP与UDP）的特点使它成为IPsec等协议的理想替代，尤其是在ISP（Internet service provider）过滤某些特定VPN协议的情况下。
- OpenVPN连接能通过大多数的代理服务器，并且能够在NAT的环境中很好地工作。
- 服务端具有向客户端“推送”某些网络配置信息的功能，这些信息包括：IP地址、路由设置等。
- OpenVPN提供了两种虚拟网络接口：通用TUN/TAP驱动，通过它们，可以建立三层IP隧道，或者虚拟二层以太网，后者可以传送任何类型的二层以太网络数据。
- 传送的数据可通过LZO算法压缩。但传输时使用lzo压缩将遭受VORACLE威胁而暴露传输资料，官方预设不使用也不建议开启此功能。

### 安全性

OpenVPN与生俱来便具备了许多安全特性：它在用户空间运行，无须对内核及网络协议栈作修改；初始完毕后以chroot方式运行，放弃root权限；使用 mlockall以防止敏感数据交换到磁盘。

OpenVPN通过PKCS#11支持硬件加密标识，如智能卡。

### 安全研究与限制

近年研究指出，OpenVPN 流量在某些情况下可能被深度封包检查（DPI）辨识，其指纹特征包括封包长度分布、握手行为与加密套件。虽然可透过外层隧道（如 Stunnel、Obfsproxy）降低可识别性，但仍可能受到严格网络环境的封锁。

在效能方面，OpenVPN 主要运作于使用者空间，并依赖加密算法与 CPU 效能，因此在低性能设备（如家用路由器）上吞吐量可能受限。以 TCP 方式运作时，由于“TCP-over-TCP meltdown”问题，效率可能低于 UDP 模式。

### 常见应用

- 企业远端存取：让员工安全连线公司内网。
- 站点对站点 VPN，用于不同分支机构间的安全连线。
- 在公共 Wi-Fi 环境中保护使用者资料传输。
- 建立个人自架 VPN，以避免 ISP 封锁或绕过地理限制。

## 版本

### 社群版本OpenVPN Community

服务器端：需使用者自行下载源代码编译、安装。

使用者端：使用OpenVPN Connect，支援Windows、Linux、Android与iOS。

### 商业版本OpenVPN Access Server

服务器端使用与社群版本相同的OpenVPN程式码，但在上层建置易于操作的网页式界面。

商业版本提供无限期2个VPN连线授权可免费试用。

商业版提供下列三种安装方式：

- 软件套件，支援Ubuntu、Debian、Redhat、CentOS。
- 虚拟机映像档，支援ESXi 5.0与Microsoft Hyper-V。
- 云端服务布署，支援Amazon AWS、Microsoft Azure、Google GCP、Digital Ocean droplets与ORACLE VPC。

### OpenVPN Cloud

提供使用者直接租用官方架设的OpenVPN Access Server，适用于不想自行安装管理主机的企业用户租用。

### Private Tunnel

提供仅需要使用VPN通道服务的个人用户直接租用。

## 受中国大陆的限制

由于OpenVPN通讯协议特征明显，当从中国大陆向境外OpenVPN服务器传输大量数据或进行频繁连接后，防火长城会封锁OpenVPN服务器所使用的TCP/UDP端口或服务器IP地址，使OpenVPN无法连接。而在敏感时期则会针对OpenVPN服务器回送证书完成握手创建有效加密连接时干扰连接，在使用TCP协议模式时握手会被连接重置，而使用UDP协议时含有服务器认证证书的数据包会被故意丢弃，使OpenVPN无法创建有效加密连接而连接失败。而在中国大陆内部的连接不受这种限制。

## 伪装的改进

- Stunnel，通过使用Stunnel转发OpenVPN流量以消除OpenVPN的协议特征，达到提供安全保护与流量伪装的目的（通常将Stunnel设置于443端口伪装成Web网站）。
- KCPtun，使用KCPtun将OpenVPN流量转为UDP流量传输，也可以消除OpenVPN的协议特征。
- SSH，使用SSH创建隧道转发OpenVPN流量，但SSH会暴露自身协议特征，故这种方式已被淘汰。

## 外部链接

- OpenVPN 项目主页
- Windows的OpenVPN-GUI 2004-2006年间，由Mathias Sundman开发使用于Windows环境的OpenVPN-GUI程式，于2.3板后已并入OpenVPN专案内
- Tunnelblick, Mac OS X的GUI
- Android的OpenVPN-Settings

## 基本资料

- 作者：James Yonan
- 开发者：OpenVPN 项目 / OpenVPN Inc.
- 发行日期：2001年5月13日
- 编程语言：C语言
- 平台：Windows XP或以上、OS X 10.8或以上、Android 4.0或以上、iOS 6或以上、Linux、*BSD
- 类型：VPN
- 许可协议：GNU通用公共许可证