Gateway
Wykrywanie Bonjour
OpenClaw może używać Bonjour (mDNS/DNS-SD) do wykrywania aktywnego Gateway (punktu końcowego WebSocket). Przeglądanie multiemisji local. jest udogodnieniem działającym wyłącznie w sieci LAN: dołączony Plugin bonjour odpowiada za rozgłaszanie w sieci LAN, uruchamiając się automatycznie na hostach macOS oraz opcjonalnie w systemach Linux i Windows, a także we wdrożeniach Gateway w kontenerach. Ten sam sygnał może być również publikowany za pośrednictwem skonfigurowanej domeny DNS-SD sieci rozległej w celu wykrywania między sieciami. Wykrywanie działa na zasadzie najlepszych starań i nie zastępuje łączności opartej na SSH ani Tailnet.
Bonjour w sieci rozległej (DNS-SD unicast) przez Tailscale
Jeśli Node i Gateway znajdują się w różnych sieciach, multiemisja mDNS nie może przekroczyć ich granicy. Można zachować ten sam sposób korzystania z wykrywania, przełączając się na DNS-SD unicast („Bonjour w sieci rozległej”) przez Tailscale:
- Uruchom serwer DNS na hoście Gateway, dostępny przez Tailnet.
- Opublikuj rekordy DNS-SD dla
_openclaw-gw._tcpw dedykowanej strefie (przykład:openclaw.internal.). - Skonfiguruj split DNS w Tailscale, aby wybrana domena była rozwiązywana dla klientów, w tym iOS, za pośrednictwem tego serwera DNS.
Powyższa domena openclaw.internal. jest tylko przykładem — OpenClaw obsługuje dowolną domenę wykrywania. Node iOS/Android przeglądają zarówno local., jak i skonfigurowaną domenę sieci rozległej.
Konfiguracja Gateway
{ gateway: { bind: "tailnet" }, // tylko Tailnet (zalecane) discovery: { wideArea: { enabled: true, domain: "openclaw.internal" } },}discovery.wideArea.domain akceptuje również zmienną środowiskową OPENCLAW_WIDE_AREA_DOMAIN jako wartość zapasową, gdy nie jest ustawiona.
Jednorazowa konfiguracja serwera DNS (host Gateway, tylko macOS)
openclaw dns setup --applyTo polecenie działa tylko w systemie macOS i wymaga Homebrew oraz aktywnego połączenia Tailscale. Instaluje CoreDNS (brew install coredns) i konfiguruje go tak, aby:
- nasłuchiwał na porcie 53 wyłącznie na interfejsach Tailscale hosta Gateway
- obsługiwał wybraną domenę (przykład:
openclaw.internal.) z~/.openclaw/dns/<domain>.db
Najpierw uruchom bez --apply, aby wyświetlić plan (domenę, ścieżkę pliku strefy, wykryty adres IP Tailnet i zalecaną konfigurację) bez instalowania czegokolwiek.
Sprawdź z maszyny połączonej z Tailnet:
dns-sd -B _openclaw-gw._tcp openclaw.internal.dig @<TAILNET_IPV4> -p 53 _openclaw-gw._tcp.openclaw.internal PTR +shortUstawienia DNS Tailscale
W konsoli administracyjnej Tailscale:
- Dodaj serwer nazw wskazujący adres IP Tailnet hosta Gateway (UDP/TCP 53).
- Dodaj split DNS, aby domena wykrywania używała tego serwera nazw.
Gdy klienci zaakceptują DNS Tailnet, Node iOS oraz wykrywanie przez CLI mogą przeglądać _openclaw-gw._tcp w domenie wykrywania bez multiemisji.
Bezpieczeństwo nasłuchiwania Gateway
Port WS Gateway (domyślnie 18789) jest domyślnie powiązany z interfejsem pętli zwrotnej. Aby uzyskać dostęp przez LAN/Tailnet, należy jawnie skonfigurować powiązanie i pozostawić uwierzytelnianie włączone. W konfiguracjach działających wyłącznie przez Tailnet ustaw gateway.bind: "tailnet" w ~/.openclaw/openclaw.json i uruchom ponownie Gateway (lub aplikację macOS na pasku menu).
Co jest rozgłaszane
Tylko Gateway rozgłasza _openclaw-gw._tcp. Rozgłaszanie multiemisji w sieci LAN pochodzi z dołączonego Pluginu bonjour, gdy jest włączony; publikowanie DNS-SD w sieci rozległej pozostaje własnością Gateway.
Typy usług
_openclaw-gw._tcp— sygnał transportowy Gateway używany przez Node macOS/iOS/Android.
Klucze TXT (niejawne wskazówki)
| Klucz | Kiedy występuje |
|---|---|
role=gateway |
Zawsze. |
displayName=<friendly name> |
Zawsze. |
lanHost=<hostname>.local |
Zawsze. |
gatewayPort=<port> |
Zawsze (WS + HTTP Gateway). |
transport=gateway |
Zawsze. |
gatewayTls=1 |
Tylko gdy TLS jest włączony. |
gatewayTlsSha256=<sha256> |
Tylko gdy TLS jest włączony i dostępny jest odcisk. |
gatewayDirectReachable=1 |
Tylko gdy Gateway jest osiągalny bezpośrednio (nie wyłącznie przez ścieżkę przekaźnika/proxy). |
canvasPort=<port> |
Tylko gdy host obszaru roboczego jest włączony; obecnie ma tę samą wartość co gatewayPort. |
tailnetDns=<magicdns> |
Tylko pełny tryb mDNS; opcjonalna wskazówka, gdy Tailnet jest dostępny. |
sshPort=<port> |
Tylko tryb pełny; pomijany w trybach minimalnym i wyłączonym. |
cliPath=<path> |
Tylko tryb pełny; pomijany w trybach minimalnym i wyłączonym. |
Uwagi dotyczące bezpieczeństwa:
- Rekordy TXT Bonjour/mDNS są nieuwierzytelnione. Klienci nie mogą traktować TXT jako autorytatywnego źródła routingu.
- Klienci powinni wyznaczać trasę przy użyciu rozwiązanego punktu końcowego usługi (SRV + A/AAAA). Traktuj
lanHost,tailnetDns,gatewayPortigatewayTlsSha256wyłącznie jako wskazówki. - Automatyczny wybór celu SSH powinien podobnie używać rozwiązanego hosta usługi, a nie wskazówek pochodzących wyłącznie z TXT.
- Przypinanie TLS nigdy nie może pozwalać, aby rozgłaszany
gatewayTlsSha256zastąpił wcześniej zapisane przypięcie. - Node iOS/Android powinny traktować bezpośrednie połączenia oparte na wykrywaniu jako działające wyłącznie przez TLS oraz wymagać wyraźnego potwierdzenia przed zaufaniem odciskowi po raz pierwszy.
Debugowanie w systemie macOS
Wbudowane narzędzia:
# Przeglądanie instancjidns-sd -B _openclaw-gw._tcp local. # Rozwiązywanie jednej instancji (zastąp <instance>)dns-sd -L "<instance>" _openclaw-gw._tcp local.Jeśli przeglądanie działa, ale rozwiązywanie kończy się niepowodzeniem, zwykle przyczyną jest polityka sieci LAN lub problem z mechanizmem rozwiązywania mDNS.
Debugowanie w dziennikach Gateway
Gateway zapisuje rotacyjny plik dziennika (wyświetlany podczas uruchamiania jako gateway log file: ...). Poszukaj wierszy bonjour:, zwłaszcza:
bonjour: advertise failed ...bonjour: suppressing ciao netmask assertion ...bonjour: ... name conflict resolved/hostname conflict resolved
OpenClaw uruchamia każdą usługę Bonjour jeden raz, a sondowanie, ponawianie prób, rozwiązywanie konfliktów nazw i ponowne publikowanie po zmianie interfejsu pozostawia mechanizmowi odpowiedzi mDNS. Pozwala to uniknąć nakładających się prób publikowania podczas zwykłych zmian stanu sieci. Powtarzające się wewnętrzne komunikaty samoczynnego sondowania są pomijane, aby nie mogły zapełnić dziennika Gateway.
Gdy wiele Gateway OpenClaw rozgłasza się z tego samego hosta, Bonjour może dodawać sufiksy, takie jak (2) lub (3), aby zachować unikatowe nazwy instancji usług. Takie sufiksy są normalnym wynikiem rozwiązywania konfliktów i nie wskazują na zduplikowany nadzór OCM.
Bonjour używa systemowej nazwy hosta dla rozgłaszanego hosta .local, jeśli jest ona prawidłową etykietą DNS. Jeśli systemowa nazwa hosta zawiera spacje, podkreślenia lub inny znak niedozwolony w etykiecie DNS, OpenClaw używa zamiast niej openclaw.local. Ustaw OPENCLAW_MDNS_HOSTNAME=<name> przed uruchomieniem Gateway, gdy wymagana jest jawna etykieta hosta.
Debugowanie w Node iOS
Node iOS używa NWBrowser do wykrywania _openclaw-gw._tcp.
Aby przechwycić dzienniki: Settings -> Gateway -> Advanced -> Discovery Debug Logs, następnie Settings -> Gateway -> Advanced -> Discovery Logs -> odtwórz problem -> Copy. Dziennik zawiera przejścia stanu przeglądarki i zmiany zestawu wyników.
Kiedy włączyć Bonjour
Bonjour uruchamia się automatycznie przy uruchamianiu Gateway z pustą konfiguracją na hostach macOS, ponieważ lokalna aplikacja oraz pobliskie Node iOS/Android często korzystają z wykrywania w tej samej sieci LAN.
Włącz go jawnie, gdy automatyczne wykrywanie w tej samej sieci LAN jest przydatne w systemie Linux, Windows lub na innym hoście bez macOS:
openclaw plugins enable bonjourPo włączeniu Bonjour używa discovery.mdns.mode, aby określić ilość publikowanych metadanych TXT; ten sam tryb steruje opcjonalnymi wskazówkami TXT w rekordach DNS-SD sieci rozległej. Tryby:
| Tryb | Zachowanie |
|---|---|
minimal (domyślny) |
Tylko podstawowe klucze TXT; pomija sshPort, cliPath, tailnetDns. |
full |
Dodaje sshPort, cliPath, tailnetDns — użyj, gdy klienci potrzebują tych wskazówek. |
off |
Pomija multiemisję w sieci LAN bez zmiany stanu włączenia Pluginu; DNS-SD sieci rozległej nadal może publikować minimalny sygnał, gdy discovery.wideArea.enabled ma wartość true. |
Kiedy wyłączyć Bonjour
Pozostaw Bonjour wyłączony, gdy rozgłaszanie multiemisji w sieci LAN jest zbędne, niedostępne lub szkodliwe — częste przypadki to serwery bez macOS, sieć mostkowa Docker, WSL albo polityka sieciowa odrzucająca multiemisję mDNS. Gateway pozostaje osiągalny przez opublikowany adres URL, SSH, Tailnet lub DNS-SD sieci rozległej; zawodna staje się jedynie funkcja automatycznego wykrywania w sieci LAN.
Użyj nadpisania przez zmienną środowiskową w przypadku problemów dotyczących konkretnego wdrożenia (bezpieczne dla obrazów Docker, plików usług, skryptów uruchomieniowych i jednorazowego debugowania — znika wraz ze środowiskiem):
OPENCLAW_DISABLE_BONJOUR=1Użyj konfiguracji Pluginu, gdy dołączony Plugin wykrywania w sieci LAN ma zostać celowo wyłączony dla danej konfiguracji OpenClaw:
openclaw plugins disable bonjourPułapki związane z Dockerem
Dołączony Plugin Bonjour automatycznie wyłącza rozgłaszanie multiemisji w sieci LAN w wykrytych kontenerach, gdy OPENCLAW_DISABLE_BONJOUR nie jest ustawiona. Sieci mostkowe Docker zwykle nie przekazują multiemisji mDNS (224.0.0.251:5353) między kontenerem a siecią LAN, dlatego rozgłaszanie z kontenera rzadko umożliwia działanie wykrywania.
Pułapki:
- Bonjour uruchamia się automatycznie na hostach macOS, a w innych środowiskach wymaga jawnego włączenia. Pozostawienie go wyłączonego nie zatrzymuje Gateway — pomija jedynie rozgłaszanie multiemisji w sieci LAN.
- Wyłączenie Bonjour nie zmienia
gateway.bind; Docker nadal domyślnie używaOPENCLAW_GATEWAY_BIND=lan, dzięki czemu opublikowany port hosta działa. - Wyłączenie Bonjour nie wyłącza DNS-SD sieci rozległej. Użyj wykrywania w sieci rozległej lub Tailnet, gdy Gateway i Node nie znajdują się w tej samej sieci LAN.
- Ponowne użycie tej samej
OPENCLAW_CONFIG_DIRpoza Dockerem nie zachowuje zasady automatycznego wyłączania z kontenera. - Ustaw
OPENCLAW_DISABLE_BONJOUR=0tylko w przypadku sieci hosta, macvlan lub innej sieci, w której multiemisja mDNS na pewno jest przekazywana; ustaw wartość1, aby wymusić wyłączenie.
Rozwiązywanie problemów z wyłączonym Bonjour
Jeśli po skonfigurowaniu Dockera Node przestanie automatycznie wykrywać Gateway:
-
Sprawdź, czy Gateway działa w trybie automatycznym, wymuszonego włączenia czy wymuszonego wyłączenia:
bash docker compose config | grep OPENCLAW_DISABLE_BONJOUR -
Sprawdź, czy sam Gateway jest osiągalny przez opublikowany port:
bash curl -fsS http://127.0.0.1:18789/healthz -
Gdy Bonjour jest wyłączony, użyj bezpośredniego celu:
- Interfejs sterowania lub narzędzia lokalne:
http://127.0.0.1:18789 - Klienci sieci LAN:
http://<gateway-host>:18789 - Klienci między sieciami: MagicDNS Tailnet, adres IP Tailnet, tunel SSH lub DNS-SD sieci rozległej
- Interfejs sterowania lub narzędzia lokalne:
-
Jeśli Plugin Bonjour został celowo włączony w Dockerze, a rozgłaszanie wymuszono za pomocą
OPENCLAW_DISABLE_BONJOUR=0, przetestuj multiemisję z hosta:bash dns-sd -B _openclaw-gw._tcp local.Jeśli przeglądanie nie zwraca wyników lub dzienniki Gateway wskazują powtarzające się błędy sondowania ciao, przywróć
OPENCLAW_DISABLE_BONJOUR=1i użyj trasy bezpośredniej lub Tailnet.
Typowe tryby awarii
- Bonjour nie działa między sieciami: użyj Tailnet lub SSH.
- Multiemisja jest zablokowana: niektóre sieci Wi-Fi wyłączają mDNS.
- Moduł rozgłaszający utknął na sondowaniu/ogłaszaniu: hosty z zablokowaną multiemisją, mosty kontenerów, WSL lub częste zmiany interfejsów mogą pozostawić responder w stanie bez ogłoszenia. Gateway pozostaje dostępny przez trasy bezpośrednie, SSH, Tailnet lub rozległego DNS-SD; gdy multiemisja jest niedostępna, wyłącz Bonjour w sieci LAN za pomocą
discovery.mdns.mode: "off"lubOPENCLAW_DISABLE_BONJOUR=1. - Sieć mostkowa Docker: Bonjour wyłącza się automatycznie w wykrytych kontenerach. Ustaw
OPENCLAW_DISABLE_BONJOUR=0tylko dla sieci hosta, macvlan lub innej sieci obsługującej mDNS. - Uśpienie/częste zmiany interfejsów: macOS może tymczasowo przestać zwracać wyniki mDNS; spróbuj ponownie.
- Przeglądanie działa, ale rozpoznawanie kończy się niepowodzeniem: używaj prostych nazw maszyn (unikaj emoji i znaków interpunkcyjnych), a następnie uruchom ponownie Gateway. Nazwa instancji usługi pochodzi od nazwy hosta, więc nadmiernie złożone nazwy mogą dezorientować niektóre resolvery.
Nazwy instancji ze znakami ucieczki (\032)
Bonjour/DNS-SD często zapisuje bajty w nazwach instancji usług jako dziesiętne sekwencje \DDD (spacje stają się \032). Jest to normalne na poziomie protokołu; interfejsy użytkownika powinny je dekodować na potrzeby wyświetlania (iOS używa BonjourEscapes.decode).
Włączanie / wyłączanie / konfiguracja
| Ustawienie | Efekt |
|---|---|
openclaw plugins enable bonjour |
Włącza dołączony Plugin wykrywania w sieci LAN na hostach, na których nie jest on domyślnie włączony. |
openclaw plugins disable bonjour |
Wyłącza rozgłaszanie multiemisji w sieci LAN przez wyłączenie dołączonego Pluginu. |
OPENCLAW_DISABLE_BONJOUR=1 (lub true/yes/on) |
Wyłącza rozgłaszanie multiemisji w sieci LAN bez zmiany konfiguracji Pluginu. |
OPENCLAW_DISABLE_BONJOUR=0 (lub false/no/off) |
Wymusza włączenie rozgłaszania multiemisji w sieci LAN, również wewnątrz wykrytych kontenerów. |
discovery.mdns.mode |
off | minimal (domyślnie) | full — zobacz tryby powyżej. |
gateway.bind |
Steruje trybem powiązania Gateway w ~/.openclaw/openclaw.json. |
OPENCLAW_SSH_PORT |
Zastępuje port SSH, gdy rozgłaszane jest sshPort (tryb pełny). |
OPENCLAW_TAILNET_DNS |
Publikuje wskazówkę MagicDNS w rekordzie TXT, gdy włączony jest pełny tryb mDNS. |
OPENCLAW_CLI_PATH |
Zastępuje rozgłaszaną ścieżkę CLI (tryb pełny). |
Hosty macOS domyślnie automatycznie uruchamiają dołączony Plugin wykrywania w sieci LAN. Gdy Plugin Bonjour jest włączony, a OPENCLAW_DISABLE_BONJOUR nie jest ustawione, Bonjour rozgłasza się na zwykłych hostach i automatycznie wyłącza wewnątrz wykrytych kontenerów (Docker, maszyny Fly.io i popularne środowiska uruchomieniowe kontenerów).
Powiązana dokumentacja
- Zasady wykrywania i wybór transportu: Wykrywanie
- Parowanie Node + zatwierdzenia: Parowanie Gateway