본문으로 건너뛰기
Tailscale 메시 VPN 네트워크 연결 다이어그램
홈서버 구축 가이드 / · 약 7분

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

“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)

Terminal window
# 원라인 설치 스크립트
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에 입력
Terminal window
# 컨테이너 실행
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 내에서는 짧은 이름만으로도 접속 가능합니다:

Terminal window
# 아이폰에서 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 포워딩 활성화

Terminal window
# 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에 서브넷 광고

Terminal window
# 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에 접속!

Terminal window
# 외부에서 집 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로 광고

Terminal window
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 사용

명령줄:

Terminal window
# Exit Node 사용 시작
tailscale up --exit-node=homeserver
# Exit Node 사용 중지
tailscale up --exit-node=

모바일 앱:

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

동작 확인

Terminal window
# 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 사용하기

Terminal window
# 로컬 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

상태 확인 명령어

Terminal window
# 연결된 기기 목록
docker exec tailscale tailscale status
# 현재 설정 확인
docker exec tailscale tailscale debug prefs
# 네트워크 상태 (직접 연결 vs 릴레이)
docker exec tailscale tailscale netcheck

직접 연결 확인하기

Terminal window
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로 접속하고 있을 겁니다.

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

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

참고 자료

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

글을 마치며

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

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

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


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