본문으로 건너뛰기
Tailscale 메시 VPN 네트워크 연결 다이어그램

# Tailscale: 0원으로 구축하는 메시 VPN, 5분 만에 전 세계 어디서나 내 서버 접속하기

Table of Contents

“VPN 서버 구축하려면 WireGuard 설정 파일 만들고, 키 생성하고, 포트포워딩하고… 아, 너무 복잡해요.”

홈서버 입문자들이 가장 어려워하는 것 중 하나가 바로 원격 접속입니다. 포트포워딩은 보안이 걱정되고, 전통적인 VPN은 설정이 복잡합니다. Cloudflare Tunnel은 웹 서비스에는 좋지만 SSH나 파일 공유까지 커버하기엔 한계가 있습니다.

Tailscale은 이 모든 고민을 단 5분 만에 해결해 줍니다. 설치하고 로그인하면 끝입니다. 포트포워딩? 필요 없습니다. 복잡한 설정 파일? 없습니다. 인증서 관리? Tailscale이 알아서 합니다.

Tailscale이 뭔가요?

한마디로 **“설정이 필요 없는 VPN”**입니다.

기술적으로는 WireGuard 프로토콜 위에 구축된 메시(Mesh) VPN 또는 **오버레이 네트워크(Overlay Network)**입니다. 하지만 사용자 입장에서는 그냥 “앱 깔고 로그인하면 모든 기기가 연결되는 마법”입니다.

┌─────────────────────────────────────────────────────────────────────┐
│                    전통적인 VPN (허브-스포크 구조)                      │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│         스마트폰 ────────┐                                           │
│                         │                                           │
│         노트북 ─────────┼────→ VPN 서버 ←──── 홈서버                 │
│                         │        (병목)                              │
│         태블릿 ────────┘                                            │
│                                                                     │
│   모든 트래픽이 VPN 서버를 거쳐야 함                                   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│                    Tailscale (메시 구조)                              │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│         스마트폰 ←─────────────────────────→ 홈서버                  │
│              ↑                                   ↑                   │
│              │                                   │                   │
│              ↓                                   ↓                   │
│         노트북 ←───────────────────────────→ 태블릿                  │
│                                                                     │
│   모든 기기가 서로 직접 연결 (P2P)                                     │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

전통적인 VPN은 중앙 서버를 거쳐야 하지만, Tailscale은 기기들이 서로 직접 통신합니다. 서울에 있는 내 폰과 부산에 있는 내 서버가 중간 경유지 없이 직접 연결됩니다. 이것이 “메시(Mesh)” 네트워크입니다.

왜 Tailscale인가?

1. 압도적인 편리함

설치 과정 전체:

  1. tailscale.com 가입 (구글/마이크로소프트/깃허브 계정 사용 가능)
  2. 기기에 앱 설치
  3. 로그인

진짜 이게 다입니다. 설정 파일 없고, 키 생성 없고, 포트포워딩 없습니다.

2. NAT 뒤에서도 작동

통신사가 CGNAT(공유 IP)를 쓰든, 이중 공유기 환경이든, 회사 방화벽 뒤에서든 알아서 연결됩니다. Tailscale은 여러 NAT 통과(NAT Traversal) 기술을 사용합니다:

  • STUN: 외부에서 보이는 IP와 포트를 알아냄
  • 홀펀칭(Hole Punching): NAT 방화벽에 구멍을 뚫어 직접 연결
  • DERP (Designated Encrypted Relay for Packets): 직접 연결이 불가능할 때 릴레이 서버 경유

전 세계에 분산된 DERP 서버 덕분에 어떤 네트워크 환경에서도 연결이 보장됩니다.

3. WireGuard 기반의 강력한 보안

Tailscale은 내부적으로 WireGuard를 사용합니다. WireGuard는:

  • 리눅스 커널에 공식 통합된 VPN 프로토콜
  • 코드가 4,000줄에 불과 (OpenVPN은 10만 줄 이상)
  • 현대적인 암호화: ChaCha20, Curve25519, BLAKE2s
  • 빠른 핸드셰이크: 연결이 끊겼다 다시 붙어도 순식간에 재연결

4. 넉넉한 무료 플랜

