노트

Tailscale Serve와 Funnel

Tailscale Serve and Funnel

인프라#network#security · 연결된 개념 4개

쉽게 말하면

Tailscale은 내 기기들만 들어오는 비밀 단톡방 같은 사설망을 만들어 줘요. Serve는 집 컴퓨터의 서비스를 그 방 안에서만 HTTPS로 보여 주고, Funnel은 같은 걸 누구나 들어오는 공개방에 올려요.

비유가 깨지는 곳 단톡방 안이라고 다 믿으면 안 돼요. 접근 제어를 좁히지 않았다면 기기 하나가 털렸을 때 다른 서비스에도 닿을 수 있으니 서비스 자체 인증을 따로 둬요. 공개가 필요 없으면 Funnel은 꺼 둬요.

Tailscale은 WireGuard 위에 만든 메시 VPN(mesh Virtual Private Network)으로, 내 기기들을 하나의 사설망(tailnet)으로 묶는다. tailscale serve는 내 기기의 로컬 서비스를 tailnet 안에서만 HTTPS로 열어 주고, tailscale funnel은 같은 서비스를 공개 인터넷에 연다.

왜 쓰나

집이나 노트북에서 도는 서비스를 휴대폰에서 쓰고 싶을 때, 포트 포워딩(port forwarding)이나 공개 터널 없이 내 기기끼리만 닿게 할 수 있다. 공유기 설정도, 공인 IP(public IP address)도 필요 없다.

  • MagicDNS: 기기마다 <기기>.<tailnet>.ts.net 같은 이름이 붙는다(DNS와 CNAME, hosts 파일을 손댈 필요가 없다)
  • Serve: 로컬 포트 앞에 TLS(Transport Layer Security)를 붙여 tailnet 안에 https://로 노출한다. 인증서는 Tailscale이 발급·갱신한다
  • Funnel: Serve와 같은 방식이지만 tailnet 밖 누구나 접근할 수 있다. 인증이 없는 서비스라면 쓰지 않는다
tailscale serve --bg 8080        # 로컬 8080을 tailnet 안에 HTTPS로
tailscale serve status
tailscale serve --https=443 off  # 끄기

wss가 필요한 이유

HTTPS로 연 웹 페이지는 평문 ws:// 연결을 혼합 콘텐츠(mixed content)로 막는다. 그래서 WebSocket 서버를 브라우저에서 쓰려면 Serve로 TLS를 붙여 wss://로 접속한다. 네이티브 앱은 이 제약이 없어 평문 연결도 열 수 있지만, 그만큼 보안을 직접 챙겨야 한다.

주의

  • tailnet 안이라도 서비스 자체 인증(토큰 등)은 따로 둔다. 접근 제어(ACL)를 좁히지 않았다면 기기 하나가 털렸을 때 tailnet의 다른 서비스에도 닿을 수 있다
  • Serve와 Funnel을 헷갈리지 않는다. 공개가 필요 없으면 Funnel은 끈 채로 둔다
  • 같은 문제를 Cloudflare Tunnel 같은 공개 터널로도 풀 수 있는데, 그쪽은 기본이 공개라 접근 제어를 별도로 건다

상주 프로세스를 띄우는 쪽은 macOS launchd로 상주 프로세스 띄우기, 출처가 다른 요청을 브라우저가 어떻게 다루는지는 동일 출처 정책를 본다.

출처: Tailscale Serve 문서 · Tailscale Funnel 문서 · MagicDNS

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • HTTP와 HTTPS

    HTTPS는 HTTP(Hypertext Transfer Protocol) 메시지를 TLS(Transport Layer Security)로 감싸 보내는 방식이다. HTTP 자체는 바뀌지 않고, 그 아래에 암호화 계층이 하나 끼어든다. 기본 포트는 HTTP가 80, HTTPS가 443이다.

  • 서버 함수와 서버 액션

    서버 함수(Server Function)는 'use server'로 표시해 서버에서만 실행되지만 클라이언트에서 네트워크 요청으로 호출할 수 있는 async 함수다. 그중 폼 제출이나 데이터 변경처럼 action 맥락(form action, transition)에서 쓰이는 것을 서버 액션(Server Action)이라 부른다. 서버 액션은 서버 함수의 부분집합이다.

  • 서버 전송 이벤트(SSE)

    서버 전송 이벤트(Server-Sent Events, SSE)는 HTTP(HyperText Transfer Protocol) 응답 하나를 닫지 않고 열어 둔 채, 서버가 원할 때마다 텍스트 이벤트를 흘려보내는 서버 → 클라이언트 단방향 푸시 방식이다. HTML 표준에 정의돼 있고 브라우저는 EventSource로 받는다.

  • 커넥션 드레이닝과 무중단 재시작

    배포 중 서버를 재시작하는 몇 초 동안 로드밸런서가 그 서버로 요청을 보내면 502가 난다. 먼저 로드밸런서에서 빼고(드레이닝), 진행 중인 요청을 마친 뒤 재시작하고, 준비되면 다시 넣는다.

  • 컨테이너 네트워킹

    컨테이너는 각자 격리된 네트워크를 가지므로, 서로 통신하려면 같은 도커 네트워크에 붙인다. 같은 사용자 정의 네트워크(user-defined network) 안에서는 도커 내장 DNS(Domain Name System)가 컨테이너 이름(또는 별칭)을 IP로 풀어 주어, IP 대신 이름으로 접속한다.

보기 옵션