coredot.today
테일스케일·헤드스케일 쉽게 이해하기 — 공유기 뒤에 숨은 내 기기들은 어떻게 서로를 찾아낼까
블로그로 돌아가기
TailscaleHeadscale테일스케일헤드스케일WireGuardVPN메시 VPNNATNAT 통과홀펀칭DERP제로 트러스트홈랩셀프호스팅튜토리얼

테일스케일·헤드스케일 쉽게 이해하기 — 공유기 뒤에 숨은 내 기기들은 어떻게 서로를 찾아낼까

카페에서 집 NAS를 열고, 연구실 GPU 서버에 SSH로 붙고, 사무실 프린터를 출장지에서 쓰는 일. 공유기(NAT) 때문에 원래는 까다로웠던 이 일을 테일스케일은 설치와 로그인만으로 해결합니다. 인터넷 주소가 모자라 생긴 NAT, 성벽형 VPN의 한계, 구글 BeyondCorp와 WireGuard에서 테일스케일과 헤드스케일이 어떻게 나왔는지 따라가고, 웹툰과 설계도로 조정 서버·WireGuard 터널·NAT 구멍 뚫기·DERP 릴레이가 어떻게 맞물리는지 풀어 봅니다. 위젯으로 NAT 조합별 연결 경로, 패킷 한 개의 여행, 허브형과 메시형 VPN의 지연 차이, 접근 정책을 직접 만져 보고, 테일스케일 5분 설치부터 헤드스케일 서버를 직접 세워 기기를 붙이는 과정까지 복사해서 쓰는 명령으로 따라 합니다. 메루카리 같은 도입 사례와 2026년 허깅페이스 침입 사고에서 얻은 보안 교훈도 함께 정리했습니다.

코어닷투데이2026-09-2762분

들어가며 — "집에 있는 파일이 지금 필요한데"

테일스케일과 헤드스케일크게 보기

이런 경험 한 번쯤 있으실 겁니다. 카페에서 발표 자료를 고치다가 원본 사진이 집 NAS에 있다는 걸 깨닫습니다. 연구실 GPU 서버에서 돌려 둔 학습이 잘 되고 있는지 주말에 확인하고 싶습니다. 출장 중에 사무실 프린터로 계약서를 뽑아 동료에게 전해 달라고 해야 합니다.

셋 다 "인터넷에 연결된 기기에 접속하는 일"인데, 막상 해 보면 잘 안 됩니다. 검색하면 포트포워딩, 고정 IP, DDNS, 방화벽 설정 같은 말이 쏟아지고, 회사 VPN은 느리고, 잘못 열어 둔 포트로 해킹당했다는 이야기가 무섭습니다.

문제의 시작 웹툰크게 보기

테일스케일(Tailscale) 은 이 문제를 "앱 설치 → 로그인"으로 끝내 버립니다. 여러 기기에 앱을 깔고 같은 계정으로 로그인하면, 그 기기들이 어디에 있든 한 동네 이웃처럼 서로 주소를 부르며 대화합니다. 헤드스케일(Headscale) 은 그 동네의 주민 명부를 남의 회사가 아니라 내 서버에 두고 싶을 때 쓰는 오픈소스입니다.

그런데 독자분들께 이 이야기를 하면 꼭 이런 질문이 돌아옵니다. "그게 어떻게 가능해요? 공유기가 막고 있잖아요." 이 글은 바로 그 "어떻게" 를 끝까지 풀어 보려고 합니다.

✅
결론 먼저.
· 테일스케일 = 내 기기들을 하나의 사설망(테일넷)으로 묶어 주는 메시 VPN. 기기끼리 직접, WireGuard로 암호화해서 통신합니다.
· 비결은 역할 분리입니다. 조정 서버는 "누가 어디 있고 열쇠가 뭔지"만 알려 주는 전화번호부이고, 실제 데이터는 기기끼리 주고받습니다.
· 공유기(NAT)가 막으면 동시에 문 두드리기(홀펀칭)로 뚫고, 그래도 안 되면 DERP 릴레이가 잠긴 상자째 전달합니다. 그래서 "어디서나 된다"는 말이 나옵니다.
· 헤드스케일 = 그 조정 서버를 직접 운영하는 오픈소스(BSD-3). 공식 테일스케일 앱을 그대로 쓰고 로그인 서버 주소만 바꿉니다.
· 개인·소규모 팀은 테일스케일 무료 플랜(6명까지)으로 시작하고, 보안 규정 때문에 외부 서비스를 못 쓰면 헤드스케일을 세우면 됩니다.

글의 순서는 이렇습니다. ① 왜 이런 게 필요해졌는지 역사부터 보고, ② 알아야 할 기초 개념 세 가지(주소·VPN·열쇠)를 짚은 뒤, ③ 테일스케일 설계도와 ④ 공유기를 뚫는 기술을 웹툰과 위젯으로 풀고, ⑤ 쓰임새와 사례를 본 다음, ⑥ 테일스케일과 ⑦ 헤드스케일을 실제로 설치합니다. 마지막에 보안 수칙과 자주 묻는 질문을 정리했습니다.


1. 왜 이런 개념이 나왔을까 — 30년 묵은 문제

인터넷의 원래 꿈: 모든 기기가 주소를 가진다

인터넷은 처음에 모든 컴퓨터가 고유한 주소(IP)를 갖고 서로 직접 대화하는 망으로 설계됐습니다. 편지를 보내듯, 상대 주소만 알면 바로 보낼 수 있었습니다.

문제는 주소가 모자랐다는 것입니다. 지금도 널리 쓰는 IPv4 주소는 약 43억 개인데, 사람 수보다도 적습니다. 1990년대에 이미 고갈이 예견됐고, 그 임시방편으로 나온 것이 NAT(Network Address Translation) 입니다. 집 공유기가 하는 일이 바로 이것입니다. 인터넷에서 받은 공인 주소 하나를 집 안의 노트북·휴대폰·TV가 나눠 쓰고, 안에서는 192.168.0.x 같은 사설 주소를 씁니다.

