Docker Engine / Troubleshooting

Docker Published Port Works Locally but Is Unreachable from the LAN

Compare the working local endpoint with the failing LAN endpoint before investigating publication, application listening context or filtering.

By Andrey Tretyak · Sources last reviewed

A working local request is a starting observation, not proof that the intended LAN-facing port is published. Record where that request went: host loopback, host LAN address, container address or a proxy.[1]

This is an evidence-first comparison, not a firewall repair recipe. Unknown observations lead to a handoff rather than a guessed cause.[2]

Sections

Applicability

Products
Docker Engine
Scope
For rootful Docker Engine on Linux, bridge networking, IPv4 NAT-style publication and one TCP service. A host-local request succeeds while a LAN request fails. The main path is scoped to Engine 28.0.0 or newer; older versions need version-specific review. Excludes Desktop/WSL/macOS, rootless, host/macvlan/ipvlan, Swarm, IPv6-only, direct routing, other gateway modes and VPN access.[1][2]
Last verified

Symptoms

  • A non-destructive application request still works locally, but the same intended service cannot be reached from another authorized LAN device.[1]

Quick diagnosis

Gather current evidence before choosing a branch. Unknown observations do not establish a failed component.

Read-only

Record both endpoints

Write down the successful request's execution context, address, TCP port and any proxy, then the failing client's destination. Keep addresses and full outputs private. Do not compare a container port with a different host port as though they were the same endpoint.[1]

Read-only

Inspect actual publication

With existing authorized Docker CLI access, replace <container> with the intended container name or ID. The first command lists mappings; the second selects the application's container-side TCP port. Replace <container-port> with that port, not the host port. Record every returned host address and port. No matching mapping means this TCP publication is absent, not that a LAN firewall dropped the request.[6]

docker container port <container>
docker container port <container> <container-port>/tcp
Safe / low risk

Repeat only a normal read operation

Use the application's existing non-destructive request. Record whether it responds now; do not create records, run jobs or change configuration as a connectivity test.[1]

Interactive troubleshooter

Your answers stay in this browser tab. The tool does not connect to your systems or send diagnostic results.

Guided check / step 1

Is this the supported Linux bridge case?

Confirm the stated scope and Engine version. Do not apply this tree to another networking model.[3][1]

