Tailscale로 어디서든 내 기기에 안전하게 접속하기
집에 있는 NAS에 저장해둔 파일이 급하게 필요한데 밖에서 접속할 방법이 없었던 적 있으신가요? 회사 내부 서버에 집에서 작업해야 하는데 VPN 설정이 너무 복잡해서 포기한 적은요?
기존 VPN은 설정이 번거롭고, 포트 포워딩은 보안상 위험하고, ngrok으로 터널링하는 방법은 일시적인 용도에 가깝습니다. 이런 고민을 깔끔하게 해결해주는 도구가 바로 Tailscale인데요.
Tailscale은 WireGuard 프로토콜 위에 구축된 메시(mesh) VPN입니다. 복잡한 네트워크 설정 없이 내 기기들을 하나의 사설 네트워크로 묶어주죠. 이번 글에서는 Tailscale이 기존 VPN과 어떻게 다른지부터 설치, 핵심 기능 활용, 접근 제어 설정까지 살펴보겠습니다.
기존 VPN과 뭐가 다를까?
전통적인 VPN을 떠올려보면 중앙에 VPN 서버가 있고, 모든 트래픽이 그 서버를 거쳐 가는 구조입니다. 회사 VPN에 접속하면 인터넷이 느려지는 이유가 이 중앙 집중 구조 때문이죠. 서버까지 물리적 거리가 멀면 지연이 커지고, 접속자가 몰리면 병목도 생깁니다.
Tailscale은 이 방식을 뒤집습니다. 중앙 서버를 거치는 게 아니라 기기와 기기가 직접 연결되는 피어 투 피어(P2P) 메시 네트워크를 만들어요. 내 노트북에서 집 데스크톱으로 파일을 보낼 때, 그 데이터가 어딘가의 서버를 경유하지 않고 두 기기 사이를 최단 경로로 이동합니다.
그렇다고 서버가 아예 없는 건 아닙니다. Tailscale의 코디네이션 서버(coordination server)가 기기들의 공개키를 교환하고 접근 정책을 관리해요. 다만 이 서버는 아주 작은 양의 메타데이터만 처리할 뿐, 실제 데이터 트래픽은 전혀 거치지 않습니다. 컨트롤 플레인은 중앙 집중이지만 데이터 플레인은 완전한 메시 구조인 거죠.
WireGuard 위에 올린 편의성
Tailscale은 내부적으로 WireGuard를 씁니다. WireGuard는 VPN 프로토콜 중 가장 빠르고 가벼운 축에 속하는데, 코드가 약 4,000줄밖에 안 돼서 보안 감사도 수월합니다.
WireGuard를 직접 설정해 본 분은 아시겠지만, 손이 꽤 많이 갑니다. 각 기기마다 키 쌍을 만들고, 서로의 공개키를 교환하고, IP 주소를 할당하고, 방화벽 규칙까지 수정해야 하죠. 기기가 두세 대면 그럭저럭 할 만한데, 열 대가 넘어가면 관리가 급격히 어려워집니다.
Tailscale은 이 불편함을 해소해줍니다. WireGuard가 엔진이라면 Tailscale은 자동차라는 비유가 잘 어울려요. 엔진의 성능은 그대로 누리면서, 운전에 필요한 모든 것(핸들, 변속기, 계기판)을 갖추고 있으니까요.
Tailscale이 WireGuard 위에 더해주는 것들을 정리하면, 우선 키 관리를 자동화해줍니다. 기기에 Tailscale을 설치하고 로그인하면 키 생성과 교환이 알아서 이뤄져요. 그리고 NAT 통과(NAT traversal)도 알아서 처리합니다. 공유기 뒤에 있는 기기끼리 포트 포워딩 없이 연결할 수 있죠. WireGuard는 UDP만 지원하는 반면 Tailscale은 UDP가 막힌 네트워크에서 TCP로 자동 전환했다가 상황이 나아지면 다시 UDP로 돌아가기도 합니다.
설치와 첫 연결
Tailscale 설치는 정말 간단합니다. macOS, Linux, Windows, iOS, Android 등 거의 모든 플랫폼을 지원하고요. 대부분 몇 분이면 끝납니다.
macOS에서는 Homebrew로 설치할 수 있습니다.
$ brew install --cask tailscale
설치가 끝나면 응용 프로그램에서 Tailscale을 실행합니다. 처음 실행하면 “Tailscale이(가) VPN 구성을 추가하려고 합니다”라는 시스템 팝업이 뜹니다. Tailscale이 네트워크 트래픽을 가로채서 사설 네트워크를 구성하려면 이 권한이 꼭 필요하기 때문에 허용을 눌러줍니다. 이때 macOS 사용자 비밀번호나 Touch ID 인증을 요구할 수도 있습니다.
허용하고 나면 메뉴 바에 Tailscale 아이콘이 나타납니다. 아이콘을 클릭하고 로그인을 진행하면 됩니다. Google, Microsoft, GitHub 등의 계정을 연동하여 간편하게 회원 가입할 수 있습니다.
로그인이 완료되면 해당 기기가 내 테일넷(tailnet)에 추가됩니다. 테일넷은 Tailscale이 만들어주는 사설 네트워크를 부르는 이름인데, 각 기기에 100.x.y.z 형태의 고유 IP가 자동으로 할당됩니다. 이 IP는 기기가 어디에 있든 변하지 않습니다.
두 번째 기기에도 같은 과정을 반복하면, 두 기기가 자동으로 연결됩니다. 연결 상태를 확인해볼까요?
$ tailscale status
100.64.0.1 macbook user@ macOS -
100.64.0.2 mac-mini user@ macOS -
100.64.0.3 iphone user@ iOS -
이제 100.64.0.2로 접속하면 어디에서든 내 데스크톱에 안전하게 연결할 수 있습니다.
다만 SSH로 접속하려면 대상 기기에서 SSH 서버가 실행 중이어야 합니다. macOS에서는 시스템 설정 > 일반 > 공유에서 원격 로그인을 켜면 됩니다.
SSH 서버가 준비되면 다른 기기에서 Tailscale IP로 접속할 수 있습니다.
$ ssh user@100.64.0.2
MagicDNS로 IP 대신 이름으로 접속하기
매번 100.64.0.2 같은 IP를 외워서 접속하는 건 불편하죠. MagicDNS가 이걸 해결해줍니다. Tailscale에 등록된 기기를 호스트 이름으로 접속할 수 있게 해주는 기능인데, 기본으로 켜져 있어서 따로 설정할 게 없어요.
$ ssh user@desktop
IP 주소 대신 기기 이름만으로 SSH 접속이 가능합니다. ping desktop도 되고, 브라우저에서 http://desktop:8080처럼 접속하는 것도 됩니다.
기기 이름이 겹치는 경우에는 테일넷의 도메인을 붙여서 구분할 수 있습니다.
$ ssh user@desktop.tail1234.ts.net
MagicDNS 덕분에 내 사설 네트워크를 마치 하나의 로컬 네트워크처럼 사용할 수 있습니다. 집에 있는 NAS가 카페에서도 바로 옆에 있는 것처럼 접속되니까요.
서브넷 라우터로 네트워크 전체 연결하기
Tailscale은 기본적으로 클라이언트가 설치된 기기끼리만 통신합니다. 그런데 회사 내부 네트워크에 있는 프린터나 NAS, IoT 기기처럼 Tailscale을 직접 설치할 수 없는 장비에도 접속해야 할 때가 있죠.
서브넷 라우터(subnet router)가 이런 상황을 위한 기능입니다. 네트워크에 Tailscale이 설치된 기기 하나를 게이트웨이로 지정하면, 그 기기를 통해 네트워크 안의 다른 장비들에도 접근할 수 있어요.
예를 들어 집 네트워크가 192.168.1.0/24 대역을 쓴다면, Tailscale이 설치된 기기에서 다음처럼 서브넷을 광고합니다.
$ sudo tailscale up --advertise-routes=192.168.1.0/24
그리고 Tailscale 관리 콘솔에서 해당 라우트를 승인해주면 끝입니다. 이제 외부에서도 192.168.1.x 주소로 집 네트워크의 모든 기기에 접속할 수 있습니다.
클라우드 환경에서도 유용합니다. AWS VPC나 Google Cloud의 내부 네트워크를 서브넷 라우터로 광고하면, 개발자들이 퍼블릭 IP 없이도 내부 리소스에 안전하게 접근할 수 있죠. 바스천 호스트(bastion host)를 운영할 필요가 없어집니다.
Exit Node로 인터넷 트래픽 라우팅하기
서브넷 라우터가 특정 내부 네트워크로의 접근을 열어주는 거라면, Exit Node는 모든 인터넷 트래픽을 특정 기기를 통해 내보내는 기능입니다. 기존 VPN과 가장 비슷한 사용법이라고 보면 돼요.
카페나 공항 같은 공용 Wi-Fi에서 작업할 때 보안이 걱정된다면, 집에 있는 서버를 Exit Node로 설정해두면 됩니다.
먼저 Exit Node로 사용할 기기에서 설정합니다.
$ sudo tailscale up --advertise-exit-node
관리 콘솔에서 Exit Node를 승인한 후, 클라이언트 기기에서 해당 Exit Node를 사용하도록 설정합니다.
$ sudo tailscale up --exit-node=desktop
이제 모든 인터넷 트래픽이 desktop을 경유하게 됩니다. 외부에서 보면 내 IP가 desktop이 있는 네트워크의 IP로 보이죠.
Exit Node를 해제하려면 간단히 --exit-node= 값을 비워주면 됩니다.
$ sudo tailscale up --exit-node=
참고로 Exit Node를 사용하더라도 테일넷 내의 다른 기기로 가는 트래픽은 여전히 직접 연결(P2P)을 유지합니다. Exit Node를 거치지 않고 최적 경로를 택하는 분할 터널(split tunnel) 방식이 기본이라서, 내부 통신의 성능 저하 없이 외부 트래픽만 보호할 수 있습니다.
Taildrop으로 기기 간 파일 공유
Tailscale을 설치한 기기끼리 파일을 보내는 것도 간편합니다. Taildrop이라는 기능인데요. 클라우드 스토리지나 메신저 없이도 바로 파일을 주고받을 수 있습니다.
$ tailscale file cp ./report.pdf desktop:
이 명령 하나면 현재 기기에 있는 report.pdf 파일이 desktop으로 전송됩니다. 받는 쪽에서는 다음 명령으로 수신합니다.
$ tailscale file get ./
AirDrop과 달리 같은 네트워크에 있을 필요가 없고, 파일 크기 제한도 없습니다. WireGuard로 암호화된 경로를 타니까 보안도 걱정 없고요.
ACL로 접근 권한 세밀하게 관리하기
기기가 늘어나고 사용자가 많아지면 “누가 어디에 접속할 수 있는가”를 관리해야 합니다. Tailscale은 ACL(Access Control List)로 테일넷 정책 파일(tailnet policy file)에 접근 규칙을 정의하는데요.
HuJSON(Human JSON)이라는 형식으로 작성합니다. 일반 JSON과 비슷한데 주석을 쓸 수 있고, 마지막 항목 뒤에 쉼표를 넣어도 에러가 나지 않아서 편집하기 편해요.
{
"acls": [
// 개발팀은 개발 서버에만 접속 가능
{
"action": "accept",
"src": ["group:dev"],
"dst": ["tag:dev-server:*"]
},
// 운영팀은 모든 서버에 접속 가능
{
"action": "accept",
"src": ["group:ops"],
"dst": ["*:*"]
}
],
"groups": {
"group:dev": ["user1@example.com", "user2@example.com"],
"group:ops": ["admin@example.com"]
},
"tagOwners": {
"tag:dev-server": ["group:ops"]
}
}
ACL 규칙은 방향성이 있다는 점이 중요합니다. 개발 서버에 접속할 수 있다고 해서 개발 서버에서 내 노트북으로 역방향 접속이 허용되는 건 아닙니다.
개인 용도로 쓸 때는 기본 정책(모든 기기가 서로 접속 가능)으로 충분하지만, 팀이나 조직 단위로 사용할 때는 ACL 설정을 꼭 해두는 게 좋습니다.
서브넷 라우터와 결합하면 더 세밀한 제어가 가능합니다. 예를 들어 특정 사용자만 프로덕션 데이터베이스 서브넷에 접근하도록 제한할 수 있죠.
Docker 컨테이너와 함께 사용하기
Tailscale은 Docker 컨테이너에서도 사용할 수 있습니다. 공식 Docker 이미지를 사이드카(sidecar)로 함께 실행하면, 컨테이너에서 돌아가는 서비스를 테일넷에 노출시킬 수 있습니다.
services:
tailscale:
image: tailscale/tailscale:latest
hostname: my-app
environment:
- TS_AUTHKEY=tskey-auth-xxxxx
- TS_STATE_DIR=/var/lib/tailscale
volumes:
- tailscale-state:/var/lib/tailscale
- /dev/net/tun:/dev/net/tun
cap_add:
- net_admin
- sys_module
restart: unless-stopped
app:
image: nginx
network_mode: service:tailscale
volumes:
tailscale-state:
TS_AUTHKEY는 Tailscale 관리 콘솔에서 발급받은 인증 키를 넣어주면 됩니다. network_mode: service:tailscale로 설정하면 앱 컨테이너가 Tailscale 컨테이너의 네트워크 스택을 공유해서, 별도 설정 없이 테일넷에서 접근 가능해집니다.
자체 호스팅하는 서비스들(Jellyfin, Nextcloud, Home Assistant 등)을 포트 포워딩 없이 외부에서 안전하게 접속하고 싶을 때 이 방식이 특히 유용합니다.
무료 플랜으로 충분할까?
Tailscale의 Personal 플랜(무료)은 사용자 3명에 기기 100대까지 지원합니다. 개인 용도로는 거의 제한 없이 쓸 수 있는 수준이죠. MagicDNS, 서브넷 라우터, Exit Node, Taildrop 등 핵심 기능이 모두 포함되어 있습니다.
팀 단위로 사용하거나 SAML SSO, 사용자 프로비저닝, 감사 로그 같은 엔터프라이즈 기능이 필요하다면 유료 플랜을 검토해야 하지만, 홈랩이나 소규모 프로젝트에서는 무료 플랜으로 부족함 없이 사용할 수 있습니다.
마치며
Tailscale은 VPN을 “설치하고 잊어버려도 되는” 수준으로 단순화해줍니다. WireGuard의 성능과 보안은 그대로 가져가면서 NAT 통과, 키 관리, DNS 같은 귀찮은 부분을 전부 자동으로 처리해주거든요.
집에서 서버를 운영하는 분이든, 원격으로 사무실 네트워크에 접속해야 하는 분이든, 공용 Wi-Fi에서 안전하게 인터넷을 쓰고 싶은 분이든 한번 써보시면 기존 VPN으로 돌아가기 어려울 겁니다.
더 자세한 내용은 Tailscale 공식 문서를 참고해보세요.
This work is licensed under
CC BY 4.0