Tan Kim

tailscale

Tailscale

Tailscale은 WireGuard 기반의 메시 VPN 서비스다. 복잡한 VPN 설정 없이 기기 간 직접 연결(P2P)을 자동으로 구성해주는 것이 핵심이다.

특징

  • Zero Config: 설치 후 로그인만 하면 같은 계정의 기기끼리 자동 연결
  • 메시 구조: Hub-and-Spoke가 아닌 기기 간 직접 연결
  • NAT 통과: 방화벽·NAT 뒤에 있는 기기도 P2P 연결 가능
  • MagicDNS: 기기 이름으로 접근 가능 (my-laptop.tail1234.ts.net)
  • ACL: 기기 간 접근 권한을 정책으로 관리

아키텍처

┌────────────────────────────────────────────┐
│              Tailscale Control Plane        │
│  (조정 서버 — 공개키 교환, 라우팅 정보 배포)   │
└────────────┬──────────────┬────────────────┘
             │              │
      ┌──────▼──────┐ ┌─────▼──────┐
      │  기기 A     │ │  기기 B    │
      │ WireGuard   │ │ WireGuard  │
      └──────┬──────┘ └─────┬──────┘
             └──── P2P ─────┘
          (직접 연결 가능한 경우)
             또는
      └── DERP 릴레이 경유 ──┘
          (NAT 통과 실패 시)

Control Plane vs Data Plane

구분 역할 경로
Control Plane 공개키 배포, ACL 정책 전달 Tailscale 서버 경유
Data Plane 실제 데이터 전송 기기 간 직접 (WireGuard)

NAT 통과 메커니즘

Tailscale은 다양한 NAT 통과 기법을 자동으로 시도한다.

  1. 직접 연결: 동일 네트워크 또는 포트 예측 가능한 NAT
  2. STUN: 공개 IP·포트 탐색
  3. 홀 펀칭(UDP Hole Punching): 양측에서 동시에 패킷 전송
  4. DERP 릴레이: 위 방법 모두 실패 시 Tailscale 릴레이 서버 경유

DERP (Designated Encrypted Relay for Packets)

  • 직접 연결 불가 시 암호화된 패킷을 중계
  • 릴레이여도 Tailscale 서버는 내용 복호화 불가 (End-to-End 암호화)
  • 전 세계 여러 지역에 분산 배포

주요 기능

MagicDNS

  • 기기 이름으로 내부 서비스에 접근
  • my-servermy-server.tail1234.ts.net 자동 해석
  • Split DNS: 내부 도메인만 Tailscale DNS로 처리하고 나머지는 일반 DNS 사용

Subnet Router

  • Tailscale이 설치되지 않은 내부 기기(프린터, NAS 등)를 Tailscale 네트워크에 노출
  • 한 기기가 라우터 역할을 맡아 서브넷 트래픽을 중계
# 특정 서브넷을 Tailscale 네트워크에 광고
tailscale up --advertise-routes=192.168.1.0/24

Exit Node

  • Tailscale 기기 하나를 인터넷 출구로 사용 (VPN 게이트웨이와 동일)
# Exit Node로 등록
tailscale up --advertise-exit-node
 
# Exit Node 사용
tailscale up --exit-node=<기기_IP>

Taildrop

  • Tailscale 기기 간 파일 전송 기능

ACL (Access Control List)

Tailscale 관리 콘솔에서 HuJSON 형식으로 정책 정의.

{
  "acls": [
    // 개발 서버에는 개발자만 접근
    {
      "action": "accept",
      "src": ["group:developers"],
      "dst": ["tag:dev-server:*"]
    },
    // 프로덕션 서버는 ops 팀만
    {
      "action": "accept",
      "src": ["group:ops"],
      "dst": ["tag:prod-server:*"]
    }
  ],
  "groups": {
    "group:developers": ["user@example.com"],
    "group:ops": ["admin@example.com"]
  },
  "tagOwners": {
    "tag:dev-server": ["group:ops"],
    "tag:prod-server": ["group:ops"]
  }
}

주요 명령어

# 설치 (Linux)
curl -fsSL https://tailscale.com/install.sh | sh
 
# 로그인 (브라우저 인증)
tailscale up
 
# 로그아웃
tailscale down
 
# 현재 상태 확인
tailscale status
 
# 내 IP 확인
tailscale ip
 
# 특정 기기로 ping
tailscale ping my-laptop
 
# 연결 경로 확인 (직접 P2P인지 DERP 경유인지)
tailscale netcheck

Headscale (Self-hosted Control Plane)

Tailscale의 Control Plane을 자체 호스팅할 수 있는 오픈소스 대안. Data Plane(WireGuard)은 동일하게 사용하고 조정 서버만 교체한다.

  • GitHub: juanfont/headscale
  • 클라이언트에서 --login-server 옵션으로 자체 서버 지정

Tailscale vs 전통적 VPN

항목 Tailscale 전통적 VPN
구조 메시 (P2P) Hub-and-Spoke
설정 거의 없음 서버 구성 필요
NAT 통과 자동 수동 포트포워딩
확장성 기기 추가만 서버 용량 증설 필요
기반 프로토콜 WireGuard OpenVPN / IPsec

메모

이 글에 대해 물어보기