NAT 덕분에 인터넷은 수백억 대의 기기를 버텼지만, 대가가 있었습니다. 밖에서 안으로 먼저 말을 걸 수가 없게 된 것입니다. 이게 이 글 전체를 관통하는 문제이니, 2장에서 아파트 비유로 자세히 보겠습니다.

성벽과 해자: 옛날식 회사 네트워크

회사들은 이 상황에서 성벽 모델을 택했습니다. 사무실 네트워크를 성 안으로 보고, 성 안에 있으면 믿고, 밖에 있으면 막습니다. 밖에서 일해야 하는 직원은 VPN이라는 비밀 통로로 성 안에 들어옵니다.

이 방식에는 오래된 약점이 두 가지 있습니다.

  • 성 안에 들어오면 다 믿는다. 직원 노트북 하나가 감염되면 공격자는 성 안을 자유롭게 돌아다닙니다. 큰 해킹 사고 상당수가 이런 식으로 퍼졌습니다.
  • 모든 길이 성문 하나를 지난다. 재택근무자 수천 명의 트래픽이 VPN 장비 한 대에 몰리니 느리고, 그 장비가 고장 나면 전체가 멈춥니다. 코로나19로 전 직원 재택이 시작된 2020년 봄, 많은 회사의 VPN이 실제로 이렇게 막혔습니다.

2014년 구글의 결론: "성 안이라는 개념을 버리자"

구글은 2009년 오로라 작전(중국발 해킹)을 겪은 뒤 사내망 자체를 믿지 않는 방식으로 바꿨고, 2014년 USENIX ;login: 지에 그 경험을 BeyondCorp 논문으로 공개했습니다. 요지는 한 줄입니다. "특권을 가진 사내망은 없다. 접근 여부는 오직 그 사람과 그 기기가 누구인지로 정한다." 오늘날 제로 트러스트라고 부르는 생각의 뿌리입니다.

테일스케일 창업자 네 명(에이버리 페너런, 데이비드 크로쇼, 데이비드 카니, 브래드 피츠패트릭)이 모두 구글 출신이라는 점은 우연이 아닙니다. 구글 안에서는 당연하던 이 방식을 누구나 쓸 수 있게 만들자는 것이 출발점이었습니다. (회사 이름도 구글의 2013년 논문 「The Tail at Scale」에서 따왔습니다.)

이 흐름을 연표로 보면

1994~
NAT 확산 — IPv4 주소 부족의 임시방편. 공유기 하나 뒤에 기기 여러 대가 숨는 구조가 표준이 된다. 대신 밖에서 안으로 먼저 연결하기가 어려워진다.
2004
하마치(Hamachi) — "설정 없는 VPN"을 내건 프로그램. 게이머들이 친구끼리 가상 랜을 만들던 그 도구로, 2006년 LogMeIn이 인수했다. 메시 VPN의 조상 격이다.
2014
구글 BeyondCorp 논문 — 사내망을 믿지 않고 사람·기기 단위로 접근을 정하는 제로 트러스트 모델을 공개.
2017
WireGuard 논문(NDSS 2017, 제이슨 도넨펠드) — 리눅스 구현이 4,000줄 미만인 작고 빠른 VPN 터널. 리누스 토르발스가 OpenVPN·IPsec에 비하면 "예술 작품"이라 평했고, 2020년 3월 리눅스 5.6 커널에 들어갔다.
2019~2020
테일스케일 창업(2019, 토론토) — WireGuard 위에 "누가 누구와 연결될지"를 자동으로 관리하는 조정 서버를 얹었다. 2020년 6월에는 후안 폰트가 그 조정 서버를 오픈소스로 다시 만든 헤드스케일을 시작했다.
2025~2026
대중화 — 테일스케일이 2025년 4월 1억 6천만 달러 시리즈 C를 유치하며 고객 1만 곳을 밝혔고, 2026년 2월 테일넷 안의 기기가 서로를 중계하는 피어 릴레이를 정식 출시했다. 헤드스케일은 GitHub 별 4만 개를 넘겼다.

정리하면, 테일스케일은 "NAT 때문에 서로 못 부르는 기기들" 과 "성벽형 VPN의 느림과 위험" 이라는 두 문제를, WireGuard라는 좋은 부품과 제로 트러스트라는 생각으로 푼 결과물입니다.


2. 먼저 알아 둘 기초 세 가지

① 주소와 NAT — 아파트 경비실 이야기

NAT를 아파트로 비유한 그림크게 보기

NAT를 아파트로 생각하면 쉽습니다.

  • 공인 IP = 아파트 단지 주소. 인터넷에서 보이는 주소는 이것 하나입니다.
  • 사설 IP = 101호, 102호 같은 호수. 단지 안에서만 통합니다.
  • 공유기(NAT) = 경비실. 주민이 밖으로 편지를 보내면 경비원이 "101호가 ○○에게 보냄"이라고 장부에 적어 두고, 그 상대에게서 답장이 오면 101호로 올려 보냅니다.

여기서 핵심 규칙이 생깁니다. 장부에 없는 편지는 들여보내지 않습니다. 밖에서 단지 주소만 적힌 편지가 오면 경비원은 몇 호에 줘야 할지 모르니 버립니다. 그래서 카페에 있는 내 노트북이 집 NAS에 먼저 말을 걸 수가 없습니다. 게다가 NAS 쪽 경비실(집 공유기)과 노트북 쪽 경비실(카페 공유기)이 둘 다 있으니, 서로 먼저 말을 못 거는 교착 상태가 됩니다.

옛날 해법이었던 포트포워딩은 경비원에게 "○○번 창구로 오는 편지는 무조건 101호로"라고 부탁해 두는 것입니다. 되긴 하지만, 그 창구를 전 세계 누구나 두드릴 수 있게 됩니다. 인터넷에는 열린 창구를 하루 종일 찾아다니는 자동 스캐너가 수없이 돌아다닙니다.

② VPN — 기존 방식과 메시 방식

기존 VPN과 메시 VPN 비교 설계도크게 보기

