REPO DEEP DIVE · 2026-07-29 · AMNEZIA-VPN/AMNEZIA-CLIENT · 셀프호스트 VPN

amnezia-vpn/amnezia-client 딥다이브
내 서버에 내 VPN을 심는, 검열을 뚫도록 설계된 오픈소스 VPN

AmneziaVPN은 오픈소스 VPN 클라이언트다. 그런데 보통의 VPN 앱과 결정적으로 다른 점이 하나 있다 — 앱이 당신의 빈 서버에 SSH로 접속해, VPN 서버를 Docker 컨테이너로 자동 설치하고 곧바로 연결한다. 즉 "가입해서 남의 VPN을 빌려 쓰는" 게 아니라, "내가 산 서버를 30초 만에 나만의 VPN으로 만드는" 도구다.

이게 왜 중요한가? 상용 VPN은 회사가 로그를 쥐고 있고, 유명 VPN의 IP 대역은 검열 국가에서 통째로 차단된다. Amnezia는 서버도 내 것, 로그도 없음, IP도 나만 아는 주소라서 막기가 훨씬 어렵다. 여기에 더해 트래픽 자체를 "VPN처럼 안 보이게" 위장하는 난독화(obfuscation) 프로토콜을 대거 얹었다. 러시아·이란·미얀마 사용자를 위한 텔레그램 지원 채널을 따로 운영할 만큼, 이 프로젝트의 핵심 목적은 검열 우회다.

기술적으로는 C++17 + Qt/QML 데스크톱·모바일 앱이다. Windows·macOS·Linux·Android·iOS 5개 플랫폼을 하나의 코드베이스로 커버하고, 프로토콜은 OpenVPN·WireGuard·IKEv2에 더해 자체 개발한 AmneziaWG·Xray·Cloak·Shadowsocks까지 7종을 지원한다. 빌드는 CMake + Conan, 서버 설치 스크립트는 프로토콜별 Docker 이미지로 관리된다.

(저장소 amnezia-vpn/amnezia-client · 라이선스 GPL-3.0 · 언어 C++ / QML · 버전 5.0.0.5 · 플랫폼 5종 · 최신 커밋 2026-07-26 · TrendShift 데일리 19위(2026-07-29 기준) · shallow clone 소스 직접 분석)
목차
  1. 프로젝트 한 줄 요약
  2. 왜 지금 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석 — 앱·데몬·서버 3층 구조
  5. 디렉토리 구조 해부
  6. 학습 포인트 — 설계 교훈과 솔직한 한계
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한 줄 요약

"VPN을 빌리는 대신, 빈 서버 하나를 나만의 VPN으로 개조하는 리모컨"

먼저 VPN이 뭔지부터 눈높이를 맞추자. VPN(Virtual Private Network)은 내 컴퓨터와 어떤 서버 사이에 암호화된 터널을 뚫는 기술이다. 내가 보내는 모든 인터넷 트래픽이 이 터널을 지나 그 서버에서 바깥으로 나간다. 그래서 (1) 중간에 있는 통신사·와이파이 주인은 내용을 못 보고, (2) 목적지 사이트 입장에서는 내가 아니라 그 서버가 접속한 것처럼 보인다.

용어 풀이
VPN 클라이언트 vs VPN 서버
서버는 터널의 반대쪽 끝, 실제로 바깥 인터넷으로 나가 주는 컴퓨터다. 클라이언트는 내 기기에서 도는 앱으로, 서버에 붙어 터널을 여는 쪽이다. 상용 VPN은 회사가 서버 수천 대를 운영하고 당신에게 클라이언트만 준다. Amnezia는 클라이언트를 주되, 서버는 당신이 직접 소유하도록 만든다.

대부분의 VPN 앱은 "서버 목록에서 하나 골라 연결" 버튼만 있다. Amnezia에는 그 앞 단계가 하나 더 있다. 서버의 IP 주소, SSH 아이디, 비밀번호를 입력하면, 앱이 그 서버에 원격 접속해서 필요한 도구(Docker)를 깔고, 선택한 프로토콜의 VPN 서버를 컨테이너로 띄운 뒤, 접속 설정까지 자동으로 받아 온다. 사용자는 클라우드에서 월 몇 천 원짜리 가상 서버(VPS) 하나만 빌리면 된다.