개인 사용자에게 100대 기기까지 무료입니다. 홈서버 용도로는 평생 무료로 쓸 수 있습니다.

플랜가격기기 수사용자 수
Personal무료100대3명
Personal Plus$48/년100대무제한
Enterprise협의무제한무제한

1단계: Tailscale 설치하기

리눅스 서버 (Ubuntu/Debian)

# 원라인 설치 스크립트
curl -fsSL https://tailscale.com/install.sh | sh

# 서비스 시작 및 로그인
sudo tailscale up

터미널에 출력되는 URL을 브라우저에서 열어 로그인하면 연결 완료입니다.

Docker로 설치하기 (권장)

홈서버를 Docker로 관리한다면 컨테이너로 설치하는 것이 깔끔합니다.

# docker-compose.yml
services:
  tailscale:
    image: tailscale/tailscale:latest
    container_name: tailscale
    hostname: homeserver  # Tailscale 네트워크에서 보이는 이름
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    volumes:
      - ./tailscale/state:/var/lib/tailscale
      - /dev/net/tun:/dev/net/tun
    environment:
      - TS_AUTHKEY=tskey-auth-xxxxx  # 인증 키 (아래에서 발급)
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_EXTRA_ARGS=--advertise-exit-node --advertise-routes=192.168.1.0/24
    network_mode: host  # 중요: host 모드 필수

Auth Key 발급받기

Docker 컨테이너는 브라우저로 로그인할 수 없으므로 인증 키가 필요합니다.

  1. Tailscale Admin Console 접속
  2. KeysGenerate auth key 클릭
  3. 옵션 설정:
    • Reusable: 여러 기기에 같은 키 사용 가능
    • Ephemeral: 연결 끊기면 기기 자동 삭제 (테스트용)
    • Pre-approved: 관리자 승인 없이 자동 연결
  4. 생성된 tskey-auth-xxxxx 키를 복사해서 docker-compose.yml에 입력
# 컨테이너 실행
docker compose up -d

# 상태 확인
docker exec tailscale tailscale status

모바일 / 데스크톱

  • iOS/iPadOS: App Store에서 “Tailscale” 검색
  • Android: Play Store에서 “Tailscale” 검색
  • Windows: tailscale.com에서 다운로드
  • macOS: App Store 또는 tailscale.com에서 다운로드

앱 설치 후 로그인만 하면 자동으로 네트워크에 연결됩니다.


2단계: MagicDNS로 쉽게 접속하기

Tailscale에 연결된 기기에는 100.x.y.z 형태의 IP가 할당됩니다. 하지만 IP를 외울 필요가 없습니다. MagicDNS 덕분에 기기 이름으로 접속할 수 있습니다.

MagicDNS 활성화

  1. Admin ConsoleDNS
  2. MagicDNS 토글 켜기

이제 homeserver.tail1234.ts.net처럼 도메인으로 접속할 수 있습니다.

짧은 이름으로 접속하기

전체 도메인이 길다면, 같은 Tailnet 내에서는 짧은 이름만으로도 접속 가능합니다:

# 아이폰에서 SSH 접속
ssh user@homeserver

# 브라우저에서 서비스 접속
http://homeserver:8080

커스텀 도메인 설정 (선택)

자신만의 도메인을 사용하고 싶다면:

  1. DNS 탭 → Rename tailnet 클릭
  2. 원하는 이름 입력 (예: my-home-network)
  3. 결과: homeserver.my-home-network.ts.net

3단계: Subnet Router로 내부망 전체 접근하기

Tailscale의 진정한 힘은 Subnet Router에 있습니다. 홈서버 한 대에만 Tailscale을 설치하고도, 집 네트워크의 모든 기기에 접근할 수 있습니다.

왜 필요한가요?

  • NAS, 프린터, 스마트 TV 등 Tailscale을 설치할 수 없는 기기에 접근
  • IoT 기기들(Home Assistant, 공유기 관리 페이지 등)에 원격 접속
  • 회사 내부망의 여러 서버에 하나의 진입점으로 접근