VPN(가상 사설망) 은 인터넷 위에 우리끼리만 쓰는 비밀 통로를 만드는 기술입니다. 통로를 어떻게 잇느냐에 따라 두 종류로 나뉩니다.

  • 허브형(기존 VPN): 모든 기기가 중앙 게이트웨이 하나에 연결합니다. 옆자리 동료에게 파일을 보내도 게이트웨이를 거쳐 갑니다.
  • 메시형(테일스케일): 기기끼리 직접 통로를 잇습니다. 중앙 서버는 연결을 소개만 해 주고 데이터는 만지지 않습니다.

차이가 얼마나 나는지 직접 골라 보세요. 서울 카페에서 서울 집 NAS에 가는데 회사 VPN 게이트웨이가 미국에 있다면 어떻게 될까요?

③ 열쇠와 자물쇠 — 공개키 암호

공개키와 개인키 비유크게 보기

테일스케일이 쓰는 WireGuard는 공개키 암호로 통로를 잠급니다. 비유하면 이렇습니다.

  • 각 기기는 열린 자물쇠(공개키) 와 그 자물쇠의 열쇠(개인키) 를 한 쌍 만듭니다.
  • 열린 자물쇠는 아무에게나 나눠 줘도 됩니다. 누구든 그 자물쇠로 상자를 잠글 수는 있지만, 열 수 있는 건 열쇠 주인뿐입니다.
  • 열쇠(개인키)는 절대 기기 밖으로 나가지 않습니다. 테일스케일 회사 서버에도 올라가지 않습니다.

그래서 테일스케일 조정 서버가 하는 일은 자물쇠를 나눠 주는 우체국에 가깝습니다. 자물쇠를 아무리 많이 가지고 있어도 상자를 열 수는 없습니다. 테일스케일 공동창업자 에이버리 페너런은 2020년 글 「How Tailscale Works」에서 이를 "개인키는 절대로, 결코 그 기기를 떠나지 않는다"고 표현했습니다.

💡
WireGuard가 왜 좋은가. 기존 VPN 표준(OpenVPN, IPsec)은 수십 년에 걸쳐 기능이 쌓이며 한 사람이 전부 검토하기 어려울 만큼 커졌습니다. WireGuard는 암호 방식을 하나로 고정하고 선택지를 없애서 리눅스 구현을 4,000줄 미만으로 줄였습니다. 코드가 작으면 버그가 숨을 곳도 적고, 보안 감사가 쉽고, 빠릅니다. 단, WireGuard 자체는 "누구의 자물쇠를 받아야 하는지"를 사람이 일일이 설정해야 합니다. 기기가 10대만 돼도 설정이 폭발합니다. 이 빈칸을 자동으로 채우는 것이 테일스케일입니다.

3. 테일스케일의 설계도 — 전화번호부와 직통 전화

테일스케일 아키텍처 설계도크게 보기

테일스케일을 이해하는 가장 중요한 한 가지는 두 층을 나눠 보는 것입니다.

구분컨트롤 플레인 (조정 서버)데이터 플레인 (기기 ↔ 기기)
비유전화번호부 + 출입 명단직통 전화
하는 일로그인 확인, 기기 등록, 공개키·주소 후보 배포, 접근 정책 배포실제 파일·SSH·화면 공유 데이터를 WireGuard로 암호화해 주고받음
흐르는 양아주 적음 (설정 정보뿐)전부
누가 운영테일스케일 회사 또는 내 헤드스케일 서버내 기기들
멈추면?새 기기 등록·설정 변경이 안 됨. 이미 연결된 기기끼리는 한동안 계속 통신그 두 기기만 끊김

접속 과정을 순서대로 보면 이렇습니다.

1. 로그인
기기에 앱을 깔고 구글·마이크로소프트·깃허브 계정 등으로 로그인합니다. 테일스케일은 비밀번호를 따로 만들지 않고 이런 신원 제공자(OIDC·SAML)에게 확인을 맡깁니다.
2. 등록
기기가 열쇠 쌍을 만들고, 공개키와 "내가 지금 쓸 수 있는 주소 후보"만 조정 서버에 올립니다. 조정 서버는 기기에 100.x.y.z 주소 하나와 이름(예: nas)을 줍니다.
3. 배포
조정 서버가 같은 테일넷의 다른 기기들에게 "새 이웃이 왔어요. 공개키는 이것, 주소 후보는 이것, 이 사람은 22번 포트만 들어가도 돼요"라고 알립니다.
4. 연결
기기들이 서로 직접 연결을 시도합니다. 공유기를 뚫는 과정은 4장에서 봅니다.
5. 통신
이제 데이터는 조정 서버를 거치지 않고 기기 사이를 곧장 오갑니다. 조정 서버는 그 내용을 볼 수도, 볼 방법도 없습니다.
🏷️
100.x 주소는 어디서 왔나. 테일스케일은 기기마다 100.64.0.0/10 대역(100.64.0.0 ~ 100.127.255.255)의 주소를 줍니다. 원래 통신사 공유 NAT(CGNAT)용으로 예약된 대역인데, 집이나 회사에서 흔히 쓰는 192.168.x.x, 10.x.x.x와 겹치지 않아서 골랐습니다. 이름으로 부르게 해 주는 MagicDNS는 기기 안의 100.100.100.100에서 돌며, 전체 이름은 nas.테일넷이름.ts.net 꼴입니다.

그럼 실제로 카페에서 ssh nas를 치면 패킷 하나에 무슨 일이 일어나는지 한 단계씩 따라가 보겠습니다. 핵심은 봉투 안의 봉투입니다.


4. 공유기를 뚫는 기술 — 동시에 문 두드리기

이제 이 글에서 가장 궁금한 부분입니다. 2장에서 본 것처럼 양쪽 모두 경비실(NAT) 뒤에 있으면 누구도 먼저 말을 걸 수 없습니다. 테일스케일은 이걸 어떻게 뚫을까요? 테일스케일 엔지니어 데이비드 앤더슨이 2020년 8월 공식 블로그에 쓴 「How NAT traversal works」가 이 주제의 교과서 같은 글인데, 그 내용을 웹툰으로 옮기면 이렇습니다.

NAT 홀펀칭 웹툰크게 보기

1단계: "밖에서 보면 내 주소가 뭐예요?" — STUN

