amnezia-vpn/amnezia-client · 라이선스 GPL-3.0 · 언어 C++ / QML · 버전 5.0.0.5 · 플랫폼 5종 · 최신 커밋 2026-07-26 · TrendShift 데일리 19위(2026-07-29 기준) · shallow clone 소스 직접 분석)
먼저 VPN이 뭔지부터 눈높이를 맞추자. VPN(Virtual Private Network)은 내 컴퓨터와 어떤 서버 사이에 암호화된 터널을 뚫는 기술이다. 내가 보내는 모든 인터넷 트래픽이 이 터널을 지나 그 서버에서 바깥으로 나간다. 그래서 (1) 중간에 있는 통신사·와이파이 주인은 내용을 못 보고, (2) 목적지 사이트 입장에서는 내가 아니라 그 서버가 접속한 것처럼 보인다.
대부분의 VPN 앱은 "서버 목록에서 하나 골라 연결" 버튼만 있다. Amnezia에는 그 앞 단계가 하나 더 있다. 서버의 IP 주소, SSH 아이디, 비밀번호를 입력하면, 앱이 그 서버에 원격 접속해서 필요한 도구(Docker)를 깔고, 선택한 프로토콜의 VPN 서버를 컨테이너로 띄운 뒤, 접속 설정까지 자동으로 받아 온다. 사용자는 클라우드에서 월 몇 천 원짜리 가상 서버(VPS) 하나만 빌리면 된다.
상용 VPN은 정수기 렌탈이다. 회사 정수기에서 물을 받아 쓰지만, 그 회사는 내가 하루에 물을 몇 번 받는지(로그) 다 안다. 인기 브랜드 정수기는 아파트 단지에서 통째로 반입 금지(IP 차단)되기도 한다.
Amnezia는 "빈 방(내 VPS)에 찾아와 배관을 깔고 정수 시스템을 조립해 주는 설치 기사"다. 설치가 끝나면 그 방은 온전히 내 것이다. 회사가 내 사용량을 알 길이 없고, 남들은 그 방이 정수실인지조차 모른다. 게다가 이 기사는 배관을 일부러 수도관처럼 위장해서(난독화), 검문에 걸려도 "그냥 물배관인데요?" 하고 넘어가게 만든다.
이 "위장"이 Amnezia를 단순 셀프호스트 VPN 그 이상으로 만든다. 뒤에서 자세히 보겠지만, 평범한 WireGuard·OpenVPN은 DPI(심층 패킷 검사)에 쉽게 걸린다. Amnezia는 자체 프로토콜 AmneziaWG와 Xray·Cloak 같은 위장 계층을 붙여, 검열 장비가 "이건 VPN이다"라고 판단하기 어렵게 만드는 데 초점을 둔다.
Amnezia는 2020년부터 있던 프로젝트지만 꾸준히 트렌딩에 오르는 이유가 분명하다. 상용 VPN에 대한 세 가지 근본 불만을 정면으로 해결하기 때문이다.
상용 VPN을 쓰면 결국 통신사 대신 VPN 회사를 믿는 것이다. "무로그 정책"이라고 광고해도 그건 회사의 약속일 뿐이고, 실제로 로그를 넘긴 사례가 여러 번 있었다. Amnezia는 서버 자체가 내 것이라 믿어야 할 제3자가 사라진다. 로그를 남길지 말지도 내가 정한다.
검열 국가는 상용 VPN 회사의 서버 IP 대역을 통째로 블랙리스트에 올린다. 아무리 좋은 앱이어도 서버 주소가 막히면 끝이다. Amnezia로 세운 서버는 나 혼자 쓰는, 목록에 없는 새 IP라서 개별 차단이 훨씬 어렵다. 서버가 막히면 새 VPS를 파서 다시 세우면 그만이다.
최신 검열은 IP 차단을 넘어, 트래픽의 모양을 보고 VPN을 잡아낸다(DPI). WireGuard 핸드셰이크는 구조가 고정돼 있어 지문처럼 식별된다. Amnezia는 이를 정면 대응한 AmneziaWG를 자체 개발했고, 여기에 Xray(VLESS/XTLS), Cloak, Shadowsocks 같은 위장 계층을 클라이언트·서버 양쪽에 통합했다. 이 "검열 저항" 라인업의 폭이 경쟁 오픈소스 VPN(WireGuard 공식 앱, OpenVPN Connect 등) 대비 두드러진 강점이다.
| 비교 축 | 상용 VPN (NordVPN 등) | WireGuard 공식 앱 | Amnezia |
|---|---|---|---|
| 서버 소유 | 회사 소유 | 직접 준비(설정 수동) | 앱이 내 서버에 자동 설치 |
| 로그 신뢰 | 회사 약속에 의존 | 내가 통제 | 내가 통제 |
| 검열 저항 | IP 막히면 취약 | DPI에 취약 | 난독화 7종 내장 |
| 설치 난이도 | 매우 쉬움 | 중~상(수동) | 쉬움(자동화) |
| 비용 | 월 구독 | 서버 비용만 | 서버 비용만(VPS) |
요약하면 Amnezia는 "WireGuard 공식 앱의 자유도"와 "상용 VPN의 설치 편의성"을 합치고, 그 위에 검열 저항을 얹은 포지션이다. 이 조합이 정치적 긴장이 높아질 때마다 이 저장소를 다시 트렌딩으로 밀어 올린다.
Amnezia의 기술 스택은 "하나의 앱"이 아니라 세 개의 세계가 맞물린 구조다. ① 사용자가 보는 GUI 앱, ② OS 깊은 곳에서 실제 터널을 만드는 백그라운드 데몬, ③ 원격 서버에 VPN을 설치하는 셸/Docker 스크립트. 각각의 재료를 나눠 보자.
| 재료 | 역할 | 왜 이걸 골랐나 |
|---|---|---|
| Qt 6 / QML | UI 프레임워크 · 화면 선언 | C++ 하나로 데스크톱·모바일 5종 네이티브 빌드. QML은 선언형 UI 언어 |
| QtQuick Controls | 버튼·리스트 등 위젯 | client/ui/qml/Controls2에 커스텀 컴포넌트 다수 |
| MVC 컨트롤러(C++) | UI 로직 ↔ 코어 연결 | ui/controllers/가 QML에 노출되는 백엔드 객체 |
| 모듈 | 역할 |
|---|---|
core/configurators/ | 프로토콜별 접속 설정(config) 생성 — awg/openvpn/wireguard/ikev2/xray |
core/protocols/ | 각 프로토콜의 연결·상태 관리 로직 |
core/controllers/ | 연결·서버·설정·스플릿터널링 등 앱 두뇌 |
core/installers/ | 원격 서버에 컨테이너 설치 오케스트레이션 |
| libssh 0.11.3 | 서버에 SSH 접속해 명령 실행 · 설치 자동화의 핵심 |
| OpenSSL 3.6.2 | 암호화 · 인증서 처리 |
실제 암호화 터널은 검증된 외부 엔진을 Conan(C++ 패키지 매니저)으로 끌어와 플랫폼별로 다르게 링크한다. conanfile.py를 보면 OS마다 다른 바이너리를 요구하는 게 인상적이다.
| 프로토콜 | 엔진 | 성격 |
|---|---|---|
| AmneziaWG | awg-go / awg-android / awg-apple / awg-windows | WireGuard 포크 + DPI 난독화 (자체 개발) |
| OpenVPN | openvpn 2.7.0 + openvpnadapter | 고전적 검증된 프로토콜 |
| Xray | amnezia-xray-bindings / libxray | VLESS·XTLS·REALITY 위장 |
| SOCKS 터널 | tun2socks / hev-socks5-tunnel | TUN 인터페이스 ↔ SOCKS 변환 |
| IKEv2 | OS 내장(Windows) | 모바일 로밍에 강함 |
conanfile.py 하나로 "Windows면 wintun·tap-windows, iOS면 awg-apple" 식으로 플랫폼별 의존성을 조건부로 선언한다. 자체 Conan 저장소(@amnezia)에 패치된 libssh까지 올려 두는 치밀함이 보인다.
VPN은 OS의 네트워크 스택을 건드려야 하므로, 앱과 별개로 높은 권한을 가진 백그라운드 서비스(데몬)가 필요하다. Amnezia는 이 부분을 상당 부분 Mozilla VPN의 오픈소스 코드(client/mozilla/)를 기반으로 삼았다. 검증된 네트워크 감시·로컬 소켓 통신·핑 측정 로직을 재사용한 것이다.
| 플랫폼 | 구현 위치 | 특이점 |
|---|---|---|
| Windows | platforms/windows | wintun 드라이버 + 스플릿터널 필터 드라이버 |
| macOS/iOS | platforms/macos, ios | Network Extension(NE) 사용, 앱과 분리된 프로세스 |
| Linux | platforms/linux + daemon/ | 독립 데몬 프로세스가 로컬 소켓으로 통신 |
| Android | platforms/android | VpnService API, Kotlin/JNI 브릿지 |
client/server_scripts/에는 프로토콜마다 폴더가 있고, 각 폴더에 Dockerfile·configure_container.sh·run_container.sh가 들어 있다. 앱이 SSH로 이 스크립트들을 서버에 밀어 넣어 실행하면, 해당 VPN 서버가 컨테이너로 뜬다. 예를 들어 AmneziaWG용 Dockerfile은 자체 베이스 이미지 amneziavpn/amneziawg-go 위에 커널 네트워크 튜닝까지 얹는다.
# client/server_scripts/awg/Dockerfile (발췌)
FROM amneziavpn/amneziawg-go:latest
RUN apk add --no-cache bash curl dumb-init
# 대역폭·동시접속을 위한 커널 파라미터 튜닝
net.core.rmem_max = 67108864
net.ipv4.tcp_fastopen = 3
net.ipv4.ip_local_port_range = 10000 65000
정리하면 재료는 Qt/QML(얼굴) → C++ 코어(두뇌) → Conan으로 주입된 프로토콜 엔진(근육) → OS 데몬(척수) → 서버 Docker 스크립트(원격 공장) 순으로 쌓인다. 하나의 저장소가 클라이언트 앱과 서버 설치 자동화를 동시에 품고 있다는 게 가장 큰 구조적 특징이다.
Amnezia의 아키텍처를 이해하는 열쇠는 "권한 분리"다. VPN은 OS의 네트워크를 통째로 바꾸는 위험한 작업이라, 이 권한을 UI 앱이 직접 갖고 있으면 보안상 최악이다. 그래서 세 개의 층으로 나눈다.
daemonlocalserver(로컬 소켓)로 대화한다. GUI가 탈취돼도 데몬 프로토콜만 지키면 시스템 전체가 뚫리진 않는 구조다.
Amnezia의 가장 독특한 기능이 이것이다. core/installers/와 core/controllers/가 협력해 다음을 순서대로 수행한다.
핵심은 이 모든 원격 작업이 "셸 스크립트 + Docker"라는 이식성 높은 조합으로 짜였다는 점이다. 서버 쪽에 Amnezia 전용 소프트웨어를 미리 깔 필요가 없다. 빈 Ubuntu VPS 하나면 앱이 알아서 공장을 짓는다. 이 설계 덕에 사용자는 리눅스 서버 관리를 몰라도 된다.
이미 설치된 서버에 붙을 때는 데몬이 주인공이다. GUI는 직접 네트워크를 못 만지고, 데몬에게 "이 설정으로 터널 열어줘"라고 부탁만 한다.
// 개념 코드 — connectionController가 하는 일
auto config = configurator.generate(server, protocol); // 설정 생성
daemon.request("activate", config); // 데몬에 권한 위임
// ↓ 여기서부터는 root 권한 데몬의 영역
tun = createTunInterface(); // 가상 네트워크 카드 생성
routingTable.redirectAll(tun); // 모든 트래픽을 터널로
protocolEngine.start(config); // awg-go / openvpn 등 구동
GUI 앱은 프런트 데스크 직원이다. 손님(사용자) 요청을 받아 적지만, 금고(네트워크 스택)는 못 연다. 데몬은 금고 열쇠를 가진 매니저다. 직원이 정해진 양식(로컬 소켓 프로토콜)으로 요청하면 매니저가 금고를 연다. 직원이 사기꾼에게 매수돼도, 매니저는 양식에 맞는 요청만 처리하니 피해가 제한된다 — 이게 권한 분리의 실전 이득이다.
구조를 읽는 요령: 별표(★)를 단 다섯 폴더만 이해하면 90%가 보인다. core는 두뇌, daemon은 실제 손, ui는 얼굴, server_scripts는 원격 공장, platforms는 OS별 어댑터다. 나머지(common·ipc·deploy)는 이들을 잇는 접착제다.
번역 폴더에 러시아어·페르시아어·미얀마어·아랍어가 1급으로 관리된다. 이건 단순 국제화가 아니라 프로젝트의 실제 사용자층을 그대로 보여준다. 코드 구조만큼이나 "누가 이걸 절박하게 쓰는가"를 읽을 수 있는 대목이다.
Qt/QML + C++의 최대 강점이 여기 있다. UI(QML)와 로직(C++)을 공유하고, OS마다 다른 부분만 platforms/에 격리했다. "공통 로직은 위로, 플랫폼 차이는 아래로"라는 크로스플랫폼 설계의 교과서적 예시다. React Native·Flutter를 쓰지 않고도 네이티브 성능을 얻는 대안 경로를 볼 수 있다.
보안이 중요한 데스크톱 앱은 거의 다 이 패턴을 쓴다. Docker Desktop, 백업 앱, 시스템 유틸이 전부 "권한 없는 UI + 권한 있는 헬퍼 데몬 + 둘 사이 IPC"로 짜인다. Amnezia의 daemon/과 ipc/는 이 패턴의 읽기 좋은 실물 표본이다.
Amnezia는 암호화를 직접 구현하지 않는다. OpenVPN·WireGuard·Xray·OpenSSL 같은 이미 검증된 엔진을 가져와 Conan으로 링크하고, 자기 부가가치는 "설치 자동화 + 위장 계층 + 통합 UI"에 집중한다. 보안 소프트웨어에서 "직접 짜지 말고 검증된 걸 조립하라"는 원칙의 모범이다.
configurators/ · protocols/ · server_scripts/가 프로토콜 이름으로 대칭을 이룬다. 새 프로토콜을 추가하려면 세 곳에 같은 이름의 짝을 만들면 된다. 이 대칭적 확장점 설계는 규모가 커지는 프로젝트에서 배울 만한 조직화 방식이다.
Qt + Conan + 플랫폼별 네이티브 툴체인 조합은 초심자가 로컬 빌드를 성공시키기까지 진입장벽이 상당하다. 단순히 "코드 읽고 배우기"엔 좋지만, "고쳐서 빌드해 보기"는 각 OS SDK·Qt 설치·Conan 설정을 요구한다.
서버가 내 것이라 회사를 안 믿어도 되지만, 반대로 서버 보안·업데이트·법적 책임이 전부 사용자 몫이 된다. VPS 제공사가 로그를 볼 수 있고, 서버 관리를 잘못하면 오히려 더 취약해질 수 있다. "셀프호스트 = 무조건 안전"이 아니라는 점은 명확히 인지해야 한다.
이 도구는 검열 우회에 초점이 있지만, VPN 사용·운영이 법으로 제한되는 지역이 있다. 학습·연구 목적으로 구조를 이해하는 것과 실제 배포·사용은 각자 관할 법령을 확인할 책임이 따른다.
| 플랫폼 | 최소 요건 |
|---|---|
| Windows | Windows 10 이상 (64-bit), wintun 드라이버 자동 설치 |
| macOS | macOS 11+ , Apple Silicon/Intel 모두 |
| Linux | 주요 배포판 (AppImage/deb 제공), systemd 데몬 |
| Android | Android 8.0(API 26) 이상 추정, VpnService 지원 |
| iOS | iOS 15+ , Network Extension 권한 |
클라이언트는 사양을 거의 안 탄다. 일반적인 최신 스마트폰·PC면 충분하다.
| 항목 | 권장 |
|---|---|
| OS | Ubuntu / Debian 계열 (Docker 설치 가능한 리눅스) |
| 사양 | 1 vCPU · RAM 1GB면 개인용 충분 (프로토콜 여러 개면 여유 있게) |
| 권한 | root 또는 sudo 가능한 SSH 계정 |
| 네트워크 | 공인 IP 1개, 방화벽에서 프로토콜 포트 개방 |
가장 먼저 할 것. 저렴한 VPS를 하나 빌려 Amnezia 앱으로 AmneziaWG 서버를 설치하고 연접해 본다. 이 과정에서 "앱이 SSH로 뭘 하는지"를 서버의 docker ps·journalctl로 관찰하면, 3장·4장 내용이 눈으로 들어온다.
server_scripts/openvpn/의 Dockerfile → configure_container.sh → run_container.sh를 순서대로 읽는다. "설치 자동화가 마법이 아니라 잘 정리된 셸 스크립트"라는 걸 체감하는 게 목표다. 다른 프로토콜 폴더와 비교하면 대칭 구조가 보인다.
QML의 연결 버튼에서 시작해 ui/controllers/connectionUiController → core/controllers/connectionController → 데몬 요청까지 호출 경로를 그려 본다. IDE의 "정의로 이동"을 따라가며 4장의 흐름 B를 실제 코드로 확인하는 실습이다.
서버 쪽에서 tcpdump로 평범한 WireGuard와 AmneziaWG의 패킷을 각각 캡처해 비교한다. "난독화가 실제로 패킷 첫 바이트를 어떻게 바꾸는지"를 눈으로 보는 것. DPI가 왜 어려워지는지 직관이 생긴다.
가상의 프로토콜 "Foo"를 추가하려면 configurators/·protocols/·server_scripts/ 세 곳에 각각 무엇을 만들어야 하는지 목록으로 정리한다. 실제 빌드까진 안 가더라도, 이 대칭 확장 구조를 문서화하는 것만으로 아키텍처 이해가 크게 는다.
| 주차 | 주제 | 구체적 할 일 |
|---|---|---|
| 1주차 | VPN·터널의 원리 | TUN/TAP 인터페이스, 라우팅 테이블, WireGuard vs OpenVPN의 차이 이해. 직접 WireGuard를 수동 설정해 보기 |
| 2주차 | 검열 저항 · 난독화 | DPI가 뭘 보는지, Shadowsocks·Cloak·Xray(VLESS/REALITY)가 어떻게 위장하는지. AmneziaWG 문서 정독 |
| 3주차 | Qt/QML 크로스플랫폼 | QML 기초 튜토리얼, C++ ↔ QML 바인딩, 작은 Qt 앱 하나 만들어 보기. Amnezia의 ui/ 읽기 |
| 4주차 | 권한 분리 · IPC · Docker | 데몬/서비스 패턴, 로컬 소켓 IPC, Dockerfile 작성. daemon/·server_scripts/ 정독 |
순서를 지키는 게 중요하다. VPN 원리(1주) → 왜 위장이 필요한가(2주)를 먼저 잡지 않으면, 3~4주차의 코드가 "왜 이렇게까지 복잡한가"를 이해하지 못한 채 표면만 훑게 된다. Amnezia의 복잡도 대부분은 "검열을 뚫는다"는 목적에서 나온다.
| 용어 | 한 줄 뜻 |
|---|---|
| 셀프호스트(Self-host) | 서비스를 남에게 빌리지 않고 내 서버에 직접 올려 운영하는 방식 |
| VPS | 클라우드에서 빌리는 작은 리눅스 서버 한 대 |
| DPI | 패킷 내용물 패턴까지 뜯어보는 심층 검열 기법 |
| 난독화(Obfuscation) | VPN 트래픽을 평범한 트래픽처럼 위장해 DPI를 속이는 기술 |
| AmneziaWG | WireGuard를 포크해 DPI 저항성을 더한 자체 프로토콜 |
| WireGuard | 빠르고 간결한 현대 VPN 프로토콜(핸드셰이크가 식별되기 쉬움) |
| Xray / VLESS / REALITY | HTTPS로 위장하는 고급 우회 프로토콜 계열 |
| Cloak · Shadowsocks | 중국발 검열 우회에서 출발한 트래픽 위장 도구 |
| 데몬 / 시스템 서비스 | 화면 없이 배경에서 도는 권한 있는 프로그램 |
| IPC | 프로세스 간 통신 — 여기선 GUI ↔ 데몬 대화 |
| TUN 인터페이스 | OS에 만드는 가상 네트워크 카드, 터널의 입구 |
| Qt / QML | C++ 기반 크로스플랫폼 UI 프레임워크와 그 선언형 UI 언어 |
| Conan | C++ 패키지 매니저 — 플랫폼별 의존성 관리 |
| 스플릿 터널링 | 일부 앱·사이트만 VPN을 태우고 나머지는 직접 나가게 하는 기능 |