2026 OpenClaw × Tailscale tailnet · `gateway.bind`, ACL 및 공개망 노출 없는 CLI·채널 검증 Runbook

약 16분 읽기 · MACCOME

대상 문제: OpenClaw Gateway는 이미 동작하지만 18789를 공중망에 두고 싶지 않고, 노트북·CI·상시 서버가 동일한신뢰 메시에서 CLI와 채널로 핸드셰이크를 끝내야 한다는 상황.핵심 결론: gateway.bindtailnet 의미에 맞추고 Tailscale ACL누가 누구에게 18789를 열 수 있는지를 글로 남긴다. 검증 순서는 openclaw gateway status 이후 tailnet ping, 최소 대화.글 분할:Nginx/Caddy 반대 TLS 체크리스트》《Cloudflare Tunnel + systemd》와 함께 공역 TLS, 아웃바운드 터널, 완전 tailnet 고립을 덮으며, Compose 세부 내용은 《Docker Compose 페어링》《영 트러스트 원격 Mac》로 순환합니다.

tailnet만 썼는데도 걸리는 다섯 가지 원인 (“공중망을 껐다”만으로 안전하지 않음)

WAN 플레인만 제거했다고 ACL이 줄지는 않으며, 같은 증상이 모델 지연처럼 보일 수 있습니다. 메시 시간대와 게이트웨이 업그레이드 시간을 UTC로 표기해 교차 검증하세요.

  1. 과도하게 넓은 ACL (*:* 등) 은 모든 노드가18789를 스윕 가능하게 만드는 새 위협 플레인입니다.
  2. 바인드 모드와 GATEWAY_URL 불일치 때문에 tailscale ping은 성공하지만 레거시 IP로 채널이 붙는 사례가 반복됩니다.
  3. MagicDNS + 기업 VPN Split DNS가 충돌하면 동일 이름이 서로 다른 터널로 흘러무작위 타임아웃이 납니다.
  4. MTU·WebSocket 문제는 패킷이 잘리면 우선적으로 TLS 교착 상태를 유발합니다. 토큰 재발급 전에 패스 MTU 테스트를 진행합니다.
  5. subnet router 오판은 RFC1918 광고가 exit 정책 없이 섞이면 Gateway를 우회하는 경로를 만듭니다.

ACL hujson은 이제 방화벽 정책 창고입니다. CVE 대응·포트·비밀 로테이션 Runbook의 최소 권한 원칙을 tailnet 주체에도 그대로 적용합니다.

노출 모델 적합 전제 주요 트레이드오프
공역 + TLS 역프록시 외부 SaaS 웹훅이나 단말마다 에이전트를 깔기 어려운 이동형 클라이언트. 인증서·WAF·레이트 제한 복잡도 상승. 반대 TLS 글 참고.
Cloudflare Tunnel 등 아웃바운드 터널 원본 IP를 숨기고 인바운드 포워딩을 열기 싫을 때. POP·제3자 제어 의존. Tunnel Runbook.
tailnet 전용 + gateway.bind=tailnet 전 직원이 Tailscale에 등록했고 Gateway가 여섯 지역 전용 Mac 또는 Linux에 상주. 태그를 명확히 써야 함. Tailscale 비클라이언트가 도달하지 못하는 것은 설계상 정상일 수 있음.
warning

tailnet을 비밀 관리자 VPN으로 착각하지 마세요. group:dev만 붙이고 전원 ping을 허용하면 감사 시 누가 18789에 붙었는지 설명할 수 없습니다. 모든 ACL은 티켓으로 추적합니다.

권장 토폴로지: Gateway G, 운영자 O, 선택적 SR

tailscale up 이후 G는 태그된 피어만 향해 TCP 18789를 선언합니다. OOPENCLAW_GATEWAY_URL에 MagicDNS 또는 tailnet IP를 기입하고 tailnet-only 선언 이후 LAN URL을 제거합니다.

CI는 tag:ci로 등록하고 ACL은 tag:ci → tag:gateway:18789 한 줄로 제한합니다.

SSH·클라우드플레어드 조합은 《영 트러스트 원격 Mac》를 읽고, OpenClaw 리스너 조항을 같은 변경 티켓에 묶습니다.