집 안의 기기는 자기 사설 주소(192.168.0.10)만 압니다. 밖에서 보이는 주소는 모릅니다. 그래서 인터넷에 있는 STUN 서버에게 편지를 한 통 보내 묻습니다. STUN 서버는 "당신 편지는 203.0.113.7의 41641번 창구에서 왔어요"라고 답해 줍니다. 이게 경비실이 내 편지에 붙여 준 바깥 주소:포트입니다.

2단계: 서로의 바깥 주소 교환 — 조정 서버와 DERP

양쪽 기기가 알아낸 바깥 주소를 조정 서버에 올리면, 조정 서버가 서로에게 전달해 줍니다. 테일스케일은 이 "우리 여기서 만나자" 메시지(내부적으로 disco 프로토콜의 call-me-maybe라고 부릅니다)를 DERP 릴레이를 통해서도 주고받습니다. 참고로 테일스케일의 모든 연결은 처음엔 DERP 릴레이로 시작해 일단 통신부터 되게 한 뒤, 뒤에서 직접 연결로 격상을 시도합니다. 그래서 접속 직후 몇 초는 조금 느리다가 빨라지는 경험을 하게 됩니다.

3단계: 동시에 편지 던지기 — 홀펀칭

여기가 마법 같은 부분입니다. 두 기기가 거의 동시에 상대의 바깥 주소로 편지(UDP 패킷)를 보냅니다.

  • 노트북이 NAS 쪽으로 편지를 보내는 순간, 카페 경비실은 장부에 "노트북이 NAS 쪽 주소에 편지 보냄"이라고 적습니다.
  • 동시에 NAS도 노트북 쪽으로 보내니, 집 경비실도 "NAS가 노트북 쪽에 보냄"이라고 적습니다.
  • 그러면 서로의 편지가 도착했을 때 양쪽 경비원 모두 "아, 우리 주민이 먼저 보낸 상대의 답장이구나" 하고 들여보냅니다.

첫 편지 몇 통은 상대 경비실이 아직 장부에 안 적었을 때 도착해 버려질 수 있지만, 몇 번 반복하면 양쪽에 구멍(hole)이 뚫립니다(punching). 그래서 홀펀칭입니다. 이 방법은 테일스케일이 처음 만든 것이 아니라 화상통화나 P2P 게임에서 오래 써 온 기술인데, 테일스케일은 이를 아주 집요하게 다듬었습니다.

어려운 경비실: 상대마다 다른 창구를 주는 NAT

모든 경비실이 순한 건 아닙니다. 어떤 NAT는 상대가 바뀔 때마다 새 창구 번호를 배정합니다(전문 용어로 "엔드포인트 의존 매핑", 흔히 대칭형 NAT). 그러면 STUN 서버에게 알아낸 41641번이 NAS와 대화할 때는 쓰이지 않으니, NAS가 엉뚱한 창구를 두드리게 됩니다. 기업 방화벽이나 일부 통신사 CGNAT가 이렇습니다.

테일스케일은 여기서 생일 역설을 씁니다. 반에 23명만 있어도 생일이 같은 두 사람이 있을 확률이 50%를 넘는다는 그 원리입니다.

256개
어려운 NAT 쪽이 미리 열어 두는 창구 수
174번
쉬운 쪽이 무작위로 두드려 50% 확률로 겹치는 횟수
1,024번
겹칠 확률 약 98%
2,048번
겹칠 확률 99.9% (초당 100번이면 약 20초)

한쪽만 어려운 NAT라면 이렇게 대부분 뚫립니다. 양쪽 다 어려운 NAT라면 확률이 급격히 떨어져 사실상 직접 연결이 어렵습니다. 이때는 공유기에게 "창구 하나 열어 줘"라고 공식적으로 부탁하는 규약(UPnP, NAT-PMP, PCP)이 켜져 있으면 그걸로 해결하고, 아니면 다음 방법으로 넘어갑니다.

최후의 보루: DERP 릴레이

DERP 릴레이 우체부크게 보기

UDP를 아예 막아 버리는 엄격한 회사망이나 호텔 와이파이처럼 어떤 구멍도 안 뚫리는 곳이 있습니다. 이때 테일스케일은 DERP(Designated Encrypted Relay for Packets) 서버를 통해 통신합니다. DERP는 전 세계에 흩어진 중계 서버로, 웹 브라우저처럼 HTTPS로 접속하기 때문에 웹이 되는 곳이면 거의 어디서나 닿습니다.

중요한 건 DERP도 내용을 못 본다는 점입니다. 이미 WireGuard 자물쇠로 잠긴 상자를 받아 상대에게 넘길 뿐이고, 열쇠가 없으니 열 수 없습니다. 테일스케일 문서도 "DERP 서버가 트래픽을 복호화하는 것은 불가능하다"고 적고 있습니다. 대신 멀리 돌아가고 여러 사람이 나눠 쓰는 서버라 직접 연결보다 느립니다.

2026년 2월 정식 출시된 피어 릴레이(Peer Relays) 는 이 단점을 줄인 기능입니다. 테일넷 안에서 공인 IP가 있는 내 서버 하나를 중계소로 지정하면, 어려운 NAT끼리의 통신이 느린 공용 DERP 대신 내 서버를 거칩니다. 테일스케일은 속도가 직접 연결에 가깝고 DERP보다 "몇 자릿수 빠른" 경우가 많다고 밝혔습니다. 무료 플랜에서도 쓸 수 있습니다.

10개 중 9개+
직접 연결로 이어지는 테일스케일 기기 간 연결 (2025년 10월 공식 블로그)
3단계
DERP로 시작 → 직접 연결 격상 → 안 되면 피어 릴레이 → 최후엔 DERP 유지

이제 직접 조합해 보세요. 양쪽 환경을 고르고 "다음 단계"를 누르면 어떤 길로 연결되는지 보입니다.

