Gateway
การค้นหาผ่าน Bonjour
OpenClaw สามารถใช้ Bonjour (mDNS/DNS-SD) เพื่อค้นหา Gateway ที่กำลังทำงานอยู่ (ปลายทาง WebSocket) การเรียกดูแบบมัลติแคสต์ local. เป็นเพียง สิ่งอำนวยความสะดวกภายใน LAN เท่านั้น โดย Plugin bonjour ที่มาพร้อมระบบเป็นผู้รับผิดชอบการประกาศภายใน LAN ซึ่งจะเริ่มทำงานอัตโนมัติบนโฮสต์ macOS และต้องเลือกเปิดใช้งานบน Linux, Windows และการติดตั้งใช้งาน Gateway ภายในคอนเทนเนอร์ บีคอนเดียวกันนี้ยังสามารถเผยแพร่ผ่านโดเมน DNS-SD แบบเครือข่ายบริเวณกว้างที่กำหนดค่าไว้ เพื่อให้ค้นหาข้ามเครือข่ายได้อีกด้วย การค้นหาเป็นแบบพยายามให้ดีที่สุดและ ไม่ ใช้แทนการเชื่อมต่อผ่าน SSH หรือ Tailnet
Bonjour แบบเครือข่ายบริเวณกว้าง (Unicast DNS-SD) ผ่าน Tailscale
หาก Node และ Gateway อยู่คนละเครือข่าย mDNS แบบมัลติแคสต์จะไม่สามารถข้ามขอบเขตเครือข่ายได้ คุณสามารถคงประสบการณ์การค้นหาแบบเดิมไว้โดยเปลี่ยนไปใช้ DNS-SD แบบยูนิแคสต์ ("Bonjour แบบเครือข่ายบริเวณกว้าง") ผ่าน Tailscale:
- เรียกใช้เซิร์ฟเวอร์ DNS บนโฮสต์ Gateway ซึ่งเข้าถึงได้ผ่าน Tailnet
- เผยแพร่ระเบียน DNS-SD สำหรับ
_openclaw-gw._tcpภายใต้โซนเฉพาะ (ตัวอย่าง:openclaw.internal.) - กำหนดค่า DNS แบบแยก ของ Tailscale เพื่อให้โดเมนที่คุณเลือกได้รับการแก้ชื่อผ่านเซิร์ฟเวอร์ DNS นั้นสำหรับไคลเอนต์ รวมถึง iOS
openclaw.internal. ข้างต้นเป็นเพียงตัวอย่าง — OpenClaw รองรับโดเมนการค้นหาใดก็ได้ Node บน iOS/Android จะเรียกดูทั้ง local. และโดเมนแบบเครือข่ายบริเวณกว้างที่คุณกำหนดค่าไว้
การกำหนดค่า Gateway
{ gateway: { bind: "tailnet" }, // เฉพาะ tailnet (แนะนำ) discovery: { wideArea: { enabled: true, domain: "openclaw.internal" } },}discovery.wideArea.domain ยังยอมรับตัวแปรสภาพแวดล้อม OPENCLAW_WIDE_AREA_DOMAIN เป็นค่าทดแทนเมื่อไม่ได้ตั้งค่าไว้
การตั้งค่าเซิร์ฟเวอร์ DNS ครั้งเดียว (โฮสต์ Gateway, เฉพาะ macOS)
openclaw dns setup --applyคำสั่งนี้ใช้ได้เฉพาะ macOS และต้องมี Homebrew รวมถึงการเชื่อมต่อ Tailscale ที่กำลังทำงานอยู่ คำสั่งจะติดตั้ง CoreDNS (brew install coredns) และกำหนดค่าให้:
- รับฟังที่พอร์ต 53 เฉพาะบนอินเทอร์เฟซ Tailscale ของ Gateway
- ให้บริการโดเมนที่คุณเลือก (ตัวอย่าง:
openclaw.internal.) จาก~/.openclaw/dns/<domain>.db
เรียกใช้โดยไม่มี --apply ก่อนเพื่อดูตัวอย่างแผน (โดเมน พาธไฟล์โซน IP ของ Tailnet ที่ตรวจพบ และการกำหนดค่าที่แนะนำ) โดยไม่ติดตั้งสิ่งใด
ตรวจสอบจากเครื่องที่เชื่อมต่อกับ Tailnet:
dns-sd -B _openclaw-gw._tcp openclaw.internal.dig @<TAILNET_IPV4> -p 53 _openclaw-gw._tcp.openclaw.internal PTR +shortการตั้งค่า DNS ของ Tailscale
ในคอนโซลผู้ดูแลระบบ Tailscale:
- เพิ่มเซิร์ฟเวอร์ชื่อที่ชี้ไปยัง IP ของ Tailnet ของ Gateway (UDP/TCP 53)
- เพิ่ม DNS แบบแยกเพื่อให้โดเมนการค้นหาของคุณใช้เซิร์ฟเวอร์ชื่อนั้น
เมื่อไคลเอนต์ยอมรับ DNS ของ Tailnet แล้ว Node บน iOS และการค้นหาผ่าน CLI จะสามารถเรียกดู _openclaw-gw._tcp ในโดเมนการค้นหาของคุณได้โดยไม่ต้องใช้มัลติแคสต์
ความปลอดภัยของตัวรับฟัง Gateway
โดยค่าเริ่มต้น พอร์ต WS ของ Gateway (ค่าเริ่มต้น 18789) จะผูกกับลูปแบ็ก สำหรับการเข้าถึงผ่าน LAN/Tailnet ให้ผูกอย่างชัดเจนและเปิดใช้การยืนยันตัวตนไว้เสมอ สำหรับการตั้งค่าที่ใช้เฉพาะ Tailnet ให้ตั้งค่า gateway.bind: "tailnet" ใน ~/.openclaw/openclaw.json แล้วเริ่ม Gateway ใหม่ (หรือแอปแถบเมนูของ macOS)
สิ่งที่ทำการประกาศ
มีเพียง Gateway เท่านั้นที่ประกาศ _openclaw-gw._tcp การประกาศมัลติแคสต์ภายใน LAN มาจาก Plugin bonjour ที่มาพร้อมระบบเมื่อเปิดใช้งาน ส่วนการเผยแพร่ DNS-SD แบบเครือข่ายบริเวณกว้างยังคงอยู่ภายใต้การควบคุมของ Gateway
ประเภทบริการ
_openclaw-gw._tcp- บีคอนการรับส่งข้อมูลของ Gateway ซึ่ง Node บน macOS/iOS/Android ใช้งาน
คีย์ TXT (ข้อมูลบอกใบ้ที่ไม่เป็นความลับ)
| คีย์ | เมื่อปรากฏ |
|---|---|
role=gateway |
เสมอ |
displayName=<friendly name> |
เสมอ |
lanHost=<hostname>.local |
เสมอ |
gatewayPort=<port> |
เสมอ (WS + HTTP ของ Gateway) |
transport=gateway |
เสมอ |
gatewayTls=1 |
เฉพาะเมื่อเปิดใช้ TLS |
gatewayTlsSha256=<sha256> |
เฉพาะเมื่อเปิดใช้ TLS และมีลายนิ้วมือให้ใช้งาน |
gatewayDirectReachable=1 |
เฉพาะเมื่อเข้าถึง Gateway ได้โดยตรง (ไม่ใช่เฉพาะผ่านเส้นทางรีเลย์/พร็อกซี) |
canvasPort=<port> |
เฉพาะเมื่อเปิดใช้โฮสต์แคนวาส ปัจจุบันเป็นค่าเดียวกับ gatewayPort |
tailnetDns=<magicdns> |
เฉพาะโหมด mDNS แบบ full เป็นข้อมูลบอกใบ้เสริมเมื่อ Tailnet พร้อมใช้งาน |
sshPort=<port> |
เฉพาะโหมด full ไม่รวมอยู่ในโหมด minimal และ off |
cliPath=<path> |
เฉพาะโหมด full ไม่รวมอยู่ในโหมด minimal และ off |
หมายเหตุด้านความปลอดภัย:
- ระเบียน TXT ของ Bonjour/mDNS ไม่ได้รับการยืนยันตัวตน ไคลเอนต์ต้องไม่ถือว่า TXT เป็นข้อมูลกำหนดเส้นทางที่เชื่อถือได้
- ไคลเอนต์ควรกำหนดเส้นทางโดยใช้ปลายทางบริการที่แก้ชื่อแล้ว (SRV + A/AAAA) ให้ถือว่า
lanHost,tailnetDns,gatewayPortและgatewayTlsSha256เป็นเพียงข้อมูลบอกใบ้ - การกำหนดเป้าหมาย SSH อัตโนมัติควรใช้โฮสต์บริการที่แก้ชื่อแล้วเช่นกัน ไม่ใช่ข้อมูลบอกใบ้จาก TXT เพียงอย่างเดียว
- การตรึง TLS ต้องไม่ยอมให้
gatewayTlsSha256ที่ประกาศมาแทนที่ค่าตรึงที่จัดเก็บไว้ก่อนหน้านี้ - Node บน iOS/Android ควรถือว่าการเชื่อมต่อโดยตรงจากการค้นหาเป็นแบบ TLS เท่านั้น และต้องให้ผู้ใช้ยืนยันอย่างชัดเจนก่อนเชื่อถือลายนิ้วมือที่พบเป็นครั้งแรก
การแก้จุดบกพร่องบน macOS
เครื่องมือที่มีมาให้:
# เรียกดูอินสแตนซ์dns-sd -B _openclaw-gw._tcp local. # แก้ชื่อหนึ่งอินสแตนซ์ (แทนที่ <instance>)dns-sd -L "<instance>" _openclaw-gw._tcp local.หากการเรียกดูทำงานได้แต่การแก้ชื่อล้มเหลว โดยทั่วไปคุณกำลังพบปัญหาจากนโยบาย LAN หรือตัวแก้ชื่อ mDNS
การแก้จุดบกพร่องในบันทึกของ Gateway
Gateway จะเขียนไฟล์บันทึกแบบหมุนเวียน (แสดงเมื่อเริ่มต้นเป็น gateway log file: ...) ให้มองหาบรรทัด bonjour: โดยเฉพาะ:
bonjour: advertise failed ...bonjour: suppressing ciao cancellation ...bonjour: ... name conflict resolved/hostname conflict resolvedbonjour: watchdog detected non-announced service ...bonjour: disabling advertiser after ... failed restarts ...
ตัวเฝ้าระวังจะถือว่าสถานะ probing, announcing ที่กำลังทำงาน และการเปลี่ยนชื่อเนื่องจากข้อขัดแย้งที่เพิ่งเกิดขึ้น เป็นสถานะที่ยังดำเนินการอยู่ หากบริการไม่เคยเข้าสู่สถานะ announced OpenClaw จะสร้างตัวประกาศขึ้นใหม่ และหลังจากล้มเหลวซ้ำหลายครั้ง จะปิดใช้ Bonjour สำหรับกระบวนการ Gateway นั้นแทนที่จะประกาศใหม่ไปตลอด
Bonjour ใช้ชื่อโฮสต์ของระบบเป็นโฮสต์ .local ที่ประกาศ หากชื่อดังกล่าวเป็นป้ายกำกับ DNS ที่ถูกต้อง หากชื่อโฮสต์ของระบบมีช่องว่าง ขีดล่าง หรืออักขระอื่นที่ไม่ถูกต้องสำหรับป้ายกำกับ DNS OpenClaw จะใช้ openclaw.local แทน ตั้งค่า OPENCLAW_MDNS_HOSTNAME=<name> ก่อนเริ่ม Gateway เมื่อต้องการระบุป้ายกำกับโฮสต์อย่างชัดเจน
การแก้จุดบกพร่องบน Node iOS
Node iOS ใช้ NWBrowser เพื่อค้นหา _openclaw-gw._tcp
วิธีเก็บบันทึก: Settings -> Gateway -> Advanced -> Discovery Debug Logs จากนั้นไปที่ Settings -> Gateway -> Advanced -> Discovery Logs -> ทำให้ปัญหาเกิดขึ้นอีกครั้ง -> Copy บันทึกจะรวมการเปลี่ยนสถานะของเบราว์เซอร์และการเปลี่ยนแปลงของชุดผลลัพธ์
เมื่อใดควรเปิดใช้ Bonjour
Bonjour จะเริ่มทำงานอัตโนมัติเมื่อเริ่มต้น Gateway ด้วยการกำหนดค่าว่างบนโฮสต์ macOS เนื่องจากแอปภายในเครื่องและ Node บน iOS/Android ที่อยู่ใกล้เคียงมักอาศัยการค้นหาภายใน LAN เดียวกัน
เปิดใช้งานอย่างชัดเจนเมื่อการค้นหาอัตโนมัติภายใน LAN เดียวกันมีประโยชน์บน Linux, Windows หรือโฮสต์อื่นที่ไม่ใช่ macOS:
openclaw plugins enable bonjourเมื่อเปิดใช้งาน Bonjour จะใช้ discovery.mdns.mode เพื่อกำหนดปริมาณข้อมูลเมตา TXT ที่จะเผยแพร่ โดยโหมดเดียวกันนี้จะควบคุมข้อมูลบอกใบ้ TXT เสริมในระเบียน DNS-SD แบบเครือข่ายบริเวณกว้างด้วย โหมดต่าง ๆ:
| โหมด | ลักษณะการทำงาน |
|---|---|
minimal (ค่าเริ่มต้น) |
เฉพาะคีย์ TXT หลัก ไม่รวม sshPort, cliPath, tailnetDns |
full |
เพิ่ม sshPort, cliPath, tailnetDns — ใช้เมื่อไคลเอนต์ต้องการข้อมูลบอกใบ้เหล่านี้ |
off |
ระงับมัลติแคสต์ภายใน LAN โดยไม่เปลี่ยนสถานะการเปิดใช้ Plugin โดย DNS-SD แบบเครือข่ายบริเวณกว้างยังคงเผยแพร่บีคอนแบบ minimal ได้เมื่อ discovery.wideArea.enabled เป็นจริง |
เมื่อใดควรปิดใช้ Bonjour
ควรปิด Bonjour ไว้เมื่อการประกาศมัลติแคสต์ภายใน LAN ไม่จำเป็น ไม่พร้อมใช้งาน หรือก่อให้เกิดปัญหา — กรณีที่พบบ่อย ได้แก่ เซิร์ฟเวอร์ที่ไม่ใช่ macOS, เครือข่ายแบบบริดจ์ของ Docker, WSL หรือนโยบายเครือข่ายที่ทิ้งมัลติแคสต์ mDNS Gateway ยังคงเข้าถึงได้ผ่าน URL ที่เผยแพร่ไว้, SSH, Tailnet หรือ DNS-SD แบบเครือข่ายบริเวณกว้าง มีเพียงการค้นหาอัตโนมัติภายใน LAN เท่านั้นที่ไม่น่าเชื่อถือ
ใช้การแทนค่าด้วยตัวแปรสภาพแวดล้อมสำหรับปัญหาเฉพาะการติดตั้งใช้งาน (ปลอดภัยสำหรับอิมเมจ Docker, ไฟล์บริการ, สคริปต์เริ่มต้น และการแก้จุดบกพร่องครั้งเดียว — ค่านี้จะหายไปเมื่อสภาพแวดล้อมสิ้นสุดลง):
OPENCLAW_DISABLE_BONJOUR=1ใช้การกำหนดค่า Plugin เมื่อต้องการปิด Plugin การค้นหาภายใน LAN ที่มาพร้อมระบบโดยเจตนาสำหรับการกำหนดค่า OpenClaw นั้น:
openclaw plugins disable bonjourข้อควรระวังเกี่ยวกับ Docker
Plugin Bonjour ที่มาพร้อมระบบจะปิดการประกาศมัลติแคสต์ภายใน LAN โดยอัตโนมัติในคอนเทนเนอร์ที่ตรวจพบ เมื่อไม่ได้ตั้งค่า OPENCLAW_DISABLE_BONJOUR เครือข่ายแบบบริดจ์ของ Docker โดยทั่วไปไม่ส่งต่อมัลติแคสต์ mDNS (224.0.0.251:5353) ระหว่างคอนเทนเนอร์กับ LAN ดังนั้นการประกาศจากคอนเทนเนอร์จึงแทบไม่ทำให้การค้นหาทำงานได้
ข้อควรระวัง:
- Bonjour เริ่มทำงานอัตโนมัติบนโฮสต์ macOS และต้องเลือกเปิดใช้งานบนระบบอื่น การปิดไว้ไม่ได้หยุด Gateway แต่เพียงข้ามการประกาศมัลติแคสต์ภายใน LAN
- การปิด Bonjour ไม่เปลี่ยน
gateway.bindโดย Docker ยังคงใช้ค่าเริ่มต้นOPENCLAW_GATEWAY_BIND=lanเพื่อให้พอร์ตโฮสต์ที่เผยแพร่ไว้ทำงานได้ - การปิด Bonjour ไม่ได้ปิด DNS-SD แบบเครือข่ายบริเวณกว้าง ใช้การค้นหาแบบเครือข่ายบริเวณกว้างหรือ Tailnet เมื่อ Gateway และ Node ไม่ได้อยู่บน LAN เดียวกัน
- การนำ
OPENCLAW_CONFIG_DIRเดียวกันไปใช้ซ้ำนอก Docker จะไม่คงนโยบายการปิดอัตโนมัติของคอนเทนเนอร์ไว้ - ตั้งค่า
OPENCLAW_DISABLE_BONJOUR=0เฉพาะสำหรับเครือข่ายโฮสต์, macvlan หรือเครือข่ายอื่นที่ทราบว่ามัลติแคสต์ mDNS สามารถผ่านได้ ตั้งค่าเป็น1เพื่อบังคับปิด
การแก้ไขปัญหาเมื่อ Bonjour ถูกปิด
หาก Node ไม่ค้นพบ Gateway โดยอัตโนมัติอีกต่อไปหลังตั้งค่า Docker:
-
ตรวจสอบว่า Gateway กำลังทำงานในโหมดอัตโนมัติ บังคับเปิด หรือบังคับปิด:
bash docker compose config | grep OPENCLAW_DISABLE_BONJOUR -
ตรวจสอบว่าสามารถเข้าถึงตัว Gateway เองผ่านพอร์ตที่เผยแพร่ไว้:
bash curl -fsS http://127.0.0.1:18789/healthz -
ใช้เป้าหมายโดยตรงเมื่อ Bonjour ถูกปิด:
- Control UI หรือเครื่องมือภายในเครื่อง:
http://127.0.0.1:18789 - ไคลเอนต์ใน LAN:
http://<gateway-host>:18789 - ไคลเอนต์ข้ามเครือข่าย: Tailnet MagicDNS, IP ของ Tailnet, อุโมงค์ SSH หรือ DNS-SD แบบเครือข่ายบริเวณกว้าง
- Control UI หรือเครื่องมือภายในเครื่อง:
-
หากคุณจงใจเปิดใช้ Plugin Bonjour ใน Docker และบังคับการประกาศด้วย
OPENCLAW_DISABLE_BONJOUR=0ให้ทดสอบมัลติแคสต์จากโฮสต์:bash dns-sd -B _openclaw-gw._tcp local.หากการเรียกดูไม่แสดงผลลัพธ์ หรือบันทึกของ Gateway แสดงการยกเลิกจากตัวเฝ้าระวัง ciao ซ้ำ ๆ ให้คืนค่า
OPENCLAW_DISABLE_BONJOUR=1และใช้เส้นทางโดยตรงหรือเส้นทางผ่าน Tailnet
รูปแบบความล้มเหลวที่พบบ่อย
- Bonjour ไม่สามารถข้ามเครือข่ายได้: ใช้ Tailnet หรือ SSH
- มัลติแคสต์ถูกบล็อก: เครือข่าย Wi-Fi บางเครือข่ายปิดใช้งาน mDNS
- ตัวประกาศค้างอยู่ในสถานะตรวจสอบ/ประกาศ: โฮสต์ที่บล็อกมัลติแคสต์ บริดจ์ของคอนเทนเนอร์ WSL หรือการเปลี่ยนแปลงอินเทอร์เฟซบ่อยครั้ง อาจทำให้ตัวประกาศ ciao อยู่ในสถานะที่ไม่ได้ประกาศ OpenClaw จะลองใหม่สองสามครั้ง จากนั้นปิดใช้งาน Bonjour สำหรับโปรเซส Gateway ปัจจุบัน แทนที่จะเริ่มตัวประกาศใหม่ไปเรื่อย ๆ
- เครือข่ายบริดจ์ของ Docker: Bonjour จะปิดใช้งานโดยอัตโนมัติเมื่อตรวจพบคอนเทนเนอร์ ตั้งค่า
OPENCLAW_DISABLE_BONJOUR=0เฉพาะสำหรับเครือข่ายแบบโฮสต์ macvlan หรือเครือข่ายอื่นที่รองรับ mDNS - การพักเครื่อง/การเปลี่ยนแปลงอินเทอร์เฟซบ่อยครั้ง: macOS อาจไม่แสดงผลลัพธ์ mDNS ชั่วคราว ให้ลองใหม่
- เรียกดูได้แต่แก้ชื่อไม่ได้: ใช้ชื่อเครื่องที่เรียบง่าย (หลีกเลี่ยงอีโมจิหรือเครื่องหมายวรรคตอน) แล้วเริ่ม Gateway ใหม่ ชื่ออินสแตนซ์บริการมาจากชื่อโฮสต์ ดังนั้นชื่อที่ซับซ้อนเกินไปอาจทำให้ตัวแก้ชื่อบางตัวทำงานสับสน
ชื่ออินสแตนซ์ที่มีการหลีกอักขระ (\032)
Bonjour/DNS-SD มักหลีกไบต์ในชื่ออินสแตนซ์บริการเป็นลำดับเลขฐานสิบ \DDD (ช่องว่างจะกลายเป็น \032) ซึ่งเป็นพฤติกรรมปกติในระดับโปรโตคอล ส่วนติดต่อผู้ใช้ควรถอดรหัสเพื่อแสดงผล (iOS ใช้ BonjourEscapes.decode)
การเปิดใช้งาน / การปิดใช้งาน / การกำหนดค่า
| การตั้งค่า | ผลลัพธ์ |
|---|---|
openclaw plugins enable bonjour |
เปิดใช้งาน Plugin การค้นหาภายใน LAN ที่มาพร้อมระบบบนโฮสต์ซึ่งไม่ได้เปิดใช้งานเป็นค่าเริ่มต้น |
openclaw plugins disable bonjour |
ปิดใช้งานการประกาศแบบมัลติแคสต์บน LAN โดยปิดใช้งาน Plugin ที่มาพร้อมระบบ |
OPENCLAW_DISABLE_BONJOUR=1 (หรือ true/yes/on) |
ปิดใช้งานการประกาศแบบมัลติแคสต์บน LAN โดยไม่เปลี่ยนการกำหนดค่า Plugin |
OPENCLAW_DISABLE_BONJOUR=0 (หรือ false/no/off) |
บังคับเปิดการประกาศแบบมัลติแคสต์บน LAN รวมถึงภายในคอนเทนเนอร์ที่ตรวจพบ |
discovery.mdns.mode |
off | minimal (ค่าเริ่มต้น) | full — ดูโหมดด้านบน |
gateway.bind |
ควบคุมโหมดการผูกของ Gateway ใน ~/.openclaw/openclaw.json |
OPENCLAW_SSH_PORT |
แทนที่พอร์ต SSH เมื่อมีการประกาศ sshPort (โหมด full) |
OPENCLAW_TAILNET_DNS |
เผยแพร่คำแนะนำ MagicDNS ใน TXT เมื่อเปิดใช้โหมด full ของ mDNS |
OPENCLAW_CLI_PATH |
แทนที่พาธ CLI ที่ประกาศ (โหมด full) |
ตามค่าเริ่มต้น โฮสต์ macOS จะเริ่ม Plugin การค้นหาภายใน LAN ที่มาพร้อมระบบโดยอัตโนมัติ เมื่อเปิดใช้งาน Plugin Bonjour และไม่ได้ตั้งค่า OPENCLAW_DISABLE_BONJOUR Bonjour จะประกาศบนโฮสต์ทั่วไป และปิดใช้งานโดยอัตโนมัติภายในคอนเทนเนอร์ที่ตรวจพบ (Docker, เครื่อง Fly.io และรันไทม์คอนเทนเนอร์ที่ใช้กันทั่วไป)
เอกสารที่เกี่ยวข้อง
- นโยบายการค้นหาและการเลือกการรับส่งข้อมูล: การค้นหา
- การจับคู่ Node และการอนุมัติ: การจับคู่ Gateway