메뉴
HN
Hacker News • 25일 전

Tailcat: 테일스케일이 만든 '테일스케일 없는 테일스케일'

IMP
7/10
핵심 요약

Tailscale 팀이 자사의 오픈소스 데이터 플레인(WireGuard 암호화 + NAT 통과 + DERP 릴레이)만을 활용하는 CLI 도구 'tailcat'를 공개했습니다. IP 주소, 계정, 제어 서버, 관리자 권한 없이도 서버-클라이언트 간 양방향 연결을 netcat처럼 사용할 수 있어, 가벼운 P2P 보안 통신이 필요한 실무자에게 유용합니다.

번역된 본문

블로그 | 제품 2026년 8월 31일 Tailcat: Tailscale 없는 Tailscale, Tailscale이 직접 만나다. 작성자: Brad Fitzpatrick

오늘 우리는 tailcat을 출시합니다. tailcat은 Tailscale의 여러 구성 요소를 재조합한 것으로, Tailscale을 만든 사람들이 직접 작성한, Tailscale 제어 플레인 없이 오픈소스 Tailscale 데이터 플레인(WireGuard® + NAT 통과 + DERP)을 사용할 수 있게 해줍니다. 즉, Tailscale이 만든, Tailscale 없는 Tailscale입니다.

구체적으로 tailcat은 오픈소스 Go 패키지이자 그 패키지를 사용하는 CLI 도구입니다. 서버 측 리스너와 여기에 연결하는 클라이언트를 실행하여 양방향 바이트를 주고받을 수 있습니다. 다시 말해 netcat과 비슷하지만 Tailscale의 magicsock(WireGuard 암호화 + NAT 통과 + DERP 렌데부/폴백 릴레이) 위에서 동작합니다.

특히 tailcat에는 다음이 없습니다:

  • IP 주소 없음
  • 계정 없음 (로그인, 비밀번호, SSO 없음)
  • 제어 플레인 없음
  • 사용자 없음
  • 관리자 없음
  • 관리 통제 기능 없음
  • root 또는 OS 관리자 권한 불필요
  • Tailscale이라는 회사와의 관계나 의존성 없음 (자체 cmd/derper DERP 서버를 운영하는 경우)

"Tailscale"은 대체 무슨 뜻일까?

사람들이 온라인에서 서로 Tailscale을 설명하는 모습을 보면, 각자에게 "Tailscale"이 무엇을 의미하는지 매우 다른 해석이 존재함을 알 수 있습니다.

한 부류는 "그냥 WireGuard를 직접 운영하면 되지"라는 말을 자주 하는 사람들로, WireGuard 부분에 집중하고 NAT 통과, DERP 폴백, 중앙 관리되는 방화벽(ACL) 규칙, SSO 로그인, 태깅, MDM 정책, 감사 로그 같은 부분은 고려하지 않거나(또는 관심이 없거나) 합니다. 공인 IP에서 WireGuard만 필요한 경우일 수 있습니다. 그것도 괜찮습니다.

또 다른 부류는 회사, 기업 구조, 장기적 생존 가능성, 창립자, 투자 단계, 가격 정책, 인증, 신뢰성, 보안 취약점 공개의 책임 있는 처리 등에 대해 이야기합니다.

또 다른 부류는 Tailscale이 오픈소스인지 여부를 이야기합니다. 다시 상기하자면: 우리의 코어는 오픈소스이고(진짜 OSI 승인 라이선스!), DERP 서버도 오픈소스이며, 클라이언트도 그 자체가 오픈소스인 플랫폼(리눅스와 안드로이드)에서는 오픈소스입니다. 다만 서버 측 제어 플레인은 오픈소스가 아닙니다.

이 독자층의 많은 사람들은 Headscale(우리가 좋아하고 개발을 부분적으로 후원하고 있는 프로젝트)이 존재한다는 점을 높이 평가합니다. 지금 사용하거나, 미래의 폴백 플랜으로 활용할 수 있기 때문입니다.

