Erebus: 루트 권한이 필요 없는 사용자 공간 VPN 프록시
Erebus는 제한된 환경에서 루트 권한 없는 VPN 연결을 가능하게 합니다
Erebus는 루트 권한을 요구하거나 호스트의 네트워킹 스택을 수정하지 않고도 사용자가 VPN 연결을 설정할 수 있도록 하는 사용자 공간 VPN 프록시입니다. OpenVPN 프로토콜과 TCP/IP 스택을 단일 프로세스 내에서 완전히 구현함으로써, Erebus는 커널 tun/tap 인터페이스와 라우팅 테이블 수정의 필요성을 우회합니다. 이는 CI runner, sandbox, 권한이 없는 컨테이너와 같이 sudo 액세스가 불가능한 환경에 이상적입니다.
아키텍처: VPN 스택을 사용자 공간으로 이동
Erebus는 전통적인 커널 기반 라우팅 및 TCP 처리를 자체 내부 로직으로 대체합니다. 이 도구에 필요한 유일한 시스템 권한은 표준 네트워크 소켓을 열 수 있는 능력입니다.
데이터 흐름
요청이 발생하면 데이터는 다음 경로를 따릅니다:
- Local HTTP Client: 클라이언트 애플리케이션이 로컬 Erebus 프록시를 가리킵니다.
- HTTP Proxy: Erebus가 요청을 수락하고 전달합니다.
- User-Space TCP/IP Stack: 프로세스가 IPv4, TCP, ICMP 패킷을 직접 구축하고 파싱합니다.
- Encryption: 패킷은 OpenVPN static-key (wire format v1) 프로토콜을 사용하여 HMAC 및 패킷 ID를 적용하여 암호화됩니다.
- Transport: 암호화된 데이터는 UDP datagram 또는 TCP frame으로 OpenVPN 서버로 전송됩니다.
주요 기능 및 역량
루트 권한 없는 운영
Erebus는 sudo 권한, 설정 스크립트가 필요하지 않으며 호스트의 인터페이스, 경로 또는 DNS 설정을 건드리지 않습니다. 표준 사용자 프로세스로 시작하고 중단할 수 있습니다.
선택적 트래픽 라우팅
연결성은 시스템 전체가 아닌 명시적입니다. 사용자는 특정 애플리케이션이 VPN을 통해 트래픽을 라우팅하도록 로컬 프록시를 가리키도록 해야 합니다.
- Outbound: 로컬 HTTP/1.x 프록시가 VPN의 리소스에 대한 요청을 전달합니다.
- Inbound: 포트 포워딩을 통해 로컬 서비스를 VPN 피어에게 양방향으로 노출합니다.
프로토콜 지원
- OpenVPN: UDP 또는 TCP를 통해 static-key 모드 (pre-shared key)를 지원합니다. CBC ciphers (AES, ARIA, Camellia) 및 다양한 HMAC digest를 지원합니다.
- IPsec: IKEv2 제어 평면과 strongSwan과 상호 운용되는 ESP 데이터 평면을 포함합니다. 루트 권한 없는 프로세스는 raw ESP를 보낼 수 없으므로, 모든 트래픽은 pre-shared key를 사용하여 UDP-encapsulated (NAT-T) 방식으로 처리됩니다.
사용법 및 설치
Erebus는 Common Lisp (SBCL)로 작성되었으며 Debian/Ubuntu 계열을 위한 Debian 패키지로 배配布됩니다.
빠른 시작 설정
아웃바운드 UDP 프록시를 위한 최소 설정은 INI 파일에 정의됩니다:
[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
프록시를 사용하려면 사용자는 명령줄을 통해 트래픽을 라우팅할 수 있습니다:
http_proxy=http://127.0.0.1:11023 curl http://10.8.0.1/
성능 및 제한 사항
Erebus는 성능보다 정확성과 명확성을 우선시하는 초기 단계의 실험적 프로젝트입니다.
사용 사례 적합성
| Ideal For | Not Ideal For |
|---|---|
| 권한이 없는 컨테이너 내의 내부 HTTP 서비스 | 시스템 전체 VPN 라우팅 |
| 프라이빗 엔드포인트를 필요로 하는 CI jobs | 대용량 데이터 전송 |
| 샌드박스 또는 멀티테넌트 호스트 | TLS-mode OpenVPN (certificates) |
| 단일 로컬 포트를 VPN 피어에게 노출 | HTTPS CONNECT 터널링 또는 SOCKS |
성능 트레이드오프
구현 방식이 데이터를 한 번에 하나씩 보내고 다음을 보내기 전에 확인을 기다리기 때문에, 대용량 다운로드는 표준 프록시보다 현저히 느립니다. 이 설계 선택은 코드의 단순성과 상호 운용성을 보장합니다.