┌─────────────────────────────────────────────────────────────────────┐
│                    Subnet Router 동작 원리                           │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  외부 (카페)                      집 내부 (192.168.1.0/24)          │
│                                                                     │
│  ┌──────────┐                    ┌──────────────────────────────┐  │
│  │  노트북   │                    │  홈서버 (Subnet Router)      │  │
│  │          │ ←── Tailscale ──→  │  192.168.1.100               │  │
│  │ 100.x.y.z│                    │  100.a.b.c                   │  │
│  └──────────┘                    └───────────┬──────────────────┘  │
│                                              │                      │
│                                              ↓ 라우팅               │
│                                  ┌───────────────────────┐         │
│                                  │ NAS (192.168.1.50)    │         │
│                                  │ 프린터 (192.168.1.60) │         │
│                                  │ 공유기 (192.168.1.1)  │         │
│                                  └───────────────────────┘         │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

Subnet Router 설정하기

1. 서버에서 IP 포워딩 활성화

# IPv4 포워딩 활성화
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

2. Tailscale에 서브넷 광고

# 192.168.1.0/24 네트워크를 광고
sudo tailscale up --advertise-routes=192.168.1.0/24

Docker를 사용한다면 TS_EXTRA_ARGS에 이미 포함되어 있습니다:

environment:
  - TS_EXTRA_ARGS=--advertise-routes=192.168.1.0/24

3. Admin Console에서 승인

  1. Machines 페이지 접속
  2. 해당 서버 옆의 메뉴 클릭
  3. Edit route settings 선택
  4. 광고된 서브넷 체크박스 활성화

이제 카페에서도 NAS에 접속!

# 외부에서 집 NAS 접속
ssh nas@192.168.1.50

# 공유기 관리 페이지
http://192.168.1.1

# 프린터로 인쇄
# (192.168.1.60으로 직접 연결)

4단계: Exit Node로 집 IP 사용하기

Exit Node는 모든 인터넷 트래픽을 특정 기기를 통해 라우팅하는 기능입니다. 쉽게 말해, 카페에서 인터넷을 해도 집 IP로 접속하는 것처럼 보이게 합니다.

언제 유용한가요?

  • 해외 출장 중 한국 서비스 이용: 넷플릭스, 웨이브 등 지역 제한 콘텐츠
  • 공용 와이파이 보안: 카페, 공항의 불안전한 네트워크에서 암호화된 터널 사용
  • 고정 IP 필요 시: 특정 IP에서만 접속 가능한 서비스 이용

Exit Node 설정하기

1. 홈서버를 Exit Node로 광고

sudo tailscale up --advertise-exit-node

또는 Docker 환경:

environment:
  - TS_EXTRA_ARGS=--advertise-exit-node --advertise-routes=192.168.1.0/24

2. Admin Console에서 승인

  1. Machines 페이지
  2. 해당 서버 → Edit route settings
  3. Use as exit node 체크

3. 클라이언트에서 Exit Node 사용

명령줄:

# Exit Node 사용 시작
tailscale up --exit-node=homeserver

# Exit Node 사용 중지
tailscale up --exit-node=

모바일 앱:

  1. Tailscale 앱 열기
  2. Exit Node 섹션에서 홈서버 선택
  3. 모든 트래픽이 홈서버를 통해 라우팅됨

동작 확인

# Exit Node 사용 전
curl ifconfig.me
# 출력: 카페 IP (예: 211.xxx.xxx.xxx)

# Exit Node 사용 후
curl ifconfig.me
# 출력: 집 IP (예: 123.xxx.xxx.xxx)

5단계: Tailscale Funnel로 서비스 공개하기 (선택)

Tailscale은 기본적으로 등록된 기기들 사이에서만 통신합니다. 하지만 Funnel 기능을 사용하면 Tailscale 없이도, 인터넷 어디서나 접속 가능한 공개 URL을 만들 수 있습니다.

Cloudflare Tunnel과의 차이점

기능Tailscale FunnelCloudflare Tunnel
도메인*.ts.net (Tailscale 제공)자신의 도메인
포트443, 8443, 10000모든 HTTP/S 포트
설정명령어 한 줄대시보드 설정
DDoS 방어기본 수준고급 (Cloudflare 인프라)
용도간단한 테스트/데모프로덕션 서비스