이 모든 해석은 다 괜찮습니다. 기업 SSO 아이덴티티 프로바이더와 함께 공식 제어 플레인을 감싼 공식 GUI 클라이언트를 쓰든지, 반대 극단으로 자체 호스팅한 Headscale 서버를 향해 리눅스 노드에서 tsnet만 사용하든지, Tailscale과 그 구성 요소들을 연결하고 사용하는 방법은 다양합니다:

  • WireGuard + NAT 통과 + DERP 폴백 데이터 플레인
  • 제어 플레인
  • 회사 (우리에게 비용을 지불하고 운영·지원을 맡기는 것)
  • 오픈소스 코드 tailcat은 Tailscale의 하위 집합을 사용하는 또 다른 방법을 제공합니다.

작동 방식

tailcat 서버를 실행한다고 합시다. 다음과 같이 동작합니다:

  • 키페어 생성 (일회성 또는 이름을 붙여 재사용)
  • DERP 서버 선택 (직접 지정하거나, 대역폭 제한이 있는 Tailscale 운영 서버가 자동 선택)
  • tailcat 주소 생성. 형식은 tc + base64(CBOR(공개키 + DERP 부트스트랩 정보)) 형태의 문자열
  • 그런 다음 그 주소 문자열을 다른 경로(대역 외)로 공유합니다. 직접 전달하거나, DNS TXT 레코드에 넣고 DNS 호스트명을 대역 외로 공유할 수 있습니다

클라이언트 쪽도 거의 비슷합니다:

  • 키 선택 (일회성 또는 로컬에 저장된 이름 있는 키 재사용)
  • tailcat 주소에 지정된 렌데부 DERP 서버에 연결
  • netmap에 자신을 추가하기 위해 서버의 공개키로 DERP를 통해 MEOW 메시지 전송

이 시점에서 서버가 해당 클라이언트의 공개키를 허용한다면(선택적으로 잠글 수도 있습니다), happy MEOW 응답을 보냅니다. 그러면 클라이언트는 WireGuard 위에 내장된 사용자 공간 TCP 스택을 사용해 상대방 측에 TCP 연결을 수립합니다. 통신 선로상에는 실제 IP 주소(공개키에서 파생된 IPv6)가 존재하지만, 사용자에게는 절대 보이지 않습니다.

