로컬 AI 인프라 노트 (2/15) — Tailscale VPN으로 어디서든 접속하는 홈서버
WireGuard 기반 메시 VPN으로 포트포워딩 없이 SSH와 서비스에 접근하는 방법
핵심 요약
- Tailscale은 WireGuard 기반 메시 VPN으로, 공유기 포트포워딩 없이 어디서든 홈서버에 접속할 수 있다
- 설치부터 SSH 원격 접속까지 설정이 간단하며, MagicDNS로 IP 대신 호스트명으로 접근 가능하다
- 포트를 외부에 노출하지 않는 제로트러스트 구조라 보안 이점이 크다
왜 포트포워딩 대신 메시 VPN인가
홈서버에 외부에서 접속하는 전통적인 방법은 포트포워딩입니다. SSH용으로 22번 포트를 열고, 웹 서비스용으로 3000번 포트를 열고, DDNS를 설정하는 방식입니다. 과정이 번거롭고, 포트를 외부에 노출하는 것 자체가 보안 리스크입니다. 봇 스캐닝, 브루트포스, 취약점 익스플로잇이 항상 열린 포트를 대상으로 합니다.
Tailscale은 이 문제를 구조적으로 다른 방식으로 해결합니다. 공유기 설정을 건드리지 않고, 포트를 열지 않으면서도 장비 간 직접 암호화 터널을 형성합니다.
본문
1. Tailscale이 하는 일
Tailscale은 WireGuard 기반의 메시 VPN입니다.
일반적인 VPN은 중앙 서버를 거칩니다. 클라이언트 → VPN 서버 → 목적지. 트래픽이 중앙에 몰리고, 그 서버가 죽으면 접속이 끊깁니다.
Tailscale의 메시 구조는 다릅니다. 네트워크에 참여한 장비들이 서로 직접 연결(peer-to-peer)됩니다. 중앙 서버(Coordination Server)는 최초 핸드셰이크(키 교환)에만 관여하고, 이후 트래픽은 장비 간 직접 통신입니다.
[노트북] ←──── WireGuard 터널 ────→ [홈서버]
(NAT traversal, 포트포워딩 불필요)
NAT traversal 기술로 공유기 뒤에 있는 장비끼리도 직접 연결됩니다. 직접 경로가 불가능한 경우에는 DERP(Designated Encrypted Relay for Packets) 서버를 통해 중계하지만, 이 경우에도 트래픽은 종단 간 암호화됩니다. 공유기 설정을 건드릴 필요가 없는 이유입니다.
2. 설치와 설정 과정
홈서버(Mac)에서:
brew install tailscale
sudo brew services start tailscale
tailscale up
tailscale up을 실행하면 브라우저가 열리며 로그인 페이지가 뜹니다. Google, Microsoft, GitHub 등의 계정으로 인증하면 끝입니다.
접속할 클라이언트(노트북, 폰 등)에서:
같은 계정으로 Tailscale을 설치하고 로그인합니다. 그러면 같은 네트워크(tailnet)에 참여하게 됩니다.
설치 후 상태 확인:
tailscale status
이 명령으로 tailnet에 연결된 모든 장비와 각각의 Tailscale IP(100.x.x.x 대역)를 확인할 수 있습니다.
3. SSH 원격 연결
Tailscale이 연결되면 SSH는 추가 설정 없이 동작합니다. 포트포워딩이나 별도 설정 없이, Tailscale이 부여한 IP로 바로 SSH 접속이 가능합니다.
ssh user@100.x.x.x
이 연결 위에서 Claude Code, VS Code Remote SSH 같은 도구를 원격으로 실행할 수 있습니다. WireGuard의 암호화 오버헤드가 매우 낮아 로컬에서 작업하는 것과 체감 차이가 거의 없습니다.
참고: Tailscale은 네트워크 연결만 담당합니다. SSH 인증(공개키 등록)은 별도로 설정해야 합니다.
4. MagicDNS로 호스트명 사용
IP 주소 대신 장비 이름으로 접속하려면 Tailscale의 MagicDNS 기능을 활성화합니다.
Tailscale 관리 콘솔(admin console) → DNS 탭 → MagicDNS 활성화. 각 장비의 hostname이 자동으로 tailnet 내부 DNS에 등록됩니다.
ssh user@my-server
별도의 DNS 서버를 운영하거나 /etc/hosts를 수정할 필요가 없습니다. MagicDNS는 기본 비활성화 상태이므로 관리 콘솔에서 명시적으로 켜야 합니다.
5. ACL 접근 제어
Tailscale은 HuJSON 형식의 ACL 정책 파일로 장비별, 사용자별 접근 권한을 세밀하게 제어할 수 있습니다.
예시 — 특정 태그가 붙은 장비에만 SSH 허용:
{
"acls": [
{
"action": "accept",
"src": ["tag:admin"],
"dst": ["tag:server:22"]
}
],
"tagOwners": {
"tag:admin": ["autogroup:owner"],
"tag:server": ["autogroup:owner"]
}
}
ACL을 적용하면 tailnet 내부에서도 "인증된 장비 → 허용된 포트만" 통신이 가능합니다. 서비스별로 다른 접근 정책을 적용할 수 있습니다.
6. 보안 이점
Tailscale의 보안 구조가 포트포워딩 방식과 근본적으로 다른 점:
포트 비노출: 공유기에서 포트를 열지 않습니다. 외부에서 포트 스캔을 해도 서버의 존재 자체가 보이지 않습니다. 공격 표면(attack surface)이 제로에 가깝습니다.
제로트러스트: tailnet에 참여하려면 같은 계정으로 인증해야 합니다. 네트워크에 있다고 해서 접속할 수 있는 것이 아니라, 인증된 장비만 통신이 가능합니다.
엔드투엔드 암호화: 모든 트래픽이 WireGuard로 암호화됩니다. DERP 중계를 거치는 경우에도 Tailscale 서버는 트래픽 내용을 볼 수 없습니다.
ACL(접근 제어): 장비별, 사용자별 접근 권한을 세밀하게 설정할 수 있습니다. "이 장비는 SSH만 허용, 웹 서비스는 차단" 같은 규칙이 가능합니다.
포트포워딩 방식은 "문을 열어놓고 비밀번호로 막는" 구조입니다. Tailscale은 "문 자체가 없는" 구조입니다.
7. 무료 플랜 범위
Tailscale의 무료 플랜(Personal)으로 충분한 경우가 많습니다:
- 사용자 1명
- 장비 최대 100대
- MagicDNS 포함
- ACL 설정 가능
개인 홈서버 용도라면 무료 플랜의 제한에 걸릴 일이 거의 없습니다.
흔한 설정 오류와 해결법
문제: tailscale up 실행 시 "daemon not running" 오류
원인: tailscaled 데몬이 실행되지 않은 상태. macOS에서 tailscale up만 실행하면 발생합니다.
해결: sudo brew services start tailscale로 데몬을 서비스로 등록. 재부팅 후에도 자동 시작됩니다.
문제: 호스트명으로 접속 시 "Name or service not known" 원인: MagicDNS는 기본 비활성화 상태. 해결: Tailscale 관리 콘솔 → DNS 탭 → MagicDNS 활성화. 이후 각 장비의 hostname이 자동 등록됩니다.
문제: Tailscale 연결은 되는데 SSH 접속 거부
원인: Tailscale은 네트워크 레이어만 담당하며 SSH 인증은 별개입니다.
해결: 서버에 SSH 공개키를 등록하거나 /etc/ssh/sshd_config의 AllowUsers 설정을 확인합니다.
문제: 연결 속도가 느린 경우
원인: 직접 P2P 경로 대신 DERP 중계를 사용하고 있을 가능성.
해결: tailscale ping <hostname>으로 직접 연결 여부 확인. NAT 환경에 따라 DERP 경유가 불가피할 수 있습니다.
정리
Tailscale이 포트포워딩 대비 제공하는 것:
| 항목 | 포트포워딩 | Tailscale |
|---|---|---|
| 공유기 설정 | 필요 | 불필요 |
| 포트 노출 | 있음 | 없음 |
| 인증 방식 | 서비스별 개별 설정 | tailnet 전체 단일 인증 |
| 암호화 | 서비스에 따라 다름 | WireGuard 전구간 암호화 |
| ACL | 불가 | 가능 |
| 비용 | 무료 | 개인 무료 |
외부에서 홈서버에 접속이 필요한 상황이라면, 포트포워딩보다 Tailscale을 먼저 검토하는 것이 합리적인 선택입니다. 설정이 단순하고, 보안 구조가 근본적으로 다르며, 무료입니다.
시리즈 전체 안내: 시리즈 목차
댓글
댓글 쓰기