Skip to content

What You Can Run Over the Tunnel

fjarr.net gives your machine and one robot a private IP link (docs/27). Fjarr does not know or care what travels on it. Anything that speaks TCP, UDP or multicast works unchanged, including things nobody at Fjarr thought of. This page is a starting point for ideas. Most rows are untested ideas; the ones marked ✔ verified have been run over the tunnel in Fjarr’s own lab or on a real robot.

Every row below has a short step-by-step in How-tos over the tunnel, in the same order. Bring the link up and point any tool at the robot’s tunnel address:

Terminal window
$ fjarr-connect robot-024
robot-024 100.70.118.224 mtu 1184 up in 0.8 s
ssh <user>@100.70.118.224

What the link is like, so you can judge a use before trying it:

  • It reaches the robot itself, not its network. Traffic goes only to the robot’s own tunnel address, and the robot never forwards it (docs/27). For an IP camera, a PLC or a lidar on the robot’s LAN, hop through something on the robot that you run on purpose, for example ssh -J user@<robot> user@192.168.1.20, or ssh -L for one port.
  • The robot can reach your end too. While the link is up, services listening on your machine’s tunnel address, or on all interfaces, are reachable from the robot. That is useful for serving it a file, and something to be aware of.
  • IPv4, TCP, UDP and multicast (so DDS and mDNS discovery work, ADR-0026). Layer-2 protocols do not cross: EtherCAT, PROFINET RT and raw Ethernet frames need a real wire.
  • MTU 1184, and on a LAN about 200–340 Mbit/s (measured beside and without a camera stream). Over the internet it is whatever the path gives, adaptive with the rest of the session. TCP handles loss for you; plain UDP tools see the real loss of the path.
  • Every port on the robot is reachable unless the robot’s config narrows it with allow_ports. Every service you run is a second door with its own login. The safety notes are at the end.
WhatToolNotes
A shellssh, ✔ verifiedalso fjarr-connect shell with no sshd at all (docs/27)
A shell that survives a flaky linkmosh (UDP)predictive echo and roaming; good on 4G, where ssh stalls
Persistent worktmux / screen over sshreattach after the link drops
A web admin consoleCockpit (port 9090), Webminlogs, services, updates, a terminal, in your browser
Fleet automationAnsible, Salt over sshfjarr-connect list --ssh-config gives stanzas an inventory can use
Containers on the robotDOCKER_HOST=ssh://user@<robot> docker ps, podman --remoteyour local CLI, the robot’s daemon
k3s on the robotkubectl with the robot’s API porta cluster of one, managed from your laptop
WhatToolNotes
The robot’s desktopRDP (Remmina, Windows Remote Desktop) to gnome-remote-desktop, ✔ verifieda second door with its own password (docs/27); Fjarr’s own answer is fjarr.desktop in the browser
An X11 kiosk’s desktopVNC (x11vnc, port 5900)
One application, not the desktopwaypipe (Wayland), ssh -X (X11)the robot’s rviz or a vendor’s configuration tool in a window on your screen
Seamless apps over a slow linkXpracompresses and survives reconnects, better than raw X11 over WAN
WhatToolNotes
Browse the robot in a file managerNautilus/Dolphin/Finder sftp://user@<robot>/, ✔ verifiedFjarr’s own answer is the WebDAV drive (ADR-0029)
Copy files, logs, bagsscp ✔ verified, rsyncrsync resumes: fetch a 20 GB rosbag over a flaky link
Mount the robot’s disksshfs, NFS, SMBedit robot files with your local editor
Sync a folder both waysSyncthingmaps, calibration files, configs
A block deviceNBD, iSCSIimage or restore a robot’s disk from the office
Serve a file to the robotpython3 -m http.server on your machine, then curl http://<your tunnel address>:8000/… on the robota firmware image or a package, without uploading it anywhere
WhatToolNotes
Edit and run on the robot from your IDEVS Code Remote-SSH, JetBrains Gatewaythe editor runs locally, the code runs where the hardware is
Debug a process on the robotgdbserver, lldb-server, Python debugpybreakpoints in your local IDE, the program on the robot
Debug the robot’s microcontrollerOpenOCD’s or pyOCD’s GDB port, SEGGER JLinkRemoteServerthe programmer is plugged into the robot; the debugger is on your desk
Profileperf record on the robot then perf report locally, the Tracy client and server, py-spy
Notebooks on robot dataJupyter on the robot, the browser on your sidedata too big to copy stays put
Live packet capture from the robotWireshark with sshdumpthe robot’s interfaces in your local Wireshark, live
Measure the linkiperf3what the tunnel gives on this path, today
WhatToolNotes
ROS 2ros2 topic, rviz2, rqt with DDS over the link, ✔ verified (Fast DDS and Cyclone DDS)the ordering rule and the Cyclone file matter (docs/27)
ROS 2 across a slower linkZenoh (zenoh-bridge-ros2dds)built for WAN; far less discovery traffic than DDS
ROS 1the master’s port 11311 plus the node ports; set ROS_IP
A visualisation GUIFoxglove with foxglove_bridge (WebSocket, port 8765), Rerun viewer, PlotJugglerthe robot’s live topics in a desktop application
Web tools on ROSrosbridge_server (WebSocket 9090)roslibjs dashboards on your machine against the real robot
Micro-controllers on ROS 2the micro-ROS agent’s UDP portan MCU talking to the robot’s graph
A message brokerMQTT (Mosquitto), NATSthe robot’s broker from your tools; or yours from the robot
WhatToolNotes
The robot’s CAN bus on your laptopcannelloni (UDP) or socketcandcandump, SavvyCAN or a vendor tool against the real bus
A serial portser2net (RFC 2217), socata motor controller’s or a GPS’s console in your terminal
Any USB deviceUSB/IP (in the Linux kernel: usbip on the robot, vhci-hcd on your machine; usbip-win on Windows)the device appears on your machine as if plugged in. Excellent for bulk devices: USB-serial adapters, ST-Link and J-Link programmers, CAN adapters, dongles, storage. Flash the robot’s microcontroller with your own tools. Poor for isochronous devices such as webcams and audio interfaces, which expect microsecond timing and a lot of bandwidth
Industrial protocolsModbus/TCP, OPC UAa PLC’s or drive’s configuration software against the real device
A device on the robot’s own networkssh -J / ssh -L through the robotthe lidar’s configuration page, an IP camera’s web UI
WhatToolNotes
A sensor’s own web pagethe robot’s sensors often serve one (lidars, industrial cameras, IMUs); reach it on the robot or via ssh -Lset up the sensor from your desk
A vendor’s desktop viewerpoint it at the robot’s addressmany speak TCP; sensors that stream raw UDP (a lidar at 50–130 Mbit/s) fit on a LAN, not on 4G
An RTSP camera on the robotVLC, ffplayfor watching in the browser, fjarr.camera adapts to the link and this does not
WhatToolNotes
MetricsPrometheus node_exporter (9100), Netdata, Glances, cAdvisorscrape one robot from your laptop while you investigate
DashboardsGrafana on the robot or on your machine
Logsjournalctl over ssh, systemd-journal-remote, a local Loki
The agent’s own viewthe introspection endpoint (docs/24), when bound to the tunnel addressthe robot’s live pipelines on the robot’s own address