핵심 비유

"정수기 렌탈 대신, 빈 방에 정수 시스템을 직접 설치해 주는 기사(技師) 앱"

상용 VPN은 정수기 렌탈이다. 회사 정수기에서 물을 받아 쓰지만, 그 회사는 내가 하루에 물을 몇 번 받는지(로그) 다 안다. 인기 브랜드 정수기는 아파트 단지에서 통째로 반입 금지(IP 차단)되기도 한다.

Amnezia는 "빈 방(내 VPS)에 찾아와 배관을 깔고 정수 시스템을 조립해 주는 설치 기사"다. 설치가 끝나면 그 방은 온전히 내 것이다. 회사가 내 사용량을 알 길이 없고, 남들은 그 방이 정수실인지조차 모른다. 게다가 이 기사는 배관을 일부러 수도관처럼 위장해서(난독화), 검문에 걸려도 "그냥 물배관인데요?" 하고 넘어가게 만든다.

이 "위장"이 Amnezia를 단순 셀프호스트 VPN 그 이상으로 만든다. 뒤에서 자세히 보겠지만, 평범한 WireGuard·OpenVPN은 DPI(심층 패킷 검사)에 쉽게 걸린다. Amnezia는 자체 프로토콜 AmneziaWG와 Xray·Cloak 같은 위장 계층을 붙여, 검열 장비가 "이건 VPN이다"라고 판단하기 어렵게 만드는 데 초점을 둔다.

2왜 지금 주목받는가

셀프호스트 · 무로그 · 검열 저항 — 세 가지가 한 앱에

Amnezia는 2020년부터 있던 프로젝트지만 꾸준히 트렌딩에 오르는 이유가 분명하다. 상용 VPN에 대한 세 가지 근본 불만을 정면으로 해결하기 때문이다.

① "VPN 회사를 믿어야 한다"는 문제를 없앤다

상용 VPN을 쓰면 결국 통신사 대신 VPN 회사를 믿는 것이다. "무로그 정책"이라고 광고해도 그건 회사의 약속일 뿐이고, 실제로 로그를 넘긴 사례가 여러 번 있었다. Amnezia는 서버 자체가 내 것이라 믿어야 할 제3자가 사라진다. 로그를 남길지 말지도 내가 정한다.

② 유명 VPN이 통째로 차단되는 상황을 우회한다

검열 국가는 상용 VPN 회사의 서버 IP 대역을 통째로 블랙리스트에 올린다. 아무리 좋은 앱이어도 서버 주소가 막히면 끝이다. Amnezia로 세운 서버는 나 혼자 쓰는, 목록에 없는 새 IP라서 개별 차단이 훨씬 어렵다. 서버가 막히면 새 VPS를 파서 다시 세우면 그만이다.

③ "VPN인 걸 들키는" 문제까지 건드린다

최신 검열은 IP 차단을 넘어, 트래픽의 모양을 보고 VPN을 잡아낸다(DPI). WireGuard 핸드셰이크는 구조가 고정돼 있어 지문처럼 식별된다. Amnezia는 이를 정면 대응한 AmneziaWG를 자체 개발했고, 여기에 Xray(VLESS/XTLS), Cloak, Shadowsocks 같은 위장 계층을 클라이언트·서버 양쪽에 통합했다. 이 "검열 저항" 라인업의 폭이 경쟁 오픈소스 VPN(WireGuard 공식 앱, OpenVPN Connect 등) 대비 두드러진 강점이다.

용어 풀이
DPI (Deep Packet Inspection, 심층 패킷 검사)
통신 장비가 지나가는 데이터의 겉봉투(주소)만 보는 게 아니라 내용물의 패턴까지 뜯어보는 검열 기법이다. "이 패킷의 첫 몇 바이트가 WireGuard 핸드셰이크 모양이네 → 차단" 같은 식으로 동작한다. 난독화 프로토콜은 이 패턴을 무작위화하거나 평범한 HTTPS처럼 꾸며 DPI를 속인다.
비교 축상용 VPN (NordVPN 등)WireGuard 공식 앱Amnezia
서버 소유회사 소유직접 준비(설정 수동)앱이 내 서버에 자동 설치
로그 신뢰회사 약속에 의존내가 통제내가 통제
검열 저항IP 막히면 취약DPI에 취약난독화 7종 내장
설치 난이도매우 쉬움중~상(수동)쉬움(자동화)
비용월 구독서버 비용만서버 비용만(VPS)

