Problem Description
The Siemens IOT2050 industrial IoT gateway is delivered with a Yocto Linux-based Example Image that bundles Node-RED as a pre-installed flow-based development tool. In a typical commissioning scenario, an engineer connects the IOT2050's Ethernet port (X2 P1 or P2) to a local router, assigns a static IP address (commonly 192.168.200.10), and expects the Node-RED editor to be reachable from a separate engineering notebook at http://192.168.200.10:1880.
Symptom: Node-RED starts on the IOT2050 and logs the following message on the serial console or SSH terminal:
[Info] [flow:] Server now running at http://127.0.0.1:1880/
When the user navigates to http://192.168.200.10:1880 from a PC connected to the same router (via Wi-Fi or Ethernet), the browser times out, returns ERR_CONNECTION_TIMED_OUT, or This site can't be reached. The PC's own local Node-RED instance at http://localhost:1880 continues to work normally, which confirms that the browser, the Node-RED runtime, and the JavaScript engine are not the problem — the network path between them is.
uiHost.Root Cause Analysis
The 127.0.0.1 vs. 0.0.0.0 distinction is the source of most of the confusion in the field. Node-RED's uiHost setting in settings.js controls the bind address. The default in Node-RED 1.x and 2.x is 0.0.0.0, which makes the editor reachable on every interface (loopback, Ethernet, Wi-Fi, virtual bridges). The startup banner still prints http://127.0.0.1:1880/ because the editor builds the URL from the loopback address, not the bind address — this is purely cosmetic.
On the IOT2050 with Example Image v1.0.2 and later revisions, the typical causes of a "Node-RED starts but cannot be reached remotely" symptom are:
| # | Root Cause | Verification | Typical Share |
|---|---|---|---|
| 1 | Wrong IP / wrong interface configured on the IOT2050 (e.g., static IP assigned to the wrong Ethernet port) | Compare ip addr output with the address typed in the browser |
~35% |
| 2 | PC and IOT2050 are on different subnets (router isolation, guest VLAN, AP isolation, /23 vs /24 boundary) | Ping the IOT2050 from the PC; check both IP addresses fall in the same subnet | ~30% |
| 3 | IOT2050 firewall (iptables/nftables) dropping inbound TCP/1880 from the LAN | Run iptables -L -n -v and nft list ruleset on the IOT2050 |
~15% |
| 4 | Node-RED uiHost explicitly set to 127.0.0.1 or localhost in a custom settings.js |
Inspect /etc/node-red/settings.js and /var/lib/node-red/settings.js
|
~10% |
| 5 | Node-RED started on the PC instead of the IOT2050 (engineer confused which SSH session hosts the service) | Stop Node-RED on the PC, run only on the IOT2050, retest | ~7% |
| 6 | Duplicate Node-RED processes on the IOT2050 holding the port or a Node-RED service enabled but not running | Run ss -tlnp | grep 1880 and verify the listening process |
~3% |
Items 1, 2, and 3 together account for roughly 80% of all field reports. Item 4 is rare unless an integrator has modified the shipped configuration. Item 5 produces a symptom that looks identical to the others and must be ruled out before changing any IOT2050 configuration.
Diagnostic Procedure
Execute the following steps in order. Each step is independent of the next; stop as soon as the editor becomes reachable. SSH access to the IOT2050 is required — establish it either via the X1 service port (192.168.200.10 default), via the routed LAN interface, or via the micro-USB serial console documented in the IOT2050 Equipment Manual on the Siemens Industry Online Support portal.
-
Confirm the IOT2050 LAN IP address
SSH into the IOT2050 and run:
ip -4 addr show ip route nmcli -t -f IP4.ADDRESS,IP4.GATEWAY,IP4.ROUTE device show eth0 nmcli -t -f IP4.ADDRESS,IP4.GATEWAY,IP4.ROUTE device show eth1The output reveals which physical port (X1, X2 P1, or X2 P2) is associated with the 192.168.200.10 address. If 192.168.200.10 is on eth1 but the Ethernet cable is in X2 P1, the address is unreachable on the wired link and the browser will fail with a timeout.
-
Verify the service is bound to a routable address
From the IOT2050 shell:
ss -tlnp | grep -E '1880|node' sudo lsof -iTCP:1880 -sTCP:LISTEN 2>/dev/nullExpected output: a row where the
Local Address:Portcolumn reads0.0.0.0:1880or*:1880. If you see127.0.0.1:1880, Node-RED is bound to loopback only — proceed to the "Re-binding Node-RED" section. -
Ping the IOT2050 from the engineering PC
From the Windows command prompt or Linux terminal:
ping 192.168.200.10 tracert 192.168.200.10 (Windows) traceroute 192.168.200.10 (Linux)If the ping fails with Destination host unreachable or Request timed out, the path is broken before Node-RED is consulted. Inspect subnet masks, the router's DHCP range, and any wireless isolation (AP/Client isolation) feature on the Wi-Fi access point.
-
Probe TCP/1880 directly from the PC
Open a PowerShell, Telnet, or netcat session to confirm port reachability independently of the browser:
Test-NetConnection 192.168.200.10 -Port 1880 (PowerShell) nc -vz 192.168.200.10 1880 (Linux/macOS) telnet 192.168.200.10 1880 (legacy)TcpTestSucceeded: True(PowerShell) orsucceeded(nc) means the path is open to the Node-RED process. A failure at this step points to a firewall, AP isolation, or wrong-IP issue — not to Node-RED itself. -
Inspect the IOT2050 host firewall
On the IOT2050:
sudo iptables -L INPUT -n -v sudo iptables -L -n -v --line-numbers sudo nft list ruleset 2>/dev/null sudo ufw status 2>/dev/null sudo firewall-cmd --list-all 2>/dev/nullThe Example Image ships with iptables rules generated by
iptables-servicesand with no listening services blocked by default. Custom deployments, AppArmor profiles, or SELinux policies on derivative images can drop inbound traffic to TCP/1880. -
Inspect Node-RED settings.js
Locate and review the active settings file:
sudo find / -name 'settings.js' 2>/dev/null | xargs grep -l 'uiHost\|uiPort' 2>/dev/null cat /etc/node-red/settings.js 2>/dev/null | grep -A2 -E 'uiHost|uiPort' cat /var/lib/node-red/settings.js 2>/dev/null | grep -A2 -E 'uiHost|uiPort'Any non-default value for
uiHost(especially127.0.0.1,localhost, or a specific IP) is the smoking gun. -
Cross-check the startup banner for clues
Restart Node-RED with verbose logging and capture the full banner:
sudo systemctl stop node-red node-red --settings /etc/node-red/settings.js 2>&1 | tee /tmp/nr.logThe "Server now running at ..." line is cosmetic. What matters are any EADDRINUSE, EACCES, or Error: listen EADDRNOTAVAIL lines that follow.
Network Configuration on the IOT2050
The IOT2050 Example Image uses NetworkManager for interface configuration. The shipped configuration assigns 192.168.200.10/24 to the X1 service port with no default gateway, and leaves the X2 ports (P1 and P2) configured as DHCP clients on a 192.168.1.0/24 fallback profile. When the device is wired to a router via the X2 port, the DHCP profile takes over and 192.168.200.10 is no longer active on any reachable interface — the user types an address that the IOT2050 is no longer listening on.
To force a static LAN address on the X2 P1 port (typical setup for a router with a 192.168.200.0/24 subnet):
sudo nmcli connection add type ethernet \
con-name iot2050-lan \
ifname eth0 \
ipv4.method manual \
ipv4.addresses 192.168.200.10/24 \
ipv4.gateway 192.168.200.1 \
ipv4.dns 192.168.200.1
sudo nmcli connection up iot2050-lan
Replace eth0 with eth1 if the cable is plugged into the second X2 port. Confirm the new state with ip -4 addr show and ip route before continuing. The Siemens IOT2050 product support page documents the physical port numbering (X1, X2 P1, X2 P2) and the default NetworkManager profiles shipped with each Example Image revision.
Re-binding Node-RED to All Interfaces
If the diagnostic above shows Node-RED listening on 127.0.0.1:1880 only, edit the active settings.js. Node-RED's official configuration reference states that uiHost defaults to 0.0.0.0 and uiPort defaults to 1880 unless explicitly overridden.
Procedure (verified against the Node-RED runtime configuration reference):
- Open the active settings file:
sudo nano /etc/node-red/settings.js(or the path reported bynode-red --help). - Locate the line:
//uiHost: "127.0.0.1", - Uncomment and set it to:
uiHost: "0.0.0.0", - Confirm
uiPort: 1880,is present and uncommented. - Save and restart the service:
sudo systemctl restart node-red - Verify the bind address:
ss -tlnp | grep 1880
If the value was already 0.0.0.0 and the bind address still shows 127.0.0.1, the Node-RED process is reading a different settings file. Use ps -ef | grep node-red to inspect the exact --userDir and --settings arguments and trace back to the file actually in use. The IOT2050 Example Image typically deploys the configuration under /var/lib/node-red/ rather than /etc/node-red/ — confirm with systemctl cat node-red.
Reference: Node-RED Runtime Configuration documents the uiHost, uiPort, and https settings, and explains how the startup banner URL is constructed independently of the bind address.
Opening the IOT2050 Host Firewall
If the IOT2050 is reachable by ping but TCP/1880 is filtered, add an explicit iptables rule. The Example Image uses iptables as the default front end; nftables is available but not configured out of the box.
sudo iptables -I INPUT -p tcp --dport 1880 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo netfilter-persistent save # or: sudo iptables-save > /etc/iptables/rules.v4
Reload the rules and verify with sudo iptables -L INPUT -n -v. The new line should show a non-zero packet count after the next attempt from the PC. For long-term persistence, integrate the rule into the image's /etc/rc.local or a NetworkManager dispatcher script under /etc/NetworkManager/dispatcher.d/.
For a narrower rule that restricts Node-RED access to the engineering subnet only:
sudo iptables -I INPUT -p tcp -s 192.168.200.0/24 --dport 1880 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 1880 -j DROP
For systemd-managed services that need to bind to a privileged port, also confirm the AmbientCapabilities=CAP_NET_BIND_SERVICE directive is present in the unit file if port 1880 is remapped below 1024.
Securing the Node-RED Editor
The default Node-RED installation is not designed for direct exposure to the Internet or even to an untrusted LAN segment. Once the editor is reachable on the engineering subnet, harden it before granting broader access. The official Securing Node-RED reference is the authoritative checklist.
- Set a strong admin password by configuring
adminAuthinsettings.jswith a bcrypt hash of the password (thenode-red-admin hash-pwcommand generates the hash). - Enable HTTPS with the
httpsconfiguration block to encrypt the editor and any HTTP-In nodes serving credentials. Reference: Securing Node-RED. - Restrict source IPs by combining the iptables INPUT rules above with
-s 192.168.200.0/24(or the engineering subnet). - Disable the editor entirely once the flows are stable by setting
disableEditor: trueinsettings.js— the flows continue to run while the dashboard and HTTP endpoints remain available. - Enable
httpNodeAuthandhttpStaticAuthto protect HTTP-In / HTTP-Response nodes from anonymous POSTs. - If the IOT2050 is reachable from the Internet via port forwarding, terminate the connection at a reverse proxy (nginx, Caddy) and apply rate limiting plus fail2ban in front of the Node-RED process.
Verification
After applying the corrective action, run the full verification sequence:
- From the IOT2050:
ss -tlnp | grep 1880shows0.0.0.0:1880(or*:1880). - From the PC:
ping 192.168.200.10returns replies with sub-millisecond latency on a wired link. - From the PC:
Test-NetConnection 192.168.200.10 -Port 1880returnsTcpTestSucceeded: True. - From the PC browser:
http://192.168.200.10:1880loads the Node-RED editor within 2 seconds. - From the PC browser:
http://192.168.200.10:1880/flowsshows the currently deployed flows. - From a second device on the same subnet: repeat steps 3–5 to confirm the service is not bound to a single MAC/IP pair.
- From the IOT2050 service log:
sudo journalctl -u node-red -n 50shows no EADDRINUSE, EACCES, or TypeError entries.
If the browser still fails after all seven steps, capture the Node-RED process output with NODE_OPTIONS="--inspect" node-red and the PC browser's HAR file for further analysis. The official Node-RED local running guide covers the standard startup parameters and their interaction with systemd, including --userDir, --settings, and --safe-mode.
Troubleshooting Matrix
| Symptom | Most Likely Cause | Recommended Fix |
|---|---|---|
| Ping fails, port 1880 fails | IP/subnet mismatch or AP isolation | Align subnets; disable AP isolation on the Wi-Fi SSID; verify the DHCP pool covers the IOT2050's static range |
| Ping succeeds, port 1880 times out | IOT2050 firewall drop rule | Add iptables ACCEPT rule on TCP/1880 (see section above) |
| Ping and port 1880 succeed, browser still fails | Browser cache, corporate proxy, or wrong port | Clear cache, bypass proxy for 192.168.200.0/24, retest with curl -v http://192.168.200.10:1880/
|
| Editor loads but flows do not deploy | Insufficient permission on userDir | Set ownership to the node-red user: sudo chown -R node-red:node-red /var/lib/node-red
|
| Editor unreachable after reboot | Node-RED service not enabled | sudo systemctl enable --now node-red |
| Editor reachable, dashboard at /ui returns 404 | Dashboard nodes not installed | Install node-red-dashboard via the Palette Manager or npm i -g node-red-dashboard
|
| Editor loads, HTTP-In nodes return 502 | Backend service not running on the IOT2050 | Check the upstream service with systemctl status and verify the port mapping in the HTTP-In node |
| Editor reachable on Wi-Fi but not on wired PC | VLAN segmentation on the router | Move both ports into the same VLAN or add a tagged port to the engineering VLAN |
Frequently Asked Questions
Does "Server now running at 127.0.0.1:1880" mean Node-RED only listens on localhost?
No. The startup banner URL is hard-coded in the Node-RED startup code and reflects the loopback address for cosmetic reasons. By default, Node-RED binds to 0.0.0.0:1880 (all interfaces). Verify the actual bind address with ss -tlnp | grep 1880 on the IOT2050 — a row showing 0.0.0.0:1880 or *:1880 confirms it is reachable on every interface.
How do I find the IOT2050's IP address from the serial console?
Log in via the X1 service port (192.168.200.10 default) or the micro-USB console, then run ip -4 addr show and ip route. For a NetworkManager-managed profile, nmcli -t -f IP4.ADDRESS device show eth0 (or eth1) reports the active address of each interface, including DHCP-leased addresses.
What is the default port for the Node-RED editor?
1880/tcp for the HTTP editor and admin API. MQTT brokers (such as Mosquitto) typically use 1883/tcp; Node-RED itself does not serve MQTT. Override the editor port with the uiPort setting in settings.js if 1880 is already in use by another service on the IOT2050.
Why can I reach Node-RED on the PC's localhost but not on the IOT2050's IP?
You are connecting to a different Node-RED instance — the one running on your engineering PC, not on the IOT2050. Stop the local Node-RED process on the PC (Ctrl-C in its terminal or systemctl stop --user node-red), confirm the IOT2050's IP with ip -4 addr show, and retest. Reference: Running Node-RED locally.
Is the Node-RED editor safe to expose on the LAN?
Not by default. The shipped configuration has no authentication. Enable adminAuth in settings.js, switch the editor to HTTPS via the https block, and restrict the source subnet in iptables before granting broader access. See the Securing Node-RED reference for the full hardening checklist, including httpNodeAuth and disableEditor.