기타 Hacker News · 1일 전

ngrok 안 쓰고 순수 SSH랑 Nginx만으로 HTTP 터널 뚫는 법

핵심 요약
  • ngrok이나 전용 터널 프로그램 없이 OpenSSH의 임의 포트 포워딩과 Nginx 리버스 프록시만으로 자체 HTTP 터널을 구현했습니다.
  • 단순 포트 노출의 보안 문제를 해결하기 위해 Nginx secure link 모듈로 만료 시간과 해시 토큰이 포함된 일회성 인증 URL을 설계했습니다.
  • 할당된 임시 포트를 추적해 즉시 접속 URL을 출력해 주는 셸 헬퍼 스크립트까지 함께 제공되었습니다.
요약 로컬 개발 환경(localhost:8080 등)에서 작업 중인 웹 페이지나 블로그를 외부에 공유해야 할 때, 보통 ngrok이나 Cloudflare Quick Tunnels 같은 유료/상용 서비스를 쓰거나 frp, localtunnel, sish 같은 별도 클라이언트/서버 소프트웨어를 구축하곤 합니다. 하지만 네트워크 엔지니어 뱅상 베르나(Vincent Bernat)는 추가 전용 소프트웨어 설치 없이 오직 기본 OpenSSH와 Nginx만으로 안전한 자체 호스팅 HTTP 터널을 구축하는 방법을 정리해 공개했습니다. 핵심 원리는 OpenSSH의 원격 포트 포워딩 기능(`ssh -R 0:localhost:포트`)을 활용하는 것입니다. 원격 포트 번호로 0을 지정하면 SSH 서버가 사용 가능한 임의의 에피메럴 포트(예: 41535)를 자동으로 할당해 줍니다. Nginx에서는 정규식 기반의 가상 호스트(`~^p(?<port>\d\d\d\d\d)\.ssh\.도메인$`) 설정을 통해 요청받은 서브도메인의 포트 번호를 추출하고, 이를 로컬호스트의 해당 포트로 프록시(`proxy_pass http://127.0.0.1:$port`)하도록 구성합니다. 와일드카드 도메인 SSL 인증서는 Let's Encrypt DNS-01 챌린지를 통해 발급받습니다. 보안 및 무단 접근 방지 대책도 적용되었습니다. 단순히 포트 번호만 알면 누구나 접근할 수 있는 취약점을 막기 위해 Nginx의 `ngx_http_secure_link_module` 모듈을 도입했습니다. URL의 Basic Auth 사용자명 위치(`https://해시--만료시간@서브도메인/...`)에 만료 시각, 포트, 비밀키를 조합한 MD5 해시 토큰을 포함하도록 설계하여, 인증이 일치하지 않거나 유효기간이 지난 링크에는 401 혹은 410 에러를 반환하게 만듭니다. 또한 SSH 세션 실행 시 할당된 포트를 찾아 자동으로 인증 URL을 생성해 주는 셸 스크립트를 작성하여 번거로움 없이 ngrok처럼 명령 한 줄로 터널을 열고 공유할 수 있도록 구현했습니다.
Sponsored · 광고