Tailscale (Gateway 대시보드)
OpenClaw는 Gateway 대시보드 및 WebSocket 포트를 위해 Tailscale Serve (tailnet) 또는 Funnel (공개)을 자동 구성할 수 있습니다. 이렇게 하면 Gateway가 루프백에 바인딩된 상태로 유지되면서 Tailscale이 HTTPS, 라우팅 및 (Serve의 경우) identity 헤더를 제공합니다.
모드
- serve: tailscale serve를 통한 Tailnet 전용 Serve. gateway는 127.0.0.1에 유지됩니다.
- funnel: tailscale funnel을 통한 공개 HTTPS. OpenClaw는 공유 password가 필요합니다.
- off: 기본값 (Tailscale 자동화 없음).
인증
gateway.auth.mode를 설정하여 핸드셰이크를 제어:
- token (OPENCLAW_GATEWAY_TOKEN이 설정되었을 때 기본값)
- password (OPENCLAW_GATEWAY_PASSWORD 또는 config를 통한 공유 비밀)
tailscale.mode = "serve"이고 gateway.auth.allowTailscale이 true일 때, 유효한 Serve 프록시 요청은 token/password를 제공하지 않고도 Tailscale identity 헤더 (tailscale-user-login)를 통해 인증할 수 있습니다. OpenClaw는 로컬 Tailscale 데몬 (tailscale whois)을 통해 x-forwarded-for 주소를 확인하고 수락하기 전에 헤더와 일치시켜 identity를 검증합니다. OpenClaw는 요청이 Tailscale의 x-forwarded-for, x-forwarded-proto, x-forwarded-host 헤더와 함께 루프백에서 도착할 때만 Serve로 취급합니다. 명시적 자격 증명을 요구하려면, gateway.auth.allowTailscale: false로 설정하거나 gateway.auth.mode: "password"를 강제합니다.
Config 예제
Tailnet 전용 (Serve)
{
gateway: {
bind: "loopback",
tailscale: { mode: "serve" }
}
}
열기: https://<magicdns>/ (또는 구성된 gateway.controlUi.basePath)
Tailnet 전용 (Tailnet IP에 바인딩)
Gateway가 Tailnet IP에서 직접 수신하도록 하려면 이것을 사용하세요 (Serve/Funnel 없음).
{
gateway: {
bind: "tailnet",
auth: { mode: "token", token: "your-token" }
}
}
다른 Tailnet 장치에서 연결:
- Control UI: http://<tailscale-ip>:18789/
- WebSocket: ws://<tailscale-ip>:18789
참고: 이 모드에서는 루프백 (http://127.0.0.1:18789)이 작동하지 않습니다.
공개 인터넷 (Funnel + 공유 password)
{
gateway: {
bind: "loopback",
tailscale: { mode: "funnel" },
auth: { mode: "password", password: "replace-me" }
}
}
디스크에 password를 커밋하는 것보다 OPENCLAW_GATEWAY_PASSWORD를 선호하세요.
CLI 예제
openclaw gateway --tailscale serve
openclaw gateway --tailscale funnel --auth password
참고
- Tailscale Serve/Funnel은 tailscale CLI가 설치되고 로그인되어 있어야 합니다.
- tailscale.mode: "funnel"은 공개 노출을 피하기 위해 auth 모드가 password가 아니면 시작을 거부합니다.
- 종료 시 OpenClaw가 tailscale serve 또는 tailscale funnel 구성을 취소하도록 하려면 gateway.tailscale.resetOnExit를 설정하세요.
- gateway.bind: "tailnet"은 직접 Tailnet 바인딩입니다 (HTTPS 없음, Serve/Funnel 없음).
- gateway.bind: "auto"는 루프백을 선호합니다; Tailnet 전용을 원하면 tailnet을 사용하세요.
- Serve/Funnel은 Gateway control UI + WS만 노출합니다. Node는 동일한 Gateway WS 엔드포인트를 통해 연결하므로 Serve가 node 액세스에 작동할 수 있습니다.
브라우저 제어 (원격 Gateway + 로컬 브라우저)
한 머신에서 Gateway를 실행하지만 다른 머신에서 브라우저를 구동하려면, 브라우저 머신에서 node 호스트를 실행하고 둘 다 동일한 tailnet에 유지하세요. Gateway는 브라우저 동작을 node에 프록시합니다; 별도의 제어 서버나 Serve URL이 필요하지 않습니다.
브라우저 제어에는 Funnel을 피하세요; node 페어링을 operator 액세스처럼 취급하세요.
Tailscale 전제 조건 + 제한
- Serve는 tailnet에 HTTPS가 활성화되어 있어야 합니다; CLI가 누락된 경우 프롬프트를 표시합니다.
- Serve는 Tailscale identity 헤더를 주입합니다; Funnel은 그렇지 않습니다.
- Funnel은 Tailscale v1.38.3+, MagicDNS, HTTPS 활성화 및 funnel node 속성이 필요합니다.
- Funnel은 TLS를 통한 포트 443, 8443, 10000만 지원합니다.
- macOS의 Funnel은 오픈 소스 Tailscale 앱 변형이 필요합니다.
자세히 알아보기
- Tailscale Serve 개요: https://tailscale.com/kb/1312/serve
- tailscale serve 명령: https://tailscale.com/kb/1242/tailscale-serve
- Tailscale Funnel 개요: https://tailscale.com/kb/1223/tailscale-funnel
- tailscale funnel 명령: https://tailscale.com/kb/1311/tailscale-funnel