Funnel 사용하기

# 로컬 8080 포트를 외부에 공개
tailscale funnel 8080

# 특정 경로만 공개
tailscale funnel --set-path /api localhost:3000

# 상태 확인
tailscale funnel status

접속 URL: https://homeserver.tail1234.ts.net

주의: Funnel은 간단한 테스트나 임시 공유에 적합합니다. 본격적인 웹 서비스 공개에는 Cloudflare Tunnel이 더 적합합니다.


6단계: ACL로 접근 제어하기

Tailscale의 또 다른 강점은 **세밀한 접근 제어(ACL: Access Control List)**입니다. “누가 어떤 기기에 접근할 수 있는가”를 코드로 정의합니다.

기본 ACL 정책

Access Controls 페이지에서 설정합니다.

{
  "acls": [
    // 모든 사용자가 모든 기기에 접근 가능 (기본값)
    {"action": "accept", "src": ["*"], "dst": ["*:*"]}
  ]
}

실용적인 ACL 예시

{
  "groups": {
    "group:admin": ["user@gmail.com"],
    "group:family": ["mom@gmail.com", "dad@gmail.com"]
  },

  "acls": [
    // 관리자는 모든 기기에 접근 가능
    {
      "action": "accept",
      "src": ["group:admin"],
      "dst": ["*:*"]
    },

    // 가족은 미디어 서버(8096)와 파일 서버(445)만 접근 가능
    {
      "action": "accept",
      "src": ["group:family"],
      "dst": [
        "homeserver:8096",  // Jellyfin
        "nas:445"           // SMB 파일 공유
      ]
    },

    // 모든 사용자가 DNS 사용 가능
    {
      "action": "accept",
      "src": ["*"],
      "dst": ["*:53"]
    }
  ]
}

태그로 서버 분류하기

{
  "tagOwners": {
    "tag:server": ["group:admin"],
    "tag:iot": ["group:admin"]
  },

  "acls": [
    // IoT 기기들은 인터넷만 접근 가능하고 다른 기기 접근 불가
    {
      "action": "accept",
      "src": ["tag:iot"],
      "dst": ["autogroup:internet:*"]
    }
  ]
}

실전 구성 예시

최종적으로 제 홈서버 Tailscale 구성입니다:

# docker-compose.yml
services:
  tailscale:
    image: tailscale/tailscale:latest
    container_name: tailscale
    hostname: homeserver
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    volumes:
      - ./tailscale/state:/var/lib/tailscale
      - /dev/net/tun:/dev/net/tun
    environment:
      - TS_AUTHKEY=${TAILSCALE_AUTHKEY}
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_EXTRA_ARGS=--advertise-exit-node --advertise-routes=192.168.1.0/24 --accept-dns=false
    network_mode: host
# .env
TAILSCALE_AUTHKEY=tskey-auth-xxxxx

상태 확인 명령어

# 연결된 기기 목록
docker exec tailscale tailscale status

# 현재 설정 확인
docker exec tailscale tailscale debug prefs

# 네트워크 상태 (직접 연결 vs 릴레이)
docker exec tailscale tailscale netcheck

직접 연결 확인하기

docker exec tailscale tailscale status

출력에서 direct가 보이면 P2P 직접 연결, relay가 보이면 DERP 서버 경유입니다:

100.100.100.1   homeserver      linux    -
100.100.100.2   my-iphone       iOS      direct 192.168.1.xxx:41641
100.100.100.3   office-laptop   windows  relay "tok" (일본 도쿄 릴레이)

Tailscale vs 다른 솔루션

기능TailscaleWireGuard 직접 구축Cloudflare Tunnel
설정 난이도매우 쉬움어려움쉬움
NAT 통과자동포트포워딩 필요자동
메시 네트워크O수동 설정X
웹 서비스 공개Funnel (제한적)불가최적화
파일 공유/SSH최적화최적화불가
비용무료 (100기기)무료무료
속도P2P 시 최고최고중간
자체 호스팅Headscale 가능가능불가

추천 조합

