Erebus: 一個無須 Root 權限的使用者空間 VPN Proxy
Erebus 在受限環境中實現無須 Root 權限的 VPN 連線
Erebus 是一個使用者空間的 VPN proxy,允許使用者在不需要 root 權限或修改主機網路堆疊的情況下建立 VPN 連線。透過在單一程序中完全實作 OpenVPN 協定與 TCP/IP 堆疊,Erebus 繞過了對核心 tun/tap 介面與路由表修改的需求,使其非常適合無法取得 sudo 權限的環境,例如 CI runners、sandboxes 與未經授權的 containers。
架構:將 VPN 堆疊移至使用者空間
Erebus 使用其內部的邏輯取代了傳統基於核心的路由與 TCP 處理。該工具唯一需要的系統權限僅為開啟標準網路 socket 的能力。
資料流向
當發出請求時,資料會遵循以下路徑:
- Local HTTP Client: 一個客戶端應用程式指向本地的 Erebus proxy。
- HTTP Proxy: Erebus 接受並轉發請求。
- User-Space TCP/IP Stack: 程序手動建構並解析 IPv4、TCP 與 ICMP packets。
- Encryption: 使用 OpenVPN static-key (wire format v1) 協定進行加密,並套用 HMAC 與 packet IDs。
- Transport: 加密後的資料會以 UDP datagram 或 TCP frame 的形式傳送到 OpenVPN server。
主要功能與能力
無須 Root 權限的操作
Erebus 不需要 sudo 權限,不需要設定腳本,也不會更動主機的 interfaces、routes 或 DNS settings。它可以作為標準的使用者程序啟動與停止。
選用式流量路由
連線是明確指定的,而非系統全域性的。使用者必須將特定的應用程式指向本地 proxy 以透過 VPN 路由流量。
- Outbound: 本地 HTTP/1.x proxy 會將請求轉發至 VPN 上的資源。
- Inbound: Port forwards 會將本地服務雙向地暴露給 VPN peers。
協定支援
- OpenVPN: 支援透過 UDP 或 TCP 使用 static-key mode (pre-shared key)。它支援 CBC ciphers (AES, ARIA, Camellia) 與各種 HMAC digests。
- IPsec: 包含一個 IKEv2 control plane 與一個與 strongSwan 互操作的 ESP data plane。由於無須 Root 權限的程序無法發送 raw ESP,所有流量皆透過 pre-shared keys 使用 UDP-encapsulated (NAT-T) 進行封裝。
使用與安裝
Erebus 是使用 Common Lisp (SBCL) 編寫的,並以 Debian package 的形式提供給 Debian/Ubuntu 衍生版本使用。
快速開始設定
一個用於 outbound UDP proxy 的最小化設定檔定義在 INI file 中:
[erebus]
client-ip = 10.8.0.2
[openvpn-server]
proto = udp
host = vpn.example.com
port = 1194
secret = /etc/erebus/static.key
cipher = AES-256-CBC
auth = SHA256
[proxy-out]
address = 127.0.0.1
port = 11023
若要使用該 proxy,使用者可以透過命令列進行流量路由:
http_proxy=http://127.0.0.1:11023 curl http://10.8.0.1/
效能與限制
Erebus 是一個早期階段的實驗性專案,其優先考量的是正確性與清晰度,而非效能。
使用場景適用性
| Ideal For | Not Ideal For |
| :--- | :--- | |
| Internal HTTP services in unprivileged containers | System-wide VPN routing |
| CI jobs needing private endpoints | Bulk data transfer |
| Sandboxed or multi-tenant hosts | TLS-mode OpenVPN (certificates) |
| Exposing a single local port to a VPN peer | HTTPS CONNECT tunneling or SOCKS |
效能權衡
由於實作方式是每次發送一個片段並等待確認後才發送下一個,因此大型下載的速度會明顯慢於標準 proxy。這種設計選擇確保了程式碼的簡單性與互操作性。