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 的能力。

資料流向

當發出請求時,資料會遵循以下路徑:

  1. Local HTTP Client: 一個客戶端應用程式指向本地的 Erebus proxy。
  2. HTTP Proxy: Erebus 接受並轉發請求。
  3. User-Space TCP/IP Stack: 程序手動建構並解析 IPv4、TCP 與 ICMP packets。
  4. Encryption: 使用 OpenVPN static-key (wire format v1) 協定進行加密,並套用 HMAC 與 packet IDs。
  5. 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。這種設計選擇確保了程式碼的簡單性與互操作性。

Sources