요약하면 Amnezia는 "WireGuard 공식 앱의 자유도"와 "상용 VPN의 설치 편의성"을 합치고, 그 위에 검열 저항을 얹은 포지션이다. 이 조합이 정치적 긴장이 높아질 때마다 이 저장소를 다시 트렌딩으로 밀어 올린다.

3기술 스택 전체 지도

C++/Qt 단일 코드베이스로 5개 OS + 커널 데몬 + 서버 스크립트까지

Amnezia의 기술 스택은 "하나의 앱"이 아니라 세 개의 세계가 맞물린 구조다. ① 사용자가 보는 GUI 앱, ② OS 깊은 곳에서 실제 터널을 만드는 백그라운드 데몬, ③ 원격 서버에 VPN을 설치하는 셸/Docker 스크립트. 각각의 재료를 나눠 보자.

프론트엔드 (GUI 계층)

재료역할왜 이걸 골랐나
Qt 6 / QMLUI 프레임워크 · 화면 선언C++ 하나로 데스크톱·모바일 5종 네이티브 빌드. QML은 선언형 UI 언어
QtQuick Controls버튼·리스트 등 위젯client/ui/qml/Controls2에 커스텀 컴포넌트 다수
MVC 컨트롤러(C++)UI 로직 ↔ 코어 연결ui/controllers/가 QML에 노출되는 백엔드 객체
용어 풀이
QML (Qt Modeling Language)
Qt가 만든 선언형 UI 언어다. HTML/CSS처럼 "버튼은 여기, 리스트는 저기" 하고 화면 모양을 적으면, 무거운 로직은 C++이 맡는다. 웹의 React가 JSX로 UI를 그리고 JS로 로직을 짜듯, Amnezia는 QML로 화면을, C++로 VPN 엔진을 나눴다.

코어 · 백엔드 (C++17 엔진)

모듈역할
core/configurators/프로토콜별 접속 설정(config) 생성 — awg/openvpn/wireguard/ikev2/xray
core/protocols/각 프로토콜의 연결·상태 관리 로직
core/controllers/연결·서버·설정·스플릿터널링 등 앱 두뇌
core/installers/원격 서버에 컨테이너 설치 오케스트레이션
libssh 0.11.3서버에 SSH 접속해 명령 실행 · 설치 자동화의 핵심
OpenSSL 3.6.2암호화 · 인증서 처리

VPN 프로토콜 엔진 (Conan으로 주입되는 네이티브 라이브러리)

실제 암호화 터널은 검증된 외부 엔진을 Conan(C++ 패키지 매니저)으로 끌어와 플랫폼별로 다르게 링크한다. conanfile.py를 보면 OS마다 다른 바이너리를 요구하는 게 인상적이다.

프로토콜엔진성격
AmneziaWGawg-go / awg-android / awg-apple / awg-windowsWireGuard 포크 + DPI 난독화 (자체 개발)
OpenVPNopenvpn 2.7.0 + openvpnadapter고전적 검증된 프로토콜
Xrayamnezia-xray-bindings / libxrayVLESS·XTLS·REALITY 위장
SOCKS 터널tun2socks / hev-socks5-tunnelTUN 인터페이스 ↔ SOCKS 변환
IKEv2OS 내장(Windows)모바일 로밍에 강함
용어 풀이
Conan
C++ 세계의 패키지 매니저다. Node의 npm, 파이썬의 pip에 해당한다. C++은 표준 패키지 시스템이 없어 라이브러리 관리가 악명 높은데, Amnezia는 conanfile.py 하나로 "Windows면 wintun·tap-windows, iOS면 awg-apple" 식으로 플랫폼별 의존성을 조건부로 선언한다. 자체 Conan 저장소(@amnezia)에 패치된 libssh까지 올려 두는 치밀함이 보인다.

플랫폼 통합 계층 (OS의 깊은 곳)