원문 보기
원문 보기 (영어)
Blog | product August 31, 2026 Tailcat: Tailscale without Tailscale, by Tailscale Author Brad Fitzpatrick Today we’re releasing tailcat , a remix of pieces of Tailscale that gives you a way to use the open-source Tailscale data plane (WireGuard® + NAT traversal + DERP) without the Tailscale control plane, written by the people who made Tailscale. It’s Tailscale without Tailscale, by Tailscale. Specifically, tailcat is both an open-source Go package and a CLI tool using that package. It lets you run a server-side listener and a client to connect to that server, moving bidirectional bytes back and forth. That is, it’s like netcat but flowing over Tailscale’s magicsock (WireGuard encryption + NAT traversal + DERP rendezvous/fallback relay). Notably, tailcat has: no IP addresses no accounts (no logins, no passwords, no SSO) no control plane no users no admins no administrative controls no root or admin OS access requirement no relationship with or dependence on Tailscale as a company (if you run your own cmd/derper DERP server, at least) What does “Tailscale” even mean? When you watch people describe Tailscale to each other online, you see very different interpretations of what “Tailscale” means to them. One group of people, often seen saying things like “I’ll just run WireGuard myself,” focuses on the WireGuard part and doesn't consider (or care about) parts like NAT traversal, DERP fallbacks, centrally managed firewall (ACL) rules, SSO login, tagging, MDM policies, audit logging, etc. Maybe they only want or need the WireGuard part on a public IP. That’s fine. Another group of people talks more about the company, corporate structure, long-term viability, founders, funding stage, pricing, certifications, reliability, responsible handling of security disclosures, etc. Another group of people talk about whether Tailscale is open source or not. As a reminder: our core is open source (with a real OSI-approved license!), our DERP server is open source, and our clients are open source on platforms that are themselves open source: Linux and Android. Our server-side control plane is not. A lot of people in this audience appreciate that Headscale (which we love and partially fund development of) exists, either to use today, or use in the future, as a fallback plan. All of those interpretations are fine. Whether you’re using our official GUI client wrappers around our official control plane, with a corporate SSO identity provider, or you’re at the other extreme, using only tsnet on Linux nodes against your self-hosted Headscale server, there are many ways to wire up and use Tailscale and its many pieces: Its WireGuard + NAT traversal + DERP fallback data plane Its control plane Its company (paying us to run and support things for you) Its open source code tailcat gives you another way to use a subset of Tailscale. How it works Let’s say you want to run a tailcat server. Here’s what it does: generates a keypair (either ephemeral or named & reused) picks a DERP server (either one you specify, or an auto-selected bandwidth-limited Tailscale-run one) generates a tailcat address, which is a string of the form: tc + base64(CBOR( public key + DERP bootstrap info )) you then share that address string with somebody out of band, either directly, or by putting it in a DNS TXT record, and sharing that DNS hostname out of band The client side is about the same: pick a key (ephemeral or locally named & reused) connect to the rendezvous DERP server specified in the tailcat address send a MEOW message to the server’s public key over DERP to add yourself to the netmap At that point, if the server is cool with that client’s public key (it can be optionally locked down), then it replies with a happy MEOW reply. The client then proceeds to make a TCP connection to the other side using an embedded userspace TCP stack atop WireGuard. There are actual IP addresses on the wire (IPv6 ones derived from your public key), but they’re never visible to users. Your operating system is never involved at the TCP layer and never sees the synthetic tailcat IPs. All your operating system does is send the DERP TCP messages and/or NAT-punched UDP WireGuard messages. Because it goes over Tailscale’s magicsock data plane, NAT traversal automatically kicks in and tries to get a direct connection, so data transfer (WireGuard UDP packets) ends up going directly between the client and server, without a DERP relay involved. But if both sides are behind a hard NAT without any port mapping services available, the data packets are relayed over DERP as a fallback. If you use Tailscale-hosted DERP servers, those are rate-limited (bandwidth costs us money). But if you run your own DERP server, you can control any rate limiting. In the default mode where you don’t specify a port number on the tailcat server, the default is to just pipe the received data to the server’s stdout, like netcat . But it can also run in a client mode, where it runs a SOCKS server on an ephemeral local port and then runs a provided child process (e.g. curl or whatever) with an environment variable set to use said SOCKS server, letting tailcat -oblivious programs use tailcat transparently. ( tailcat is currently always userspace-only, never reconfiguring your system’s networking stack … no TUN devices, no routing table changes, etc.) Why? I wrote tailcat in September 2023 on a long ten-hour flight while catching up on bad movies. At the time, tailcat was mostly a fun novelty. I presented it internally, and I’d use it occasionally myself, but I mostly forgot about it. But then a number of customers approached us with use cases where it was a perfect fit, so we gave them copies of it, with arrangements where we’d host the DERP fallback relays for them in cases where tailcat’s use of Tailscale’s magicsock fails to get a direct connection. Fast-forward to a few months ago, when all this AI agentic coding stuff was in full swing. It’s been really powerful to just give my sandboxed AI agents access to make their own also-untrusted nested VMs and give them tailcat. With access to exotic hardware in faraway places, I let the AI go wild wiring things up to each other and running experiments. Off the top of my head, I can recall: giving an agent access to a fleet of every Raspberry Pi generation giving an agent access to a sandboxed EC2 instance that had ambient access to control a nearby EC2 instance and kexec reboot it repeatedly, while porting Tailscale to run in EC2’s UEFI environment, including porting the Amazon Nitro ENA network driver to pure Go (under Tamago ) giving an agent access to a Windows host to repeatedly create and destroy Hyper-V VMs to debug and fix a stack corruption bug in the Go runtime and standard library In most of these cases, I probably technically could’ve just used Tailscale proper, but it would’ve been more tedious to the point that I probably wouldn’t have even done it, and would’ve just set up a few port forwards instead, or opened up some ports on a firewall somewhere. I find that tailcat is often the perfect tool when I already have two shells open on two machines in two very different worlds and I just want to connect the two together, for a quick file copy, or port forward, or letting one SSH to the other. Especially when one side is untrusted or ephemeral or I’m afraid to touch its system configuration. When we launched Taildrop in 2021, one of the first requests was for netcat-like sharing between nodes. tailcat now provides that, and more. We’d still like to do something tailcat -like in the main Tailscale client too, but we’ll have to figure out how that fits into the rest of the Tailscale product. Another reason to open source tailcat is that it’s kinda obvious and inevitable. We’d selfishly rather people be using, improving, and filing bugs against our data plane, which then makes the rest of the Tailscale product better. “Contact Sales” I would be remiss if I didn’t mention that you should contact