Read the complete diagnostic tree without using the controls
  1. Is this the supported Linux bridge case?

    Confirm the stated scope and Engine version. Do not apply this tree to another networking model.[3][1]

    • Yes, supported bridge IPv4 case → Does the claimed local request still work?
    • No, or topology is uncertain → Use the installed network model's documentation
  2. Does the claimed local request still work?

    Repeat only a non-destructive application request and record its context.[1]

    • Yes, local success is reproducible → Is the intended TCP port actually published?
    • No, it no longer responds → Re-establish application health first
    • I cannot reproduce it safely → Collect evidence without widening access
  3. Is the intended TCP port actually published?

    Compare the actual mapping with the intended service and protocol.[6]

    • Yes, TCP mapping matches → Does the published address cover the intended endpoint?
    • Missing mapping or wrong port/protocol → Review the missing or mismatched publication
    • Mapping is unknown → Collect evidence without widening access
  4. Does the published address cover the intended endpoint?

    Compare the actual bind address with the client's host-LAN destination; do not substitute a container address.[1]

    • Yes, address matches the intended endpoint → Does the intended host-LAN endpoint work from the host?
    • No, the published address differs → Review the publication address
    • Address scope is unclear → Collect evidence without widening access
  5. Does the intended host-LAN endpoint work from the host?

    Use the same safe request. Success only inside the container or through a proxy is not this result.[1][3]

    • Yes, the intended host endpoint works → Which Docker firewall backend is established?
    • No, only a different local context works → Investigate the local listening context
    • I cannot distinguish the contexts → Collect evidence without widening access
  6. Which Docker firewall backend is established?

    Inspect existing daemon and policy evidence with the owner; do not change the backend.[5][4]

    • Documented iptables backend → Is there matching evidence of filtering this request?
    • nftables or another/unknown backend → Request backend-specific policy review
  7. Is there matching evidence of filtering this request?

    Use the installed backend's rule ordering and address translation. No log entry is not proof of acceptance.[4]

    • Yes, a matching denial is established → Give matching filter evidence to the policy owner
    • No matching denial is established → What does another authorized LAN client show?
    • Policy evidence is unavailable → Collect evidence without widening access
  8. What does another authorized LAN client show?

    Compare the same endpoint and safe request. A difference narrows the next owner without proving one cause.[2]

    • Another LAN client succeeds → Investigate the failing client's LAN path
    • The failure remains or evidence is inconclusive → Collect evidence without widening access
  9. Use the installed network model's documentation

    Record the actual environment first. Do not switch to host mode or alter a firewall to force this page's assumptions.[3]

  10. Re-establish application health first

    The required local success is absent. Investigate the application/container with its owner before diagnosing LAN-only access.[3]

  11. Review the missing or mismatched publication

    Send the mapping and intended TCP endpoint to the deployment owner; use the mapping handoff below.[6]

  12. Review the publication address

    The intended and actual address scopes differ. Request a bounded exposure review, not an all-interface bind.[1]

  13. Investigate the local listening context

    Identify which process/context responded. Consult application-specific documentation; this result alone does not prove a listener defect.[3]

  14. Request backend-specific policy review

    Provide the Engine version and backend evidence. The nftables implementation is experimental and is not an iptables rule recipe.[5]

  15. Give matching filter evidence to the policy owner

    Preserve the rule/context and test timestamp. Use the disruptive-change boundary below before any separately approved correction.[4][2]

  16. Investigate the failing client's LAN path

    Provide the working and failing client comparisons to the LAN owner. Client isolation or routing is a hypothesis to inspect, not a diagnosed cause.[2]

  17. Collect evidence without widening access

    Keep exact endpoints, mapping, backend and current results. Ask the relevant owner for a targeted investigation; do not relax security to obtain a result.[6][2]

Detailed diagnosis

Read-only

1. Establish the network model

Confirm version, rootful Engine and bridge NAT configuration from existing deployment records. Host mode ignores published-port options and is outside this page. Do not switch modes to make the test pass.[3][1]

Read-only

2. Separate publication from application access

Read the address and port returned by the mapping check. A 127.0.0.1 binding is loopback publication; 0.0.0.0 represents all IPv4 host addresses, not an address to enter on the LAN client. For a specific host address, compare it with the client's actual destination. Publication alone does not prove the application responds or that filtering permits the request. Docker warns that pre-28.0.0 same-L2 peers can reach localhost-published ports; the main path here requires Engine 28.0.0 or newer.[1][6]

Safe / low risk

3. Test the intended LAN endpoint from the host

Repeat the application's normal read operation from the Docker host and the authorized LAN client, using the same host LAN address, published host port, protocol and application path. Record one result per location: response, refusal, timeout or exact application error. If the host fails too, the original loopback/container-local success did not establish this endpoint. If the host succeeds and the LAN client fails, continue to backend and filtering evidence; the comparison does not identify a particular rule.[1][3]

Read-only

4. Inspect the actual backend

Read the running daemon's existing configuration and the applicable rules with the host owner. Docker's nftables support is documented as experimental since Engine 29.0.0 and has no equivalent DOCKER-USER chain. Unknown/nftables details require backend-specific review, not an iptables fix.[5]

Read-only

5. Require matching filtering evidence

For the iptables backend, user filtering in DOCKER-USER is evaluated before Docker's forwarding chains, after destination translation. Ask for evidence matching this request, including translated addresses where relevant. Do not infer a denial from an unrelated rule or from absent logs.[4]

Safe / low risk

6. Compare another authorized LAN client