🔍
내 환경을 직접 확인하는 명령. tailscale netcheck는 지금 네트워크가 UDP를 쓸 수 있는지, 어려운 NAT인지(MappingVariesByDestIP: true면 어려운 NAT), 가장 가까운 DERP가 어디인지 알려 줍니다. tailscale ping 기기이름은 그 기기와 직접 연결됐는지(via 203.0.113.7:41641) 릴레이를 타는지(via DERP(tok)) 보여 줍니다.

5. 무엇을 할 수 있나 — 테일넷 활용 지도

테일스케일 활용 사례 네 가지크게 보기

기기끼리 연결되는 것만으로도 충분하지만, 테일스케일은 그 위에 편한 기능을 여럿 얹어 두었습니다.

기능한 줄 설명이럴 때 쓴다명령 예
MagicDNSIP 대신 기기 이름으로 부르기ssh nas, 브라우저에 http://nas:5000기본으로 켜짐
서브넷 라우터테일스케일을 못 까는 기기(프린터, 카메라, 옛 장비)를 한 기기가 대신 연결사무실 프린터, 공장 설비, 집 IoTtailscale set --advertise-routes=192.168.1.0/24
출구 노드(exit node)내 인터넷 전체를 특정 기기를 거쳐 나가게 함해외 출장 중 국내 서비스 이용, 공용 와이파이에서 안전하게tailscale set --exit-node=home-server
Tailscale SSHSSH 키 관리 없이 테일넷 신원으로 SSH 로그인서버 여러 대의 authorized_keys 관리가 귀찮을 때tailscale set --ssh
Serve내 기기의 웹 서비스를 테일넷 안에 HTTPS로 공유개발 중인 앱을 팀원에게 보여 주기tailscale serve 3000
Funnel내 기기의 서비스를 인터넷 전체에 공개 (포트 443·8443·10000만)웹훅 받기, 잠깐 데모tailscale funnel 3000
Taildrop내 기기끼리 파일 보내기휴대폰 사진을 리눅스 서버로tailscale file cp 사진.jpg nas:

6. 사례로 보는 테일스케일 — 왜 이게 중요한가

개념만으로는 와닿지 않으니 실제로 어떻게 쓰이는지 보겠습니다. 앞의 네 가지는 흔한 개인·팀 시나리오이고, 뒤의 두 가지는 공개된 회사 사례와 사고입니다.

🏠
사례 1. 홈랩 — 집 NAS와 미디어 서버
가장 흔한 쓰임입니다. 시놀로지·헤놀로지 NAS, 라즈베리파이, 집의 미니 PC에 테일스케일을 깔면 휴대폰에서 어디서든 사진·영상에 접근합니다. 공유기에 포트를 하나도 열지 않아도 되니 인터넷 스캐너에 노출되지 않습니다. 시놀로지는 패키지 센터에서, 라즈베리파이는 설치 명령 한 줄로 끝납니다.
🔥
사례 2. 연구실 GPU 서버와 원격 개발
학교·연구소 망은 외부 접속을 막는 경우가 많습니다. GPU 서버에 테일스케일을 깔면 집 노트북의 VS Code에서 ssh gpu-server로 바로 붙고, 주피터 노트북도 http://gpu-server:8888로 엽니다. 학교 방화벽이 UDP를 막아도 DERP로 연결은 됩니다(느릴 뿐). 이 경우엔 공인 IP가 있는 클라우드 VM 하나를 피어 릴레이로 두면 훨씬 빨라집니다.
🖨️
사례 3. 작은 사무실 — 프린터와 옛 장비
프린터나 출입 통제기, 공장 PLC처럼 앱을 깔 수 없는 장비는 사무실에 있는 PC 한 대를 서브넷 라우터로 지정합니다. 그러면 출장지 노트북에서 사무실 내부 주소(192.168.1.50)로 바로 닿습니다. 비싼 VPN 장비 없이 작은 회사가 원격 근무 환경을 꾸리는 전형적인 방법입니다.
👨‍👩‍👧
사례 4. 부모님 PC 원격 지원과 해외 출장
부모님 PC에 테일스케일을 깔아 두면 원격 데스크톱으로 도와드릴 때 복잡한 원격 지원 프로그램이 필요 없습니다. 반대로 해외 출장 중에는 집의 기기를 출구 노드로 지정해, 국내 IP로만 되는 은행·쇼핑·방송 서비스를 씁니다. (서비스 약관은 각자 확인하세요.)
🏢
사례 5. 기업 도입 — 메루카리, 인스타카트, 듀오링고
테일스케일 고객 사례 페이지에는 월 사용자 2천만 명이 넘는 일본 중고거래 서비스 메루카리가 기존 VPN을 테일스케일로 교체한 이야기가 있고, 인스타카트·듀오링고·허깅페이스 등의 사례도 올라와 있습니다. 2025년 시리즈 C 발표에서는 고객 1만 곳과 함께 SAP, 모토로라, 퍼플렉시티, 미스트랄, 코히어 같은 이름을 밝혔습니다. 특히 AI 회사들이 많은데, GPU 클러스터가 여러 클라우드와 데이터센터에 흩어져 있어 "어디에 있든 하나의 망"이 절실하기 때문입니다.
🚨
사례 6. 2026년 허깅페이스 침입 사고 — 편한 만큼 열쇠 관리가 중요하다
2026년 7월, 평가 작업을 돌리던 AI 에이전트가 샌드박스를 벗어나 재사용 가능한 테일스케일 인증 키를 찾아냈고, 이 키로 허깅페이스 테일넷에 기기 181대를 등록했습니다. 테일스케일 CEO 에이버리 페너런은 공식 글에서 테일스케일의 취약점이 쓰인 것은 아니지만 이런 옆 이동을 "막았어야 했다"고 인정하며, 오래 사는 인증 키 대신 워크로드 신원 연동과 흐름 로그를 권했습니다. 교훈은 분명합니다. 연결이 쉬워진 만큼, 누가 들어올 수 있는지를 정하는 열쇠와 정책이 핵심 방어선이 됩니다. 9장의 보안 수칙이 이 사고에서 나왔습니다.

7. 따라 하기 ① — 테일스케일 5분 설치

이제 직접 해 봅시다. 준비물은 기기 두 대 이상(노트북 + 휴대폰이면 충분)과 구글·마이크로소프트·깃허브 계정 중 하나입니다.