VPN은 OS의 네트워크 스택을 건드려야 하므로, 앱과 별개로 높은 권한을 가진 백그라운드 서비스(데몬)가 필요하다. Amnezia는 이 부분을 상당 부분 Mozilla VPN의 오픈소스 코드(client/mozilla/)를 기반으로 삼았다. 검증된 네트워크 감시·로컬 소켓 통신·핑 측정 로직을 재사용한 것이다.

플랫폼구현 위치특이점
Windowsplatforms/windowswintun 드라이버 + 스플릿터널 필터 드라이버
macOS/iOSplatforms/macos, iosNetwork Extension(NE) 사용, 앱과 분리된 프로세스
Linuxplatforms/linux + daemon/독립 데몬 프로세스가 로컬 소켓으로 통신
Androidplatforms/androidVpnService API, Kotlin/JNI 브릿지

서버 프로비저닝 계층 (셸 + Docker)

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 스크립트(원격 공장) 순으로 쌓인다. 하나의 저장소가 클라이언트 앱과 서버 설치 자동화를 동시에 품고 있다는 게 가장 큰 구조적 특징이다.

4아키텍처 심화 분석 — 앱·데몬·서버 3층 구조

권한을 세 겹으로 나눈 이유와, 설치가 실제로 도는 순서

Amnezia의 아키텍처를 이해하는 열쇠는 "권한 분리"다. VPN은 OS의 네트워크를 통째로 바꾸는 위험한 작업이라, 이 권한을 UI 앱이 직접 갖고 있으면 보안상 최악이다. 그래서 세 개의 층으로 나눈다.

┌──────────────────────────────────────────────────────────┐ │ [1] GUI 앱 (사용자 권한) │ │ QML 화면 ─ ui/controllers ─ core/controllers │ │ "연결해줘", "서버 설치해줘" 같은 의도만 만든다 │ └───────────────┬──────────────────────┬───────────────────┘ │ 로컬 소켓 │ SSH (libssh) │ (권한 상승 요청) │ ▼ ▼ ┌───────────────────────────┐ ┌──────────────────────────┐ │ [2] 시스템 데몬/서비스 │ │ [3] 원격 VPS (내 서버) │ │ (관리자/root 권한) │ │ │ │ · TUN 인터페이스 생성 │ │ server_scripts 실행: │ │ · 라우팅 테이블 수정 │ │ install_docker.sh │ │ · 프로토콜 엔진 구동 │ │ build_container.sh │ │ = 실제 터널을 여는 손 │ │ → awg/openvpn/xray 컨테이너│ └───────────────────────────┘ └──────────────────────────┘
용어 풀이
데몬 (daemon) · 시스템 서비스
화면 없이 배경에서 계속 도는 프로그램이다. VPN은 앱을 껐다 켜도 연결이 유지돼야 하고 root 권한이 필요하므로, GUI와 분리된 데몬이 실제 네트워크 작업을 맡는다. Amnezia에서 GUI ↔ 데몬은 daemonlocalserver(로컬 소켓)로 대화한다. GUI가 탈취돼도 데몬 프로토콜만 지키면 시스템 전체가 뚫리진 않는 구조다.

흐름 A — "서버 자동 설치"가 실제로 도는 순서

Amnezia의 가장 독특한 기능이 이것이다. core/installers/core/controllers/가 협력해 다음을 순서대로 수행한다.

사용자: IP + SSH 계정 + 프로토콜 선택 │ ▼ ① libssh로 서버에 SSH 접속 │ ▼ ② check_server.sh 실행 → OS/권한/기존 컨테이너 확인 │ ▼ ③ install_docker.sh → Docker 미설치 시 자동 설치 │ ▼ ④ 선택 프로토콜 폴더의 Dockerfile을 서버로 전송 │ build_container.sh → 이미지 빌드 · 컨테이너 기동 ▼ ⑤ configure_container.sh → 키/인증서 생성, 서버 설정 확정 │ ▼ ⑥ 클라이언트용 config를 서버에서 받아와 저장 → 연결

