TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 27 READS

테일캣: 컨트롤 플레인 없이 테일스케일의 데이터 플레인만 빌려 쓰는 netcat

테일캣: 컨트롤 플레인 없이 테일스케일의 데이터 플레인만 빌려 쓰는 netcat
SOURCE IMAGE · HACKER NEWS

테일스케일이 2026년 8월 TailscaleUp 콘퍼런스에서 오픈소스로 공개한 테일캣(Tailcat)은 자사 소개 문구를 그대로 옮기면 "테일스케일 없는 테일스케일, 테일스케일이 만든" 도구다. 말장난처럼 들리지만 구조를 뜯어보면 정확한 표현이다. 테일캣은 테일스케일의 데이터 플레인, 즉 두 기기 사이에 워치가드(WireGuard)로 암호화된 점대점 터널을 만드는 magicsock 계층은 그대로 재사용하면서, 계정과 조직 관리를 담당하는 컨트롤 플레인은 통째로 걷어냈다. 그 결과물은 netcat과 비슷하게 동작하되 연결이 테일스케일의 암호화 터널 위에서 이뤄지는 CLI 도구이자 Go 라이브러리(github.com/tailscale/tailcat)다.

계정도 루트 권한도 필요 없는 연결

일반적인 테일스케일에서는 코디네이션 서버가 어느 노드가 어느 노드에 연결할 수 있는지를 관리한다. 테일캣은 이 메타데이터 교환을 전부 대역 외(out of band)로 넘긴다. 한쪽이 서버(리스너)를 띄우면 tc로 시작하는 짧은 연결 토큰이 출력되고, 이 토큰을 어떤 방식으로든 상대에게 전달해 클라이언트가 접속하는 식이다. 토큰 안에는 서버의 워치가드 공개키와 DERP 정보가 base64로 인코딩된 CBOR 형태로 담겨 있으며, 지역 ID만 담은 기본 토큰은 약 50바이트에 불과하다. 테일스케일 계정도, 기기의 라우팅 테이블이나 DNS를 건드릴 루트·관리자 권한도 필요 없다. 순수하게 유저스페이스에서 도는 라이브러리이기 때문이다.

연결이 성립되는 과정은 테일스케일 본체와 같은 원리를 따른다. 양쪽이 우선 DERP 릴레이를 통해 만나 핸드셰이크를 하고, 그 뒤 STUN으로 알아낸 공인 IP·포트를 서로 광고하며 disco 프로토콜로 UDP 홀펀칭을 시도한다. 성공하면 릴레이를 거치지 않는 직접 P2P 경로로 승격되고, NAT 통과에 실패하더라도 DERP가 최후의 중계 수단으로 남아 연결 자체는 유지된다. 다만 테일스케일이 무료로 제공하는 공용 DERP를 쓸 경우 이 경로는 속도 제한이 걸린다. ping 명령에 --until-direct 옵션을 주면 직접 경로가 뚫릴 때까지 계속 시도하고 실패 시 비정상 종료하므로, 실제로 P2P가 되는지 확인하는 진단 용도로 쓸 수 있다.

키가 곧 신원, 그리고 실무적 함정

테일캣의 서버 주소는 워치가드 키에서 파생된다. 다시 말해 어떤 키를 쓰느냐가 곧 누가 나에게 도달할 수 있느냐를 결정한다. 기본값은 실행할 때마다 메모리에 새로 생성되는 임시 키(ephemeral key)로, 프로세스가 끝나면 키와 주소가 영원히 폐기되는 안전한 방식이다. 반면 tailcat genkey로 디스크에 저장한 키를 쓰면 재시작해도 주소가 고정되는 대신, 과거에 그 주소를 공유받은 누구나 이후의 서버에 접속할 수 있다는 점을 감수해야 한다. 여기서 주의할 함정이 있다. default라는 이름의 저장 키가 한 번 만들어지면 그냥 tailcat을 실행했을 때 조용히 그 키를 재사용한다. 시작 시 출력되는 안내 줄이 임시 키인지 저장 키인지 알려주니 이 한 줄을 반드시 확인하는 습관이 필요하다. 원치 않으면 --key=new로 강제로 임시 키를 쓸 수 있다.

접속 대상을 좁히려면 --allow와 클라이언트 키를 조합한다. 클라이언트 쪽에서 신원 키쌍을 만들어 공개키를 서버에 알려주면, 서버는 그 신원만 허용하도록 설정할 수 있다. 허가되지 않은 상대의 핸드셰이크는 조용히 무시되어 SSH 서버 같은 서비스가 돌고 있다는 사실조차 알아낼 수 없다. 워치가드가 SSH 서버에 패킷이 닿기 전에 클라이언트를 먼저 인증하는 구조이므로, 열린 인바운드 포트 없이 이름만으로 어디서든 도달 가능한 SSH 서버를 세울 수 있다는 것이 이 도구가 내세우는 대표적인 활용 예다.

DNS 게시와 자체 릴레이 운영

토큰은 DNS TXT 레코드로 게시해 이름으로 조회할 수도 있다. CLI가 토큰을 받는 자리에는 DNS 이름을 그대로 넣을 수 있어 사용 흐름이 자연스럽다. 다만 DNS에 게시할 토큰이라면 지역을 고정하는 것이 중요하다. genkey --fixed-region은 키 생성 시점에 가장 가까운 DERP 지역을 한 번 탐색해 그 ID를 토큰과 키 파일에 박아두므로, 서버가 재시작해도 같은 지역에서 만나 게시된 토큰이 계속 유효하다. 기본값인 --region=auto는 시작 때마다 지역을 새로 고르기 때문에 일회성에는 무방하지만 DNS 게시에는 부적합하다.

테일스케일의 인프라에 종속되지 않고 싶다면 derper로 자체 DERP 서버를 돌릴 수 있다. TLS 인증서가 붙은 호스트명만 있으면 되고, 서버 키 생성 시 그 호스트명을 지역으로 지정하면 클라이언트는 추가 플래그 없이도 테일스케일의 DERP 맵 서버나 릴레이에 전혀 접촉하지 않는다. 이 경우 속도 제한도 온전히 자신이 통제한다. SOCKS5 프록시, localhost 포트 포워딩, 출구 노드(exit node) 동작 등도 지원해 활용 폭이 넓다.

테일캣의 뿌리는 2023년 9월 아일랜드행 비행기에서 나쁜 영화를 보며 작성했다는 'derpcat' 스케치다. 오랫동안 테일스케일 저장소의 포크 형태로 방치되며 여러 차례 내부 변경에 깨졌다가, 이번에 정규 Go 모듈 클라이언트로 리팩터링되어 부활했다. 실무자가 유념할 점은 명확하다. 테일캣은 무료지만 Go API, CLI 플래그와 출력, 와이어 포맷 어느 것도 안정성을 보장하지 않으며 언제든 바뀔 수 있다. 공용 DERP 릴레이 역시 가동률·처리량 보장이 없고 이유를 불문하고 접근이 차단될 수 있는 베스트 에포트 서비스다. 계정 없이 순간적으로 P2P 터널을 여는 편의는 분명 매력적이지만, 안정성이 필요한 프로덕션이라면 자체 DERP를 운영하거나 정식 계약 경로를 고려해야 한다는 뜻이다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://github.com/tailscale/tailcat
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...