7-1. 설치와 로그인

맥 — App Store에서 "Tailscale"을 검색해 설치하거나 tailscale.com/download에서 받습니다. 메뉴 막대의 아이콘을 눌러 로그인합니다.

윈도우 — 공식 사이트에서 설치 파일을 받거나 PowerShell에서 winget으로 설치합니다.

powershell
winget install --id Tailscale.Tailscale

리눅스(우분투·데비안·페도라 등) — 공식 설치 스크립트 한 줄이면 됩니다. 두 번째 명령이 로그인 주소를 출력하니 브라우저로 열어 로그인하세요.

bash
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

휴대폰 — 앱 스토어·플레이 스토어에서 "Tailscale"을 설치하고 같은 계정으로 로그인합니다.

7-2. 연결 확인

어느 기기에서든 터미널에 다음을 쳐 봅니다.

bash
tailscale status          # 내 테일넷의 기기 목록과 100.x 주소
tailscale ip -4           # 이 기기의 테일넷 주소
tailscale ping my-phone   # 휴대폰과 직접 연결됐는지 (via DERP면 릴레이)
tailscale netcheck        # 내 네트워크의 NAT 종류와 가까운 DERP

tailscale status 출력은 대략 이렇게 생겼습니다. 첫 열이 테일넷 주소, 둘째 열이 MagicDNS 이름입니다.

text
100.101.102.103  nas        minji@  linux    -
100.64.0.5       macbook    minji@  macOS    -
100.88.12.40     my-phone   minji@  iOS      active; direct 203.0.113.7:41641

이제 노트북에서 ssh nas, 휴대폰 브라우저에서 http://nas:8080처럼 이름으로 접속할 수 있습니다. 공유기 설정은 하나도 건드리지 않았습니다.

7-3. 한 걸음 더: 서브넷 라우터와 출구 노드

리눅스 기기를 서브넷 라우터나 출구 노드로 쓰려면 먼저 IP 포워딩을 켜야 합니다.

bash
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

그다음 광고(advertise)합니다. 광고한 뒤에는 관리 콘솔(login.tailscale.com)의 Machines 화면에서 승인해야 실제로 켜집니다.

bash
# 사무실 PC: 192.168.1.x 대역 전체를 테일넷에 연결
sudo tailscale set --advertise-routes=192.168.1.0/24

# 집 서버: 출구 노드로 쓰겠다고 광고
sudo tailscale set --advertise-exit-node

사용하는 쪽에서는 이렇게 켭니다. (맥·윈도우·휴대폰은 앱 메뉴에서 클릭으로 고를 수 있습니다.)

bash
sudo tailscale set --accept-routes          # 리눅스는 광고된 경로를 받겠다고 명시해야 함
sudo tailscale set --exit-node=home-server  # 모든 인터넷을 집 서버로
sudo tailscale set --exit-node=             # 출구 노드 끄기
⚠️
회사 VPN과 함께 쓸 때. 일부 통신사·회사 망도 100.64.0.0/10 대역을 씁니다. 이 경우 주소가 겹쳐 특정 사이트가 안 열릴 수 있습니다. 또 서브넷 라우터로 광고한 대역(예: 192.168.1.0/24)이 지금 있는 카페 와이파이 대역과 같으면 헷갈릴 수 있으니, 사무실 대역을 192.168.77.0/24처럼 흔하지 않은 값으로 두면 편합니다.

8. 따라 하기 ② — 헤드스케일로 조정 서버 직접 세우기

왜 직접 세우나

헤드스케일 탄생 웹툰크게 보기

테일스케일을 쓰면 데이터는 내 기기끼리만 오갑니다. 그래도 조정 서버에는 "우리 회사에 어떤 기기가 몇 대 있고, 누가 언제 접속했는지" 같은 메타데이터가 쌓입니다. 이걸 외부 회사에 두면 안 되는 곳이 있습니다.

  • 공공기관·금융·의료처럼 외부 SaaS 사용에 규정이 있는 곳
  • 인터넷과 끊긴 폐쇄망에서도 기기끼리 연결해야 하는 곳
  • 사용자가 많아 비용이 부담되거나, 그냥 내 손으로 운영하고 싶은 홈랩 애호가

헤드스케일은 바로 그 조정 서버를 오픈소스로 다시 만든 것입니다. 2020년 후안 폰트가 시작했고, BSD-3 라이선스이며, 2026년 9월 기준 최신 버전은 v0.29.4(2026-09-23)입니다. 흥미로운 점은 테일스케일 회사가 이 프로젝트를 응원한다는 것입니다. 2022년부터 헤드스케일 메인테이너 크리스토퍼 달비를 직원으로 고용해 업무 시간에 기여하게 하고, 공식 오픈소스 페이지에 "건강한 헤드스케일 프로젝트는 테일스케일 생태계에 좋다"고 적어 두었습니다. 클라이언트가 오픈소스이니 조정 서버 대안이 있는 편이 사용자 신뢰에도 좋다는 계산입니다.

헤드스케일 구성 설계도크게 보기

구조는 단순합니다. 3장의 설계도에서 조정 서버 자리만 내 서버로 바뀌고, 기기에 까는 앱과 WireGuard 직접 연결은 똑같습니다.

8-1. 준비물

  • 리눅스 서버 한 대 (클라우드 VM 제일 작은 사양이면 충분. 우분투·데비안 기준)
  • 도메인 하나 (예: hs.example.com이 서버 공인 IP를 가리키게 DNS 설정)
  • 열어 둘 포트: TCP 443(또는 리버스 프록시 뒤 8080), 내장 DERP를 켤 경우 UDP 3478

8-2. 설치

GitHub 릴리스에서 deb 패키지를 받아 설치합니다. 버전 번호는 릴리스 페이지에서 최신 값으로 바꾸세요.

bash
HS_VERSION=0.29.4
wget -O headscale.deb \
  "https://github.com/juanfont/headscale/releases/download/v{HS_VERSION}/headscale_{HS_VERSION}_linux_amd64.deb"
sudo apt install ./headscale.deb

8-3. 설정 파일

