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通用公共許可證