# 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. 압도적인 편리함
설치 과정 전체:
- tailscale.com 가입 (구글/마이크로소프트/깃허브 계정 사용 가능)
- 기기에 앱 설치
- 로그인
- 끝
진짜 이게 다입니다. 설정 파일 없고, 키 생성 없고, 포트포워딩 없습니다.
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 컨테이너는 브라우저로 로그인할 수 없으므로 인증 키가 필요합니다.
- Tailscale Admin Console 접속
- Keys → Generate auth key 클릭
- 옵션 설정:
- Reusable: 여러 기기에 같은 키 사용 가능
- Ephemeral: 연결 끊기면 기기 자동 삭제 (테스트용)
- Pre-approved: 관리자 승인 없이 자동 연결
- 생성된
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 활성화
- Admin Console → DNS 탭
- MagicDNS 토글 켜기
이제 homeserver.tail1234.ts.net처럼 도메인으로 접속할 수 있습니다.
짧은 이름으로 접속하기
전체 도메인이 길다면, 같은 Tailnet 내에서는 짧은 이름만으로도 접속 가능합니다:
# 아이폰에서 SSH 접속
ssh user@homeserver
# 브라우저에서 서비스 접속
http://homeserver:8080
커스텀 도메인 설정 (선택)
자신만의 도메인을 사용하고 싶다면:
- DNS 탭 → Rename tailnet 클릭
- 원하는 이름 입력 (예:
my-home-network) - 결과:
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에서 승인
- Machines 페이지 접속
- 해당 서버 옆의 … 메뉴 클릭
- Edit route settings 선택
- 광고된 서브넷 체크박스 활성화
이제 카페에서도 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에서 승인
- Machines 페이지
- 해당 서버 → Edit route settings
- Use as exit node 체크
3. 클라이언트에서 Exit Node 사용
명령줄:
# Exit Node 사용 시작
tailscale up --exit-node=homeserver
# Exit Node 사용 중지
tailscale up --exit-node=
모바일 앱:
- Tailscale 앱 열기
- Exit Node 섹션에서 홈서버 선택
- 모든 트래픽이 홈서버를 통해 라우팅됨
동작 확인
# 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 Funnel | Cloudflare 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 다른 솔루션
| 기능 | Tailscale | WireGuard 직접 구축 | 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을 연동하여 모든 기기에서 광고를 차단하는 방법을 알아보겠습니다.