핵심은 이 모든 원격 작업이 "셸 스크립트 + Docker"라는 이식성 높은 조합으로 짜였다는 점이다. 서버 쪽에 Amnezia 전용 소프트웨어를 미리 깔 필요가 없다. 빈 Ubuntu VPS 하나면 앱이 알아서 공장을 짓는다. 이 설계 덕에 사용자는 리눅스 서버 관리를 몰라도 된다.

흐름 B — "연결"이 도는 순서 (권한 상승의 순간)

이미 설치된 서버에 붙을 때는 데몬이 주인공이다. 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 앱은 프런트 데스크 직원이다. 손님(사용자) 요청을 받아 적지만, 금고(네트워크 스택)는 못 연다. 데몬은 금고 열쇠를 가진 매니저다. 직원이 정해진 양식(로컬 소켓 프로토콜)으로 요청하면 매니저가 금고를 연다. 직원이 사기꾼에게 매수돼도, 매니저는 양식에 맞는 요청만 처리하니 피해가 제한된다 — 이게 권한 분리의 실전 이득이다.

5디렉토리 구조 해부

저장소 최상위부터 client 내부까지, 어디에 뭐가 사는가
amnezia-client/ ├── CMakeLists.txt ← 빌드 진입점 (버전 5.0.0.5 선언) ├── conanfile.py ← 플랫폼별 프로토콜 엔진 의존성 ├── client/ ← 앱 본체 (거의 모든 코드) │ ├── main.cpp ← 앱 시작점 │ ├── amneziaApplication ← 앱 전역 객체 · 초기화 │ ├── core/ ← ★ VPN 엔진 (두뇌) │ │ ├── configurators/ ← 프로토콜별 설정 생성 │ │ ├── protocols/ ← awg/openvpn/wireguard/xray/ikev2 │ │ ├── controllers/ ← 연결·서버·설정·스플릿터널 │ │ ├── installers/ ← 원격 서버 설치 오케스트레이션 │ │ └── models/ ← 데이터 모델 │ ├── daemon/ ← ★ root 권한 백그라운드 서비스 │ ├── mozilla/ ← Mozilla VPN 기반 재사용 코드 │ ├── platforms/ ← OS별 구현 (win/mac/ios/linux/android) │ ├── ui/ ← ★ 화면 │ │ ├── qml/ ← QML 화면 (Pages2, Components, Controls2) │ │ ├── controllers/ ← QML ↔ core 연결 백엔드 │ │ └── models/ ← 리스트/설정용 UI 모델 │ ├── server_scripts/ ← ★ 서버에 설치할 셸+Docker │ │ ├── awg/ openvpn/ xray/ wireguard/ ipsec/ ... │ │ ├── install_docker.sh · build_container.sh │ │ └── check_server.sh · setup_host_firewall.sh │ ├── client_scripts/ ← 클라이언트 측 헬퍼 스크립트 │ └── translations/ ← 다국어 (러시아어·페르시아어 등 다수) ├── service/ ← 데스크톱 시스템 서비스 진입점 ├── common/ ← crypto · logger 공용 유틸 ├── ipc/ ← 프로세스 간 통신(IPC) 정의 └── deploy/ recipes/ ← 빌드·배포 · Conan 레시피

구조를 읽는 요령: 별표(★)를 단 다섯 폴더만 이해하면 90%가 보인다. core는 두뇌, daemon은 실제 손, ui는 얼굴, server_scripts는 원격 공장, platforms는 OS별 어댑터다. 나머지(common·ipc·deploy)는 이들을 잇는 접착제다.

눈여겨볼 점
translations 폴더의 언어 목록

번역 폴더에 러시아어·페르시아어·미얀마어·아랍어가 1급으로 관리된다. 이건 단순 국제화가 아니라 프로젝트의 실제 사용자층을 그대로 보여준다. 코드 구조만큼이나 "누가 이걸 절박하게 쓰는가"를 읽을 수 있는 대목이다.

6학습 포인트 — 설계 교훈과 솔직한 한계

이 저장소에서 실제로 훔쳐 배울 것들

배울 점 ① 하나의 코드로 5개 OS를 커버하는 법

Qt/QML + C++의 최대 강점이 여기 있다. UI(QML)와 로직(C++)을 공유하고, OS마다 다른 부분만 platforms/에 격리했다. "공통 로직은 위로, 플랫폼 차이는 아래로"라는 크로스플랫폼 설계의 교과서적 예시다. React Native·Flutter를 쓰지 않고도 네이티브 성능을 얻는 대안 경로를 볼 수 있다.