여섯 단계: tailscale up부터 의미 있는 첫 패킷까지

  1. 노드 정체 고정: tailscale status 이름·IP를 변경 기록에 복사.
  2. ACL 먼저 병합: UDP 41641 + 필요 TCP(18789 포함) 허용, 기본 거부 존재 확인.
  3. gateway.bind 수렴: 설정(~/.openclaw/openclaw.json 또는 볼륨)에 tailnet 설정, gateway.mode를 릴리스 문서와 대조.필드 경로는 버전마다 변할 수 있습니다.
  4. 토큰 단일 출처: 환경 변수와 gateway.auth.token 지문 맞춤(Cf. Compose 페어링 표).
  5. OpenClaw 자가 점검: openclaw gateway statusopenclaw doctor, 실패 시 양쪽 로그를 동시간대로 수집.
  6. 스모크: curl -v --max-time 5 혹은 문서의 WS 경로, 최소 대화로 컨텍스트 유지 확인. 《doctor 1차 트러블슈팅》로 남은 가지를 정렬합니다.
json
{
  "gateway": {
    "mode": "local",
    "bind": "tailnet",
    "port": 18789,
    "auth": {
      "mode": "token",
      "token": "${OPENCLAW_GATEWAY_TOKEN}"
    }
  }
}
// NOTE: 예시일 뿐입니다. 스키마 검증 후 게이트웨이 프로세스나 컨테이너를 재시작하세요.
HuJSON
// ACL 예: ops가 gateway의 18789만 열도록 허용 — 태그 명은 조직 규칙에 맞게 변경
{
  "groups": { "group:ops": ["[email protected]"] },
  "tagOwners": { "tag:gateway": ["autogroup:admin"], "tag:ops": ["autogroup:admin"] },
  "acls": [
    {
      "action": "accept",
      "src": ["tag:ops"],
      "dst": ["tag:gateway:18789"],
      "proto": "tcp"
    }
  ]
}

변경 검토·감사첨부에 넣을 기술 사실 세 가지

  • tailnet 가입이 곧 제로 트러스트는 아님: 도난 단말과 늦은 폐기는 ACL이 넓을수록 치명적입니다.
  • WebSocket은 MTU·미들박스에 민감: bind를 넓히기 전 ICMP·tailscale ping으로 조각화 여부를 확인합니다.
  • DNS 경쟁이 채널을 먼저 오염: gateway healthy가 녹색이어도 webhook DNS 실패가 있을 수 있으니 MagicDNS 분할 정책을 티켓에 적습니다.

노트북 tailnet exit에 Gateway를 오래 두기 어려운 이유

수면·덮개·패치 재부팅·가정용 업링크는 18789 SLA를 흔들고, 개인 데이터와 게이트웨이 로그가 섞이면 포렌식이 어렵습니다. 여섯 지역 전용 Apple 실리콘 원격 Mac이 상시 OpenClaw 신경절에 더 잘 맞습니다.

세 경로(공역 TLS, 터널, tailnet)는 환경별 RACI가 필요합니다. MACCOME은 탄력 임대와 하드웨어를 정렬해 주며, 공개 요금고객센터를 먼저 확인한 뒤 바인딩 Runbook을 채웁니다.

마무리: JSON을 고치기 전에 흐름도 그리기

누가 누구에게 18789를 열었는지 설명할 수 없다면 설정 편집은 위험합니다. “tailnet-only”는 반복해서 설명 가능한 경로를 뜻합니다.

다음으로 읽을 문서는 Compose, TLS 반대, Tunnel, 보안 강화 중 필요한 조합을 고릅니다. SLA가 물리 노드와 묶일 때 비용 페이지를 재검토하세요.

자주 묻는 질문

Docker를 포기해야 하나요?

아니요. 컨테이너는 netns만 옮깁니다. 《Compose 페어링》을 유지하되 호스트 tailnet IP·DNS와 publish 포트가 일치하는지 확인하세요.

tailnet 이후에도 SSH 점프를 겹쳐도 되나요?

가능합니다. 《영 트러스트 원격 Mac》이 경로 선택을 설명합니다. OpenClaw 측에서는 TCP 18789 ACL을 22/tcp와 별도 항목으로 유지하세요.