나만의 터널링 플랫폼을 직접 만들었습니다
노트북으로 웹 앱을 다듬는 데 사흘을 보냈습니다. 완벽해 보였죠. 그런데 휴대폰으로 테스트를 해보니 모든 게 망가져 버렸습니다.
두 번째 기기가 필요할 때 로컬 개발 환경은 엉망이 되곤 합니다. 방화벽과 HTTPS 인증서 문제 때문에 로컬 IP를 공유하는 것도 실패하죠.
Ngrok을 써봤습니다. 작동은 하지만, 무료 티어는 연결이 끊깁니다. URL도 엉망이에요. a1b2-34-56.ngrok-free.app 같은 무작위 문자열은 클라이언트나 팀원들과 공유하기에 좋지 않습니다.
깔끔하고 읽기 쉬운 URL을 가진 터널을 원했습니다. 그래서 직접 만들었습니다.
커스텀 터널과 URL 단축기를 결합했습니다. 스마트한 슬러그(slug)를 생성하기 위해 AI를 추가했고, 보안 보호 기능도 내장했습니다.
기술 스택: • 터널 / 프록시: Django Channels, Daphne, WebSockets, Python & Node.js CLI • 프론트엔드: Next.js, TailwindCSS, Shadcn/UI • 백엔드: Django 5, Graphene GraphQL • 데이터베이스: PostgreSQL (Neon) • 인증: JWT, bcrypt • AI: Google Gemini • 보안: MaxMind GeoLite2, Google Safe Browsing API
작동 방식:
- 양방향 WebSocket 터널링. 로컬 CLI 에이전트가 Django 서버에 연결하여 HTTP 요청을 전달합니다.
- 레이스 컨디션(Race-condition) 방지. 분석 데이터의 정확성을 유지하기 위해 Django의 F() 표현식을 사용하여 원자적 업데이트(atomic updates)를 수행합니다.
- 논블로킹(Non-blocking) 텔레메트리. 지연 시간을 낮게 유지하기 위해 위치 및 OS 조회는 백그라운드 스레드에서 실행됩니다.
- AI 슬러그. Gemini가 대상 URL을 읽어 무작위 텍스트 대신 의미 있는 슬러그를 생성합니다.
- 선제적 보안. 프라이빗 IP 범위를 차단하고, 링크를 저장하기 전에 Google Safe Browsing 검사를 수행합니다.
백엔드와 터널링 로직은 안정적입니다. 프론트엔드는 아직 개발 중입니다.
현재 IITM에서 시험 공부를 하고 있습니다. 공부에 집중하기 위해 새로운 기능 추가는 잠시 멈춘 상태입니다. 코드를 그냥 방치하는 대신, 리뷰를 받을 수 있도록 공개합니다.
몇 가지 사항에 대해 피드백을 받고 싶습니다:
- 지연 시간(Latency): 높은 트래픽 규모에서도 리다이렉트를 10ms 미만으로 유지하려면 어떻게 해야 할까요?
- 보안: SSRF 완화 조치를 강화하는 가장 좋은 방법은 무엇일까요?
- 확장성(Scalability): 장기 연결 터널(long-lived tunnels)을 위해 WebSocket과 TCP 중 무엇을 사용하는 것이 좋을까요?
- 관측 가능성(Observability): 터널 상태를 확인하기 위해 어떤 지표를 추적해야 할까요?
프록시 워커(proxy workers)나 시스템 설계 경험이 있으시다면 의견을 공유해 주세요.
전체 시스템 설계 상세 분석: [Link] 코드베이스: [Link]
로컬 개발 중에 모바일 권한 테스트는 어떻게 하시나요? 서드파티 터널을 사용하시나요, 아니면 커스텀 도구를 사용하시나요?
출처: https://dev.to/zallu/my-ngrok-urls-got-so-ugly-i-built-my-own-tunneling-platform-instead-59d
