로컬 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_configAllowUsers 설정을 확인합니다.

문제: 연결 속도가 느린 경우 원인: 직접 P2P 경로 대신 DERP 중계를 사용하고 있을 가능성. 해결: tailscale ping <hostname>으로 직접 연결 여부 확인. NAT 환경에 따라 DERP 경유가 불가피할 수 있습니다.


정리

Tailscale이 포트포워딩 대비 제공하는 것:

항목 포트포워딩 Tailscale
공유기 설정 필요 불필요
포트 노출 있음 없음
인증 방식 서비스별 개별 설정 tailnet 전체 단일 인증
암호화 서비스에 따라 다름 WireGuard 전구간 암호화
ACL 불가 가능
비용 무료 개인 무료

외부에서 홈서버에 접속이 필요한 상황이라면, 포트포워딩보다 Tailscale을 먼저 검토하는 것이 합리적인 선택입니다. 설정이 단순하고, 보안 구조가 근본적으로 다르며, 무료입니다.

시리즈 전체 안내: 시리즈 목차

댓글