저는 Tailscale + Cloudflare Tunnel을 병행합니다:

  • Tailscale: SSH 접속, 파일 전송, 내부 서비스 관리, NAS 접근
  • Cloudflare Tunnel: 외부 공개 웹 서비스 (블로그, Nextcloud 등)
┌─────────────────────────────────────────────────────────────────────┐
│                    하이브리드 구성                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  [관리자/가족]                          [일반 방문자]                 │
│       │                                      │                      │
│       │ Tailscale                            │ HTTPS                │
│       │ (모든 포트, SSH, SMB 등)             │ (443 only)           │
│       ↓                                      ↓                      │
│  ┌─────────────────────────────────────────────────┐               │
│  │                   홈서버                         │               │
│  │  ┌─────────────┐  ┌─────────────────────────┐  │               │
│  │  │  Tailscale  │  │   Cloudflare Tunnel     │  │               │
│  │  │  (내부접속)  │  │   (웹서비스 공개)        │  │               │
│  │  └─────────────┘  └─────────────────────────┘  │               │
│  │                                                 │               │
│  │  Jellyfin │ Nextcloud │ Home Assistant │ SSH   │               │
│  └─────────────────────────────────────────────────┘               │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

자주 묻는 질문

Q: Tailscale 서버가 다운되면 연결이 끊기나요?

A: 아니요. Tailscale 서버(코디네이션 서버)는 기기 간 연결을 중개하는 역할만 합니다. 한번 연결이 수립되면 직접 P2P 통신이므로 Tailscale 서버가 다운되어도 기존 연결은 유지됩니다. 다만 새로운 기기 추가나 설정 변경은 불가능합니다.

Q: 속도가 느리면 어떻게 하나요?

A: tailscale netcheck 명령으로 연결 상태를 확인하세요. relay로 연결되어 있다면 직접 연결이 실패한 것입니다. 해결책:

  • 한쪽 기기에서 UDP 41641 포트 개방 (포트포워딩)
  • 방화벽 설정 확인
  • 다른 네트워크에서 테스트

Q: Tailscale 대신 자체 호스팅할 수 있나요?

A: Headscale이라는 오픈소스 구현체가 있습니다. Tailscale 클라이언트와 호환되면서 코디네이션 서버를 직접 호스팅할 수 있습니다. 다만 NAT 통과 성능이 떨어질 수 있고 설정이 복잡합니다.

Q: 회사에서 Tailscale이 막혀있어요.

A: tailscale up --shields-up 옵션으로 들어오는 연결을 차단하고 나가는 연결만 허용할 수 있습니다. 대부분의 기업 방화벽은 아웃바운드 443을 허용하므로 연결될 가능성이 높습니다.


마치며

Tailscale은 VPN의 패러다임을 바꿨습니다. “전문가만 설정할 수 있는 복잡한 시스템”에서 “누구나 5분 만에 사용할 수 있는 도구”로 진화했습니다.

홈서버 입문자에게는 가장 쉬운 원격 접속 솔루션이고, 고급 사용자에게는 Subnet Router와 ACL로 강력한 네트워크 관리 도구가 됩니다. 무엇보다 무료입니다.

지금 바로 설치해 보세요. 5분 후면 카페에서 집 서버에 SSH로 접속하고 있을 겁니다.

curl -fsSL https://tailscale.com/install.sh | sh && sudo tailscale up

다음 포스팅에서는 **“Tailscale + Pi-hole: 광고 없는 인터넷을 어디서나”**를 다룰 예정입니다. Tailscale의 MagicDNS와 Pi-hole을 연동하여 모든 기기에서 광고를 차단하는 방법을 알아보겠습니다.

참고 자료

이 글 공유하기:
다음 글: Wake-on-LAN (WoL) 완벽 가이드: 지구 반대편에서 잠든...
My avatar

글을 마치며

이 글이 도움이 되었기를 바랍니다. 궁금한 점이나 의견이 있다면 댓글로 남겨주세요.

더 많은 기술 인사이트와 개발 경험을 공유하고 있으니, 다른 포스트도 확인해보세요.

유럽살며 여행하며 코딩하는 노마드의 여정을 함께 나누며, 함께 성장하는 개발자 커뮤니티를 만들어가요! 🚀


홈서버 마스터 클래스 시리즈