Python과 AI 에이전트로 초경량 암호화 VPN 터널 직접 제작해보기
"시중에 수많은 상용 VPN이 있지만, 왜 우리는 단 300줄의 파이썬 코드로 나만의 VPN을 바이브코딩했을까요?"
이번 포스팅에서는 무거운 상용 프로그램 대신, Python 3.11과 ChaCha20-Poly1305 암호화를 조합하여 순수 UDP 기반 초경량 가상 사설망(VPN) 터널을 기획하고 완성한 여정을 공유합니다.
1. 시작하게 된 계기: 상용 VPN의 피로감
원격 근무와 카페 공용 Wi-Fi 사용이 일상화되면서 보안 터널은 필수가 되었습니다. 하지만 대다수의 상용 VPN은 다음과 같은 아쉬움이 있었습니다:
- 무거운 리소스 점유: 백그라운드에서 실행되는 수많은 데몬과 원격 측정(Telemetry) 서비스.
- 불투명성: 내 패킷이 어떻게 암호화되고 중계 서버에서 어떤 로그가 남는지 검증하기 어려움.
- 킬스위치 및 방화벽 우회 한계: 독점적인 프로토콜을 사용하여 특정 네트워크 환경에서 자주 차단됨.
"그렇다면 내 요구사항에 딱 맞춘 가장 날렵하고 안전한 VPN을 AI와 함께 직접 만들면 어떨까?"
이것이 바로 Python Vibe VPN 프로젝트의 시작점이었습니다.
2. 핵심 아키텍처 결정: Vibe Coding으로 빠른 기술 스택 확정
네트워크 터널 개발은 사소한 결정 하나가 전송 품질을 좌우합니다. AI 에이전트와 질문을 주고받으며 다음과 같은 3가지 핵심 설계를 도출했습니다:
① TCP 대신 순수 UDP 채택 (TCP Meltdown 방지)
흔히 초보자들이 실수하는 것이 SSH 터널이나 TCP 소켓 위에 VPN을 올리는 것입니다. 네트워크 패킷 손실이 일어났을 때 내부 TCP와 외부 TCP가 동시에 재전송을 시도하면서 대역폭이 0에 수렴하는 TCP over TCP Meltdown 현상이 발생하기 때문입니다.
AI에게 이 제약 조건을 전달하여, WireGuard처럼 신뢰성은 애플리케이션에 맡기고 터널 전송은 비동기 UDP로 구성했습니다.
② ChaCha20-Poly1305 AEAD 암호화
AES-NI 하드웨어 가속이 없는 모바일 기기나 저사양 VPS에서도 초당 수십만 패킷을 빠르게 암복호화할 수 있는 ChaCha20-Poly1305를 채택했습니다. 데이터 암호화뿐만 아니라 데이터 변조를 막는 MAC 태그 검증이 동시에 이루어집니다.
flowchart LR
A["내 PC 트래픽<br/>(브라우저, 게임 등)"] -->|가상 TUN 어댑터| B["Python 클라이언트<br/>(Vibe Tunnel)"]
B -->|ChaCha20 암호화| C["공용 인터넷 망<br/>(UDP Packet)"]
C -->|복호화 & NAT 포워딩| D["나만의 VPN 서버<br/>(AWS/오라클 클라우드)"]
D --> E["최종 목적지 웹"]
3. 에이전트와 나눈 실전 프롬프트 패턴
바이브코딩의 핵심은 "코드 전부를 짜줘"가 아니라, 정확한 프로토콜 명세와 엣지 케이스를 프롬프트에 주입하는 것입니다.
- 매 패킷마다 os.urandom(12)로 Nonce를 생성하고 앞단에 붙여서 보낼 것.
- 패킷 길이가 32바이트 미만이거나 매직헤더(b'VIBE')가 일치하지 않으면 즉각 무시(Drop)하여 DoS 공격을 방어할 것.
- TUN 가상 장치로부터 읽어들인 MTU 1420 이하의 원시 IP 패킷을 즉시 암호화해 상대방 IP:포트로 비동기 전송할 것."
AI는 이 지시사항을 완벽히 이해하고 다음과 같은 간결한 패킷 직렬화 레이아웃을 생성해 주었습니다:
+---------------+----------------+---------------------------------+----------------+
| MAGIC (4B) | NONCE (12B) | ENCRYPTED PAYLOAD (N Bytes) | TAG (16B) |
| b"VIBE" | Random bytes | Raw IP Packet | Poly1305 Auth |
+---------------+----------------+---------------------------------+----------------+
4. 트러블슈팅: 패킷이 중간에 증발하던 MTU 문제
프로토타입을 테스트할 때, 간단한 ping은 통과하지만 웹페이지를 열면 로딩이 멈추는 기현상이 발생했습니다.
원인은 바로 MTU(Maximum Transmission Unit)였습니다.
- 로컬 PC의 기본 Ethernet MTU는 1500 바이트입니다.
- 여기에 우리의 터널 헤더(4B) + Nonce(12B) + 암호화 태그(16B) + 외부 UDP/IP 헤더(28B)가 더해지면 패킷 크기가 1560 바이트로 불어납니다.
- 공유기나 통신사 라우터가 1500이 넘는 패킷을 쪼개지 못하고 버리면서 대용량 HTTP 응답이 유실되었던 것입니다.
💡 해결책: 가상 TUN 어댑터의 MTU를 1420 바이트로 강제 설정하여 80바이트의 안전 헤드룸을 확보하자마자, 유튜브 4K 스트리밍까지 끊김 없이 매끄럽게 통과했습니다!
5. 📥 배포 파일 다운로드 (Vibe VPN v1.0.0)
직접 테스트해 보실 수 있도록 클라이언트, 서버, 대칭키 생성기, 설정 템플릿이 모두 포함된 배포 패키지(.ZIP)를 준비했습니다.
📦 Python Vibe VPN 전체 소스코드 패키지
Python 3.11+ 비동기 I/O와 ChaCha20-Poly1305 기반 초경량 터널링 구현체입니다.
클라이언트(client.py), 서버(server.py), 키 생성기(keygen.py) 및 환경설정(config.json)이 모두 포함되어 있습니다.
6. 마치며: 직접 만든 도구가 주는 즐거움
이번 프로젝트를 통해 Python과 현대 AI 에이전트의 조합이 단순한 웹 개발을 넘어 저수준 시스템/네트워크 프로그래밍 영역에서도 얼마나 강력한 생산성을 발휘하는지를 체감할 수 있었습니다.
수십 줄의 프롬프트와 명확한 방향성 제시만으로 수일이 걸릴 복잡한 패킷 제어와 암호화 파이프라인을 단 몇 시간 만에 라이브로 검증할 수 있었습니다.
👉 프로젝트 상세 코드와 아키텍처 다이어그램은 Python Vibe VPN 프로젝트 페이지에서 자세히 확인하실 수 있습니다.