배울 점 ② 권한 분리(GUI ↔ 데몬)의 실전 구현

보안이 중요한 데스크톱 앱은 거의 다 이 패턴을 쓴다. Docker Desktop, 백업 앱, 시스템 유틸이 전부 "권한 없는 UI + 권한 있는 헬퍼 데몬 + 둘 사이 IPC"로 짜인다. Amnezia의 daemon/ipc/는 이 패턴의 읽기 좋은 실물 표본이다.

배울 점 ③ 검증된 오픈소스를 조립하는 안목

Amnezia는 암호화를 직접 구현하지 않는다. OpenVPN·WireGuard·Xray·OpenSSL 같은 이미 검증된 엔진을 가져와 Conan으로 링크하고, 자기 부가가치는 "설치 자동화 + 위장 계층 + 통합 UI"에 집중한다. 보안 소프트웨어에서 "직접 짜지 말고 검증된 걸 조립하라"는 원칙의 모범이다.

배울 점 ④ 프로토콜을 플러그인처럼 추가하는 구조

configurators/ · protocols/ · server_scripts/가 프로토콜 이름으로 대칭을 이룬다. 새 프로토콜을 추가하려면 세 곳에 같은 이름의 짝을 만들면 된다. 이 대칭적 확장점 설계는 규모가 커지는 프로젝트에서 배울 만한 조직화 방식이다.

솔직한 한계
가볍게 시작하기엔 빌드가 무겁다

Qt + Conan + 플랫폼별 네이티브 툴체인 조합은 초심자가 로컬 빌드를 성공시키기까지 진입장벽이 상당하다. 단순히 "코드 읽고 배우기"엔 좋지만, "고쳐서 빌드해 보기"는 각 OS SDK·Qt 설치·Conan 설정을 요구한다.

솔직한 한계
셀프호스트는 "믿을 제3자"를 없애지만 "책임"을 넘긴다

서버가 내 것이라 회사를 안 믿어도 되지만, 반대로 서버 보안·업데이트·법적 책임이 전부 사용자 몫이 된다. VPS 제공사가 로그를 볼 수 있고, 서버 관리를 잘못하면 오히려 더 취약해질 수 있다. "셀프호스트 = 무조건 안전"이 아니라는 점은 명확히 인지해야 한다.

법적·윤리적 유의
일부 국가에서 VPN 사용 자체가 규제 대상

이 도구는 검열 우회에 초점이 있지만, VPN 사용·운영이 법으로 제한되는 지역이 있다. 학습·연구 목적으로 구조를 이해하는 것과 실제 배포·사용은 각자 관할 법령을 확인할 책임이 따른다.

7하드웨어 / 시스템 요구사항

클라이언트를 돌리는 쪽과, 서버를 세우는 쪽 둘 다

클라이언트 (내 기기)

플랫폼최소 요건
WindowsWindows 10 이상 (64-bit), wintun 드라이버 자동 설치
macOSmacOS 11+ , Apple Silicon/Intel 모두
Linux주요 배포판 (AppImage/deb 제공), systemd 데몬
AndroidAndroid 8.0(API 26) 이상 추정, VpnService 지원
iOSiOS 15+ , Network Extension 권한

클라이언트는 사양을 거의 안 탄다. 일반적인 최신 스마트폰·PC면 충분하다.

서버 (직접 세울 VPS)

항목권장
OSUbuntu / Debian 계열 (Docker 설치 가능한 리눅스)
사양1 vCPU · RAM 1GB면 개인용 충분 (프로토콜 여러 개면 여유 있게)
권한root 또는 sudo 가능한 SSH 계정
네트워크공인 IP 1개, 방화벽에서 프로토콜 포트 개방
용어 풀이
VPS (Virtual Private Server, 가상 사설 서버)
클라우드에서 빌리는 작은 리눅스 컴퓨터 한 대다. AWS Lightsail, DigitalOcean, Vultr, 국내 클라우드 등에서 월 몇 천 원~만 원에 빌린다. Amnezia는 이 빈 VPS 하나만 있으면 나머지를 자동화한다. "어느 나라 VPS를 빌리느냐"가 곧 "내 VPN이 어느 나라에서 나가느냐"가 된다.