The robot’s microphone or speaker as an audio device on a Linux machine works through PipeWire’s or PulseAudio’s network modules, and through ROC, which was built for lossy links. It is fine on a good LAN, and clicks and drifts over the internet. To hear and talk to a robot from a browser, fjarr.audio (M3.5) uses WebRTC’s jitter buffers and echo cancellation, and is the better path.

Networking is layered. Layer 2 is the local network: Ethernet frames addressed by MAC address within one broadcast domain, where ARP, DHCP, broadcasts, Wake-on-LAN and industrial protocols such as EtherCAT and PROFINET RT live. Layer 3 is IP, routed between networks, with TCP and UDP on top: almost every application.

fjarr.net is a layer-3 link: a TUN device carrying IP packets between exactly two addresses, not a TAP device carrying Ethernet frames. That is deliberate:

  • Isolation is built on IP. A layer-2 link would plug your laptop into the robot’s local network, with its PLC, its cameras and its broadcasts. That is the lateral access the tunnel exists to rule out (docs/27).
  • The protocols that truly need layer 2 cannot work over the internet anyway. EtherCAT and PROFINET RT need microsecond, deterministic timing on a dedicated wire; an internet path adds tens of milliseconds of jitter.
  • It keeps the link predictable: one MTU, no broadcast traffic, no stranger’s device flooding it.

What is lost is small: broadcast-based discovery in some vendor tools, and Wake-on-LAN. Run the tool on the robot, enter the device’s IP address by hand, or hop through the robot to one device (how-to).

  • Layer 2 (above): EtherCAT, PROFINET RT, raw Ethernet frames, broadcasts, Wake-on-LAN.
  • Timing-critical USB: webcams, audio interfaces and anything isochronous over USB/IP. The camera and audio capabilities are the way to get those.
  • Reaching the robot’s LAN directly: only through a hop on the robot that you run on purpose. That is the isolation rule, not a limitation to work around.
  • Hard real-time control loops. The link has an internet path’s latency and jitter. Teleoperation belongs to Fjarr’s input channels, with their deadman.
  • Granting fjarr.net grants network access to the robot from inside (docs/10). Everything you install on the robot becomes reachable to whoever holds that grant. Narrow the robot’s allow_ports to what you actually use.
  • Each tool is a second door. RDP, VNC, Cockpit and databases have their own logins. Fjarr audits the link, not what happens inside it.
  • USB/IP exports hardware. A robot that can export a USB keyboard to an operator’s machine can type on it. Export only named devices (vendor and product ids), and never automatically.
  • The robot can reach your end. Do not leave services on your machine listening on all interfaces while a link is up, unless you mean the robot to use them.

Tried something that is not here, or that works differently from how this page says? It belongs on this page.