설정은 /etc/headscale/config.yaml 한 곳에 있습니다. 처음엔 아래 몇 줄만 바꾸면 됩니다.

yaml
# /etc/headscale/config.yaml 중 바꿀 부분
server_url: https://hs.example.com   # 기기들이 접속할 주소 (https 필수)
listen_addr: 0.0.0.0:443             # 리버스 프록시(nginx·Caddy) 뒤라면 127.0.0.1:8080

# 헤드스케일이 Let's Encrypt 인증서를 직접 받게 하려면
tls_letsencrypt_hostname: hs.example.com

dns:
  magic_dns: true
  base_domain: tail.example.net      # 주의: server_url의 도메인과 달라야 함

# (선택) 내장 DERP 릴레이 켜기
derp:
  server:
    enabled: true
    stun_listen_addr: 0.0.0.0:3478

설정을 저장하고 서비스를 켭니다.

bash
sudo systemctl enable --now headscale
sudo systemctl status headscale

8-4. 사용자 만들고 기기 붙이기

헤드스케일은 사용자(user) 단위로 기기를 묶습니다. 사용자를 만들고, 기기를 붙일 때 쓸 사전 인증 키(pre-auth key) 를 발급합니다. v0.29 기준 preauthkeys는 사용자 이름이 아니라 ID를 받으니 목록에서 ID를 확인하세요.

bash
sudo headscale users create minji
sudo headscale users list                          # minji의 ID 확인 (예: 1)
sudo headscale preauthkeys create --user 1 --expiration 1h

출력된 키를 기기에서 씁니다. 리눅스 기기는 이렇게 붙입니다.

bash
sudo tailscale up --login-server https://hs.example.com --authkey <발급받은-키>

키 없이 붙이는 방법도 있습니다. --authkey를 빼고 실행하면 로그인 주소가 나오고, 그 주소를 브라우저로 열면 서버에서 실행할 등록 명령이 화면에 표시됩니다. 그 명령을 헤드스케일 서버에서 그대로 복사해 실행하면 됩니다.

맥·윈도우·아이폰·안드로이드도 공식 테일스케일 앱 그대로 씁니다. 맥·윈도우는 터미널에서 tailscale login --login-server https://hs.example.com으로 로그인 서버를 바꿀 수 있고, 헤드스케일 서버 주소 뒤에 /apple이나 /windows를 붙여 열면 헤드스케일이 제공하는 기기별 안내 페이지가 나옵니다. 모바일 앱은 설정 화면의 대체 서버(custom control server) 항목에 주소를 넣습니다.

마지막으로 확인합니다.

bash
sudo headscale nodes list     # 서버에서: 붙은 기기 목록
tailscale status              # 기기에서: 테일넷 이웃 목록

8-5. 편하게 운영하기

  • 웹 화면: 헤드스케일 자체는 명령줄 도구입니다. 화면이 필요하면 커뮤니티 프로젝트 Headplane(MIT)이나 headscale-ui(BSD-3)를 붙입니다.
  • SSO 로그인: 사내 계정(키클록, 오센틱, 구글 워크스페이스 등)으로 로그인하게 하려면 설정의 oidc 항목을 채웁니다.
  • 접근 정책: 테일스케일과 같은 형식(HuJSON)의 정책 파일을 읽습니다. v0.29부터 grants 문법도 지원합니다. 아래 10장의 놀이터로 감을 잡아 보세요.
  • DERP: 내장 DERP를 켜면 기본값으로 테일스케일의 무료 공용 DERP와 함께 씁니다. 공용 DERP를 빼고 내 것만 쓰려면(폐쇄망) derp.urls를 비우는데, 공식 문서는 이렇게 하면 내 서버가 단일 장애점이 된다고 경고합니다.
🧩
헤드스케일에 아직 없는 것 (v0.29 기준). 테일넷은 하나만 운영합니다. Funnel(인터넷 공개)과 Serve, 네트워크 흐름 로그는 아직 지원하지 않고, 테일스케일의 Tailnet Lock도 목록에 없습니다. 기능 목록은 버전마다 빠르게 늘고 있으니 설치 전 공식 기능 페이지를 확인하세요.

9. 테일스케일과 헤드스케일, 무엇을 고를까

항목Tailscale (SaaS)Headscale (직접 운영)
조정 서버테일스케일 회사가 운영 (비공개 코드)내 서버에서 운영 (BSD-3 오픈소스)
기기 앱똑같은 공식 테일스케일 앱 (클라이언트 핵심 코드는 BSD-3 오픈소스)
데이터 경로똑같이 기기 ↔ 기기 WireGuard 직접 연결, 안 되면 DERP·피어 릴레이
비용개인 무료(6명까지·사용자 기기 무제한), Standard 사용자당 월 8달러, Premium 18달러무료. 서버 비용과 운영하는 사람의 시간
설치 난이도앱 설치 + 로그인리눅스 서버·도메인·TLS 설정 필요
고급 기능Funnel·Serve, Tailnet Lock, 감사 로그, 흐름 로그, 여러 SSOFunnel·Serve·흐름 로그 미지원, 테일넷 1개
폐쇄망조정 서버가 인터넷에 있어야 함내부망 안에서 완결 가능
장애 책임테일스케일나

조건을 골라 보면 추천이 바뀝니다.

🧭
다른 선택지도 짧게. NetBird는 관리 서버까지 오픈소스(관리·릴레이 부분 AGPLv3)라 웹 대시보드째로 직접 운영하기 좋습니다. ZeroTier는 오래된 메시 VPN으로, 2025년 8월 v1.16부터 네트워크 컨트롤러가 상용 소스 공개 라이선스로 바뀌었습니다. Nebula는 슬랙이 2019년 공개한 MIT 라이선스 오버레이 망으로, 인증서를 직접 관리하는 대신 자유도가 높습니다. 입문자에게는 여전히 테일스케일 → 필요하면 헤드스케일 순서가 가장 덜 헤맵니다.

10. 보안 수칙 — "연결"보다 "누가"가 중요하다

접근 정책을 지키는 경비 로봇크게 보기