8직접 해볼 수 있는 실습 과제

코드를 안 건드리는 것부터, 프로토콜을 추가하는 것까지
난이도 ★ · 개념 잡기

1. 빈 VPS에 실제로 Amnezia 서버 세워 보기

가장 먼저 할 것. 저렴한 VPS를 하나 빌려 Amnezia 앱으로 AmneziaWG 서버를 설치하고 연접해 본다. 이 과정에서 "앱이 SSH로 뭘 하는지"를 서버의 docker ps·journalctl로 관찰하면, 3장·4장 내용이 눈으로 들어온다.

난이도 ★ · 소스 읽기

2. server_scripts 한 프로토콜을 통째로 정독하기

server_scripts/openvpn/Dockerfileconfigure_container.shrun_container.sh를 순서대로 읽는다. "설치 자동화가 마법이 아니라 잘 정리된 셸 스크립트"라는 걸 체감하는 게 목표다. 다른 프로토콜 폴더와 비교하면 대칭 구조가 보인다.

난이도 ★★ · 구조 파악

3. "연결 버튼"의 콜 체인 추적하기

QML의 연결 버튼에서 시작해 ui/controllers/connectionUiControllercore/controllers/connectionController → 데몬 요청까지 호출 경로를 그려 본다. IDE의 "정의로 이동"을 따라가며 4장의 흐름 B를 실제 코드로 확인하는 실습이다.

난이도 ★★ · 실험

4. 두 프로토콜의 트래픽 차이를 패킷으로 관찰하기

서버 쪽에서 tcpdump로 평범한 WireGuard와 AmneziaWG의 패킷을 각각 캡처해 비교한다. "난독화가 실제로 패킷 첫 바이트를 어떻게 바꾸는지"를 눈으로 보는 것. DPI가 왜 어려워지는지 직관이 생긴다.

난이도 ★★★ · 확장

5. 새 프로토콜 확장점 설계도 그려 보기 (사고 실험)

가상의 프로토콜 "Foo"를 추가하려면 configurators/·protocols/·server_scripts/ 세 곳에 각각 무엇을 만들어야 하는지 목록으로 정리한다. 실제 빌드까진 안 가더라도, 이 대칭 확장 구조를 문서화하는 것만으로 아키텍처 이해가 크게 는다.

9관련 기술 심화 학습 로드맵

이 저장소를 소화하기 위한 4주 코스
주차주제구체적 할 일
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의 복잡도 대부분은 "검열을 뚫는다"는 목적에서 나온다.

10핵심 키워드 사전

이 문서에 나온 용어 총정리
용어한 줄 뜻
셀프호스트(Self-host)서비스를 남에게 빌리지 않고 내 서버에 직접 올려 운영하는 방식
VPS클라우드에서 빌리는 작은 리눅스 서버 한 대
DPI패킷 내용물 패턴까지 뜯어보는 심층 검열 기법
난독화(Obfuscation)VPN 트래픽을 평범한 트래픽처럼 위장해 DPI를 속이는 기술
AmneziaWGWireGuard를 포크해 DPI 저항성을 더한 자체 프로토콜
WireGuard빠르고 간결한 현대 VPN 프로토콜(핸드셰이크가 식별되기 쉬움)
Xray / VLESS / REALITYHTTPS로 위장하는 고급 우회 프로토콜 계열
Cloak · Shadowsocks중국발 검열 우회에서 출발한 트래픽 위장 도구
데몬 / 시스템 서비스화면 없이 배경에서 도는 권한 있는 프로그램
IPC프로세스 간 통신 — 여기선 GUI ↔ 데몬 대화
TUN 인터페이스OS에 만드는 가상 네트워크 카드, 터널의 입구
Qt / QMLC++ 기반 크로스플랫폼 UI 프레임워크와 그 선언형 UI 언어
ConanC++ 패키지 매니저 — 플랫폼별 의존성 관리
스플릿 터널링일부 앱·사이트만 VPN을 태우고 나머지는 직접 나가게 하는 기능

11참고 링크

공식 자료와 더 파고들 곳