Wi-Fi & Network
Port forwarding isn't working
Forwarded a port and still can't reach the service? Work the real causes in order — CGNAT, double-NAT, the hairpin test trap, ISP-blocked 80/443, wrong IP.
Problem summary
Most 'port forwarding doesn't work' cases are one of a few things: you're testing from inside the LAN (hairpin), you're behind CGNAT or a double-NAT so the rule can never be reached, the ISP blocks 80/443, or the forward points at the wrong internal IP. Prove the service listens locally first, then test from outside.
Read your router's WAN IP and compare it to whatismyip.com.
ss -tlnp (or: netstat -an | find "LISTENING" on Windows)
The router's WAN IP is public and matches whatismyip.
Confirm with traceroute showing a 100.64 carrier hop before investing in workarounds.
Layer path
Step-by-step runbook
Start here. Do each check in order, compare it to the expected result, and stop when the evidence explains the failure or the safe stop point applies.
Prove the service locally
Check: On the host, confirm it listens on the LAN interface (ss -tlnp), then reach it by internal IP from another LAN device.
Expected result: The service answers locally by its LAN IP.
If not: If it only listens on 127.0.0.1 or not at all, fix the bind/host firewall before touching the router.
Classify the WAN path
Check: Compare the router's WAN IP to whatismyip: public-and-matching, private (double-NAT), or 100.64.x (CGNAT).
Expected result: You know whether a forward can be reached at all.
If not: CGNAT → stop and use a tunnel/VPN; double-NAT → bridge/passthrough the upstream gateway first.
Point the forward at a reserved IP
Check: Create the forward to a DHCP-reserved/static internal IP and the correct port.
Expected result: The rule targets an IP the device actually holds.
If not: Without a reservation, a lease change silently breaks the forward later.
Test only from outside
Check: Use a phone on cellular or an external port checker to test the public IP and port.
Expected result: The port is reachable from outside.
If not: Never trust an in-LAN test of the public IP — hairpin limits make it lie.
Handle ISP port blocks
Check: If 80/443 fail but a high port works, switch to an alternate external port, a reverse proxy, or a tunnel/mesh VPN.
Expected result: The service is reachable on a port the ISP doesn't block, or via a no-inbound-port path.
If not: Don't keep retrying 80/443 against a residential block — change the approach.
Clear the quiet blockers
Check: Check the host firewall and the router's UPnP mappings; remove conflicts.
Expected result: No host firewall drop or stray UPnP mapping defeats the rule.
If not: If it still fails with a clean external path, re-confirm the service bind and the destination IP.
Decision tree
If: Router WAN IP is in 100.64.0.0/10 (or differs from whatismyip).
Then: You're behind CGNAT — a forward can never be reached.
Action: Stop trying to port-forward; use a Cloudflare Tunnel or mesh VPN. See /fix/cgnat-home-access-no-public-ip.
Safe stop: Confirm with traceroute showing a 100.64 carrier hop before investing in workarounds.
If: Router WAN IP is a private range (192.168/10.x/172.16).
Then: Double-NAT: your router sits behind another NAT.
Action: Put the ISP gateway in bridge mode / IP passthrough, or DMZ it to your router, so only one device does NAT.
If: It works from outside but not when tested from home.
Then: Hairpin/NAT-loopback limitation, not a broken forward.
Action: Enable NAT reflection/loopback on the router, or use split-horizon/local DNS; otherwise just test from outside.
If: A high port is reachable but 80/443 are not.
Then: The ISP blocks those inbound ports.
Action: Use an alternate external port, a reverse proxy, or a tunnel/mesh VPN.
If: Path is fine but the specific service still won't answer.
Then: Wrong internal IP, host firewall, service not listening, or a UPnP conflict.
Action: Reserve the IP, allow the port on the host, bind the service to all interfaces, and clear stray UPnP mappings.
Evidence table
| Symptom | Evidence to collect | Likely layer | Next action |
|---|---|---|---|
| Nothing reachable from outside; WAN IP looks odd. | Router WAN IP vs whatismyip; traceroute first hops. | CGNAT or double-NAT | Bridge the gateway (double-NAT) or move to a tunnel/VPN (CGNAT). |
| Fails from home, untested from outside. | Result from a phone on cellular or an external port checker. | Hairpin test artifact | Trust only the external test; enable NAT loopback if you need in-LAN access by public name. |
| High port works, 80/443 time out. | External port check on 8080 vs 80/443. | ISP inbound block | Alternate port, reverse proxy, or tunnel. |
| Path open but service silent. | ss -tlnp on host; forward destination IP; host firewall; UPnP mappings page. | Host/service/IP/UPnP | Reserve IP, bind to all interfaces, allow port, clear UPnP conflict. |
Commands and settings paths
Is the service even listening?
ss -tlnp (or: netstat -an | find "LISTENING" on Windows)
Where: On the host running the service.
Expected: The service is listening on 0.0.0.0/the LAN IP and the intended port — not only 127.0.0.1.
Failure means: Loopback-only or absent means the forward has nothing to deliver to.
Safe next step: Bind the service to all interfaces, then reach it by internal IP from another LAN device.
What is the router's WAN IP really?
Router admin > WAN/Internet status vs whatismyip.com
Where: In the router admin UI and a browser.
Expected: WAN IP is public and matches whatismyip.
Failure means: Private WAN IP = double-NAT; 100.64.x = CGNAT.
Safe next step: Bridge the upstream gateway, or move to a tunnel/VPN for CGNAT.
Is the port open from OUTSIDE?
An external port checker, or: nc -vz <public-ip> <port> from a cellular hotspot
Where: From a network outside your home (phone on cellular, not your Wi-Fi).
Expected: The port shows open/reachable from outside.
Failure means: Closed from outside while fine locally points at CGNAT/double-NAT, an ISP block, or a host firewall.
Safe next step: Work the decision tree by which combination of internal/external tests passes.
Any conflicting UPnP mappings?
Router admin > UPnP / port-mapping status
Where: In the router admin UI.
Expected: No automatic UPnP mapping conflicts with your manual forward.
Failure means: A game console or app may have auto-created a mapping on the same port.
Safe next step: Remove the stray mapping or disable UPnP, then re-test.
Hardware and platform boundary
Change only when
- If you're behind CGNAT or fighting ISP blocks, stop hardening port-forwarding and move to a tunnel (Cloudflare Tunnel) or mesh VPN (Tailscale/WireGuard) — see the safe-remote-access guide.
Evidence that matters
- Whether your ISP gives a real public IPv4 (vs CGNAT), whether the router supports bridge mode and NAT loopback, and DHCP reservations.
Evidence that does not matter
- Raw router throughput — port forwarding is a reachability/config problem, not a speed one.
Avoid
- Exposing a sensitive service straight to the internet just to make a forward work, or DMZ'ing your whole LAN; prefer a reverse proxy or VPN.
Related tool/checklist
Use the linked tool when you need a guided plan from your exact symptoms instead of a static checklist.
Device setup troubleshooterRelated problems
Last reviewed
2026-06-02 · Reviewed by HomeTechOps. Built from June-2026 web research verified against router/firewall vendor docs (UI/Ubiquiti, MikroTik, OPNsense/pfSense NAT reflection, Netgate UPnP) and CGNAT detection guidance; complements rather than duplicates /fix/cgnat-home-access-no-public-ip. Leads with the hairpin test trap and the local-listen check, the two most common false failures.
Sources/assumptions
- Assumes a consumer/prosumer router where you've already created a forward rule and the target service runs on a known LAN device.
- Assumes you can test from a network outside your home (a phone on cellular) — testing from inside the LAN is the single most common false failure.
- If you're behind CGNAT, port forwarding cannot work at all — a tunnel or mesh VPN is the answer; see the CGNAT page.
Source-backed checks
HomeTechOps turns official docs and conservative safety rules into a shorter runbook. These links are the source trail for the page direction.