Repeat the same non-destructive request from another client on the intended LAN. HomeLabFix uses the contrast to prioritize a client/LAN owner, not to prove a unique router or firewall cause. Docker's published traffic does not follow ordinary ufw INPUT/OUTPUT expectations.[2]

Supported scenarios

These observations narrow the next investigation; they do not establish a unique cause.

The mapping and intended endpoint differ

A missing TCP mapping or a different published address leaves the local and LAN tests incomparable.[1][6]

How to check: Compare the actual mapping with both recorded requests.[6]

The local success covers a different context

A proxy or container-local success may leave the intended direct service path untested. This is an isolation inference, not a confirmed listener fault.[3][1]

How to check: Identify the responding process/context before consulting its application-specific listener documentation.[3]

A host or LAN boundary still needs evidence

Docker-managed bridge rules and the surrounding host policy both matter. A failed request alone does not locate a denial.[2]

How to check: Compare backend-specific evidence and another authorized client's result.[4][5]

Next actions and procedure boundaries

Read-only

Mapping or address mismatch: deployment-owner review

Provide the actual and intended mapping to the deployment owner. Request only a separately authorized correction that preserves intended exposure; do not blindly recreate the container or broaden the bind address.[6][1]

Read-only

Local context mismatch: application-owner review

Provide the exact successful and failed contexts and ask the application owner to verify its listener against that application's documentation. There is no universal listener setting in this page.[3]

Read-only

Matching filter or LAN evidence: network-owner review

Give the policy owner the installed backend, relevant matching evidence and controlled client comparison. Do not flush rules, disable firewall management or substitute host networking.[2][4][5]

Potentially disruptive

Before any separately authorized exposure change

Before changing anything

Risk
A mapping, network-mode or firewall change can affect service availability and exposure.[2]
Safer check
Confirm the mapping and a matching observation before considering a change.[6]
Expected result
A scoped plan should state which intended clients should gain access and which should remain excluded; verify both after any separate change.[2]
Backup / recovery access
HomeLabFix requires saved deployment settings, confirmed persistent-data recovery and independent host management access before disruptive work.[2]
Rollback
There is no universal rollback recipe here. The owner must verify restoration of the prior deployment and policy for this installation; if recovery is not established, stop.[2]

Planning boundary only: configuration and firewall changes can interrupt service or expose it beyond the intended clients. The responsible deployment/network owner must approve the exact change; this page supplies no mutation command.[2]

Read-only

Unresolved: assemble a targeted evidence packet

Keep the version, topology, endpoint comparison, mapping and time-correlated observations. Share only sanitized excerpts with the appropriate application or network owner; missing evidence is a reason to investigate, not permission to weaken security.[6][2]

Warnings and boundaries

Do not disable the firewall, disable Docker rule management, flush rules or expose all addresses as a generic test. Docker-managed rules are part of bridge networking.[2]
Host networking is a different architecture, not a safe replacement for diagnosing this bridge publication.[3]

Virtual lab test

Run HLF-DOCKER-PUBLISHED-PORT-LAN-20261005-R01 tested one specific diagnostic distinction from this page. The evidence below shows the topology, measured before/during/after states, and the strongest terminal captures rather than treating screenshots alone as proof.

Status
Virtual Lab Tested
Tested
Environment
Two disposable Debian 12.15 VMs on QEMU 11.1.0 formed an isolated socket-backed virtual LAN. The Docker host ran rootful Docker Engine 29.8.2 with the iptables backend through iptables-nft; nginx 1.30.5 was published only on the host's lab address at 192.168.77.10:18080.

Test topology

Virtual LAN client path

LAN client192.168.77.20
Published endpoint192.168.77.10:18080
Docker DNATtranslated to 172.17.0.2:80
DOCKER-USERclient-specific DROP during fault
nginx containersame container; service remained running

Docker-host control

Docker hostsame published URL
Published endpoint192.168.77.10:18080
nginx serviceHTTP 200 during client fault

Measured results