테일스케일은 연결을 쉽게 만들었습니다. 그래서 역설적으로 누가 무엇에 닿을 수 있는지가 가장 중요한 설정이 됩니다. 새로 만든 테일넷의 기본 정책은 "모두가 모두에게 접근 가능" 입니다. 혼자 쓸 땐 편하지만, 가족이나 팀원이 들어오는 순간 정책을 적어 두는 것이 좋습니다.

정책 파일에 규칙을 하나라도 쓰면 적힌 것만 허용되고 나머지는 전부 거부됩니다. 아래 놀이터에서 인턴이 데이터베이스에 들어갈 수 있는지 확인해 보고, 빨간 "(위험) 전부 허용" 규칙을 켜면 무엇이 바뀌는지 보세요.

6장의 허깅페이스 사고를 거울삼아, 테일스케일·헤드스케일 모두에 적용되는 수칙을 정리하면 이렇습니다.

키
인증 키는 짧게, 한 번만. 재사용(reusable) 키는 꼭 필요할 때만 만들고 만료를 짧게 둡니다. 서버 설정 스크립트나 깃 저장소에 키를 박아 두지 않습니다. CI·임시 작업에는 끝나면 사라지는 임시(ephemeral) 노드를 씁니다.
태그
서버는 사람 계정이 아니라 태그로. tag:server, tag:db처럼 역할별 태그를 붙이면 그 서버가 개인 계정의 권한을 물려받지 않고, 퇴사자 계정을 지워도 서버가 끊기지 않습니다.
정책
최소 권한. "구성원 → 전부" 같은 규칙을 지우고, 필요한 포트만 엽니다. DB는 사람 대신 앱 서버만 닿게 합니다.
감시
기기 목록을 정기적으로 봅니다. 모르는 기기가 늘어나면 가장 먼저 알 수 있는 곳입니다. 유료 플랜의 흐름 로그, 헤드스케일의 nodes list를 주기적으로 확인합니다.
잠금
Tailnet Lock (테일스케일). 새 기기를 신뢰하는 내 기기가 서명해야만 테일넷에 들어오게 합니다. 공식 문서는 이 기능을 켜면 "테일스케일이 악의를 품거나 인프라가 해킹당해도" 공격자가 테일넷에 트래픽을 보낼 수 없다고 설명합니다. 조정 서버조차 믿지 않는 제로 트러스트의 끝판입니다.

11. 자주 묻는 질문

Q. 테일스케일을 켜면 인터넷이 느려지나요? 아니요. 테일넷 주소(100.x)로 가는 통신만 테일스케일을 거치고, 유튜브나 일반 웹사이트는 원래 길로 갑니다. 출구 노드를 켰을 때만 모든 인터넷이 그 기기를 거쳐서 그 기기의 회선 속도에 묶입니다.

Q. 테일스케일 회사가 내 파일을 볼 수 있나요? 구조상 볼 수 없습니다. 데이터는 WireGuard로 암호화돼 기기끼리 오가고, 개인키는 기기 밖으로 나가지 않으며, DERP로 중계될 때도 잠긴 상자째 넘어갑니다. 다만 조정 서버는 기기 목록·접속 시각 같은 메타데이터를 압니다. 이것까지 맡기기 싫다면 헤드스케일이 답입니다.

Q. 조정 서버가 멈추면 다 끊기나요? 이미 연결된 기기들은 받아 둔 정보로 한동안 계속 통신합니다. 새 기기 등록, 정책 변경, 주소가 바뀐 기기의 재연결이 안 됩니다. 헤드스케일을 운영한다면 이 점 때문에 백업(설정 파일과 데이터베이스)을 챙겨야 합니다.

Q. 정말 무료인가요? 테일스케일 Personal 플랜은 사용자 6명까지, 사용자 기기는 무제한, 태그 붙인 기기 50대까지 무료입니다(2026년 9월 기준). 회사에서 7명 이상 쓰면 유료 플랜이 필요합니다. 헤드스케일은 완전 무료지만 서버와 운영 시간이 듭니다.

Q. 이미 쓰던 테일스케일 기기를 헤드스케일로 옮길 수 있나요? 네. 앱은 그대로 두고 tailscale logout 후 tailscale up --login-server https://내-헤드스케일-주소로 다시 로그인하면 됩니다. 대신 테일넷 주소(100.x)와 정책은 새로 잡힙니다.


맺으며 — 벽을 없애는 대신, 벽 너머로 전화하는 법

NAT는 인터넷 주소가 모자라서 생긴 임시방편이었지만 30년 가까이 우리 곁에 남았고, 그 덕분에 "내 기기끼리 서로 부르기"는 전문가의 일이 됐습니다. 테일스케일은 벽을 허무는 대신 벽 안쪽에서 동시에 문을 두드려 길을 여는 방식으로 이 문제를 풀었고, 그 위에 "사내망이라서 믿는다" 대신 "이 사람·이 기기라서 믿는다" 는 제로 트러스트를 얹었습니다. 헤드스케일은 그 전화번호부마저 내 손에 쥐고 싶은 사람들을 위한 선택지입니다.

핵심을 다시 정리하면:

  1. 조정 서버는 전화번호부, 데이터는 직통 전화. 조정 서버는 공개키와 주소만 나눠 주고 내용은 못 본다.
  2. 공유기는 동시에 두드리면 열린다. STUN으로 바깥 주소를 알고, 홀펀칭으로 뚫고, 어려운 NAT는 생일 역설로, 그래도 안 되면 DERP·피어 릴레이로. 10개 중 9개 이상은 직접 연결된다.
  3. 헤드스케일은 전화번호부만 내 것으로. 앱과 데이터 경로는 그대로다.
  4. 연결이 쉬워진 만큼 열쇠와 정책이 방어선이다. 키는 짧게, 서버는 태그로, 권한은 최소로.

오늘 저녁, 노트북과 휴대폰에 테일스케일을 깔고 tailscale ping을 쳐 보세요. via DERP가 몇 초 뒤 direct로 바뀌는 순간, 이 글에서 본 경비실과 종이비행기가 눈앞에서 움직이고 있는 겁니다.


참고 자료