- Operatori (tu o l’app macOS): una connessione WebSocket diretta tramite LAN/Tailnet è la soluzione più semplice quando il Gateway è raggiungibile; il tunnel SSH è l’alternativa universale.
- Nodi (iOS/Android e altri dispositivi): si connettono al WebSocket del Gateway (tramite LAN/tailnet o tunnel SSH).
Il concetto fondamentale
Per impostazione predefinita, il WebSocket del Gateway si associa all’interfaccia loopback, sulla porta18789 (gateway.port). Per l’uso remoto, esponilo tramite Tailscale Serve o un’associazione LAN-Tailnet attendibile, oppure inoltra la porta loopback tramite SSH.
Opzioni di topologia
Per le configurazioni con Gateway sempre attivo e con portatile, è preferibile mantenere
gateway.bind: "loopback" e utilizzare Tailscale Serve per l’interfaccia di controllo, oppure un’associazione LAN/Tailnet attendibile con gateway.remote.transport: "direct". Il tunnel SSH è l’alternativa che funziona da qualsiasi computer.
Flusso dei comandi (cosa viene eseguito e dove)
Un solo Gateway gestisce stato e canali; i nodi sono periferiche. Esempio (messaggio Telegram instradato a uno strumento del nodo):- Il messaggio Telegram arriva al Gateway.
- Il Gateway esegue l’agente, che decide se chiamare uno strumento del nodo.
- Il Gateway chiama il nodo tramite il WebSocket del Gateway (RPC
node.invoke). - Il nodo restituisce il risultato; il Gateway risponde su Telegram.
Tunnel SSH (CLI + strumenti)
openclaw health e openclaw status --deep raggiungono il Gateway remoto tramite ws://127.0.0.1:18789. Anche openclaw gateway status, openclaw gateway health, openclaw gateway probe e openclaw gateway call possono utilizzare un URL inoltrato tramite --url.
Sostituisci
18789 con il valore configurato per gateway.port (oppure --port / OPENCLAW_GATEWAY_PORT).Impostazioni remote predefinite della CLI
Salva una destinazione remota affinché i comandi CLI la utilizzino per impostazione predefinita:ws://127.0.0.1:18789 e apri prima il tunnel SSH. Nel trasporto tramite tunnel SSH dell’app macOS, il nome host del Gateway rilevato va inserito in gateway.remote.sshTarget (user@host o user@host:port); gateway.remote.url rimane l’URL del tunnel locale. Se la porta remota è diversa da quella locale, imposta gateway.remote.remotePort.
La verifica della chiave host è rigorosa per impostazione predefinita (gateway.remote.sshHostKeyPolicy: "strict"). Impostala su "openssh" per delegarla invece alla configurazione OpenSSH effettiva; prima di abilitarla, controlla le impostazioni SSH dell’utente e del sistema.
Per un Gateway già raggiungibile tramite una LAN o una Tailnet attendibile, utilizza la modalità diretta:
Precedenza delle credenziali
La risoluzione delle credenziali del Gateway segue un unico contratto condiviso tra i percorsi di chiamata, verifica e stato e il monitoraggio delle approvazioni di esecuzione di Discord. L’host del nodo utilizza lo stesso contratto, con una sola eccezione per la modalità locale (ignoragateway.remote.*).
- Le credenziali esplicite (
--token,--passwordo ilgatewayTokendi uno strumento) hanno sempre la precedenza nei percorsi di chiamata che accettano un’autenticazione esplicita. - Sicurezza della sostituzione dell’URL:
- Il parametro CLI
--urlnon riutilizza mai credenziali implicite provenienti dalla configurazione o dall’ambiente. - La variabile d’ambiente
OPENCLAW_GATEWAY_URLpuò utilizzare solo credenziali dell’ambiente (OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD).
- Il parametro CLI
- Valori predefiniti della modalità locale:
- token:
OPENCLAW_GATEWAY_TOKEN->gateway.auth.token->gateway.remote.token(alternativa remota solo quando il token locale non è impostato) - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.auth.password->gateway.remote.password(alternativa remota solo quando la password locale non è impostata)
- token:
- Valori predefiniti della modalità remota:
- token:
gateway.remote.token->OPENCLAW_GATEWAY_TOKEN->gateway.auth.token - password:
OPENCLAW_GATEWAY_PASSWORD->gateway.remote.password->gateway.auth.password
- token:
- Eccezione della modalità locale dell’host del nodo:
gateway.remote.token/gateway.remote.passwordvengono ignorati. - Per impostazione predefinita, i controlli del token per verifica e stato remoti sono rigorosi: quando la destinazione è in modalità remota, utilizzano solo
gateway.remote.token(senza ricorrere al token locale). - Le sostituzioni tramite variabili d’ambiente del Gateway utilizzano solo
OPENCLAW_GATEWAY_*.
Accesso remoto all’interfaccia di chat
WebChat non dispone di una porta HTTP separata; l’interfaccia di chat SwiftUI si connette direttamente al WebSocket del Gateway.- Inoltra la porta
18789tramite SSH (vedi sopra), quindi connetti i client aws://127.0.0.1:18789. - Per la modalità diretta tramite LAN/Tailnet, connetti i client all’URL privato
ws://o sicurowss://configurato. - Su macOS, la modalità remota dell’app gestisce automaticamente il trasporto selezionato.
Modalità remota dell’app macOS
L’app macOS nella barra dei menu gestisce la stessa configurazione dall’inizio alla fine: controlli dello stato remoto, WebChat e inoltro dell’attivazione vocale. Procedura: accesso remoto macOS.Regole di sicurezza (remoto/VPN)
Mantieni il Gateway limitato al loopback, a meno che tu non sia certo di aver bisogno di un’associazione diversa.- Loopback + SSH/Tailscale Serve è l’impostazione predefinita più sicura (nessuna esposizione pubblica).
- Il protocollo
ws://non crittografato è accettato per host loopback, privati/LAN (RFC 1918), link-local, CGNAT,.locale.ts.net. Gli host remoti pubblici devono utilizzarewss://. - Le associazioni non loopback (
lan/tailnet/customoppureautoquando il loopback non è disponibile) devono utilizzare l’autenticazione del Gateway: token, password oppure un proxy inverso sensibile all’identità congateway.auth.mode: "trusted-proxy". gateway.remote.token/.passwordsono origini delle credenziali del client; da sole non configurano l’autenticazione del server.- I percorsi di chiamata locali possono utilizzare
gateway.remote.*come alternativa solo quandogateway.auth.*non è impostato. - Se
gateway.auth.token/gateway.auth.passwordè configurato esplicitamente tramite SecretRef e non può essere risolto, la risoluzione si interrompe in modo sicuro (senza che l’alternativa remota mascheri il problema). gateway.remote.tlsFingerprintvincola il certificato TLS remoto perwss://, inclusa la modalità diretta di macOS. Senza un’impronta salvata, macOS esegue il vincolo al primo utilizzo solo dopo il superamento della normale verifica di attendibilità del sistema; i Gateway autofirmati o con CA privata richiedono un’impronta esplicita oppure la modalità remota tramite SSH.- Tailscale Serve può autenticare il traffico dell’interfaccia di controllo/WebSocket tramite intestazioni di identità quando
gateway.auth.allowTailscale: true. Gli endpoint dell’API HTTP non utilizzano questa autenticazione tramite intestazioni e seguono invece la normale modalità di autenticazione HTTP del Gateway. Questo flusso senza token presuppone che l’host del Gateway sia attendibile; impostalo sufalseper utilizzare ovunque l’autenticazione con segreto condiviso. - L’autenticazione tramite proxy attendibile richiede per impostazione predefinita un proxy sensibile all’identità non associato al loopback. I proxy inversi loopback sullo stesso host richiedono l’impostazione esplicita
gateway.auth.trustedProxy.allowLoopback = true. - Considera il controllo tramite browser equivalente all’accesso dell’operatore: solo nella tailnet e con associazione intenzionale dei nodi.
macOS: tunnel SSH persistente tramite LaunchAgent
Per i client macOS, la configurazione persistente più semplice utilizza una voce SSHLocalForward e un LaunchAgent che mantiene attivo il tunnel dopo riavvii e arresti anomali.
Passaggio 1: aggiungere la configurazione SSH
Modifica~/.ssh/config:
<REMOTE_IP> e <REMOTE_USER> con i tuoi valori.
Passaggio 2: copiare la chiave SSH (una sola volta)
Passaggio 3: configurare il token del Gateway
gateway.remote.password se il Gateway remoto usa l’autenticazione tramite password. OPENCLAW_GATEWAY_TOKEN rimane valido come sostituzione a livello di shell, ma la configurazione persistente del client remoto è gateway.remote.token / gateway.remote.password.
Passaggio 4: creare il LaunchAgent
Salva il file come~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist:
Passaggio 5: caricare il LaunchAgent
Se è ancora presente un LaunchAgent
com.openclaw.ssh-tunnel di una configurazione precedente, scaricalo ed eliminalo.