ProbeBaselineFault activeRecovery
Docker host → published endpointHTTP 200HTTP 200HTTP 200
Virtual LAN client → same endpointHTTP 200curl 28 / HTTP 000HTTP 200
Controlled DOCKER-USER counter—0 → 3 packets / 180 bytesRule removed
Container / mapping stateRunning; 80/tcp → 192.168.77.10:18080UnchangedUnchanged

What this experiment shows

  • The host-local and LAN-client requests used the same published URL and application path, so the observed split was not caused by testing different endpoints.
  • Read-only packet/NAT evidence established the translated destination as 172.17.0.2:80 before the filter rule was written.
  • The client-specific DROP counter increased during the failed LAN request while the Docker-host request continued returning HTTP 200.
  • Container ID, container IPv4, publication mapping and both virtual-LAN addresses stayed unchanged through the fault.
  • Removing only the controlled rule restored the client request; a later real post-recovery check independently confirmed both nodes still passed.
Interpretation. The Docker host and isolated LAN client both reached the published endpoint before fault injection. A temporary DOCKER-USER rule scoped only to client 192.168.77.20, ingress enp0s3, translated container 172.17.0.2 and TCP 80 left the host request at HTTP 200 while the client timed out with curl exit 28. The rule counter rose from 0 to 3 packets / 180 bytes. Removing the exact rule restored HTTP 200 from both nodes with the same container and mapping.

Key evidence captures

Terminal from HomeLabFix run HLF-DOCKER-PUBLISHED-PORT-LAN-20261005-R01 showing the client-specific DOCKER-USER DROP rule with a zero initial packet counter.
The controlled cause: one DOCKER-USER rule matches only the isolated LAN client, translated container address and TCP service port.
Terminal from HomeLabFix run HLF-DOCKER-PUBLISHED-PORT-LAN-20261005-R01 showing HTTP 200 from the Docker host, timeout from the virtual LAN client and the matching DROP counter increased to three packets.
The diagnostic split: the Docker host still returns HTTP 200, the isolated LAN client times out, and the matching rule counter rises to 3 packets / 180 bytes.

What this does not prove

This validates one host-versus-LAN published-port discriminator under an artificial client-specific filter fault in an isolated virtual LAN. It does not establish the cause of unrelated physical-LAN failures and does not validate physical Ethernet/Wi-Fi, routers, VLANs, client isolation, VPNs, Docker Desktop, WSL, rootless Docker, non-bridge modes, IPv6-only paths, direct routing, every gateway/firewall backend, or every application listener.

The complete reviewed bundle includes the full command logs, recovery evidence, additional captures, environment details, and integrity hashes. This article shows only the evidence that helps explain the diagnostic result.

Editorial verification

The citations beside technical claims show their evidence. HomeLabFix chooses the diagnostic order and states where the evidence stops supporting a conclusion.

Author and technical editor
Andrey Tretyak
Verification basis
The cited vendor or project documentation plus the page-specific reasoning above.
Hands-on status
A scoped virtual-lab reproduction is documented above. Other claims remain documentation- and reasoning-based unless separately tested.
Lab verification
Virtual Lab Tested · run HLF-DOCKER-PUBLISHED-PORT-LAN-20261005-R01 · · See topology, measurements, evidence captures, and scope.
Correction path
Report a source change, scope error, or reproducible contradiction.

Sources

Links were reviewed on 2026-10-05. Reachability and automated validation do not replace editorial verification of each claim.

  1. Port publishing and mapping
    Docker · Tier A · accessed 2026-09-05
  2. Packet filtering and firewalls
    Docker · Tier A · accessed 2026-09-05
  3. Host network driver
    Docker · Tier A · accessed 2026-09-05
  4. Docker with iptables
    Docker · Tier A · accessed 2026-09-05
  5. Docker with nftables
    Docker · Tier A · accessed 2026-09-05
  6. docker container port
    Docker · Tier A · accessed 2026-09-05

Still troubleshooting?