콘텐츠로 이동

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. 에이전트와 나눈 실전 프롬프트 패턴

바이브코딩의 핵심은 "코드 전부를 짜줘"가 아니라, 정확한 프로토콜 명세와 엣지 케이스를 프롬프트에 주입하는 것입니다.

실전 바이브 프롬프트 스니펫
"Python cryptography 모듈의 ChaCha20Poly1305를 사용하는 UDP 터널 프로토콜 클래스를 작성해줘.
- 매 패킷마다 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)였습니다.

  1. 로컬 PC의 기본 Ethernet MTU는 1500 바이트입니다.
  2. 여기에 우리의 터널 헤더(4B) + Nonce(12B) + 암호화 태그(16B) + 외부 UDP/IP 헤더(28B)가 더해지면 패킷 크기가 1560 바이트로 불어납니다.
  3. 공유기나 통신사 라우터가 1500이 넘는 패킷을 쪼개지 못하고 버리면서 대용량 HTTP 응답이 유실되었던 것입니다.

💡 해결책: 가상 TUN 어댑터의 MTU를 1420 바이트로 강제 설정하여 80바이트의 안전 헤드룸을 확보하자마자, 유튜브 4K 스트리밍까지 끊김 없이 매끄럽게 통과했습니다!


5. 📥 배포 파일 다운로드 (Vibe VPN v1.0.0)

직접 테스트해 보실 수 있도록 클라이언트, 서버, 대칭키 생성기, 설정 템플릿이 모두 포함된 배포 패키지(.ZIP)를 준비했습니다.

Distribution v1.0.0

📦 Python Vibe VPN 전체 소스코드 패키지

Python 3.11+ 비동기 I/O와 ChaCha20-Poly1305 기반 초경량 터널링 구현체입니다.
클라이언트(client.py), 서버(server.py), 키 생성기(keygen.py) 및 환경설정(config.json)이 모두 포함되어 있습니다.

SHA-256: E66599C5F8CC9A0ABADCEE55BDDA4D875E46FD9C6281A2AFD3FDB84D4C1D54CF | 크기: ~4.0 KB

6. 마치며: 직접 만든 도구가 주는 즐거움

이번 프로젝트를 통해 Python과 현대 AI 에이전트의 조합이 단순한 웹 개발을 넘어 저수준 시스템/네트워크 프로그래밍 영역에서도 얼마나 강력한 생산성을 발휘하는지를 체감할 수 있었습니다.

수십 줄의 프롬프트와 명확한 방향성 제시만으로 수일이 걸릴 복잡한 패킷 제어와 암호화 파이프라인을 단 몇 시간 만에 라이브로 검증할 수 있었습니다.


👉 프로젝트 상세 코드와 아키텍처 다이어그램은 Python Vibe VPN 프로젝트 페이지에서 자세히 확인하실 수 있습니다.