Port forwarding behind CGNAT: what works
Why a forwarded port never answers behind carrier-grade NAT, a three-step check to confirm it, and four ways out with what each needs at both ends.
Key takeaways
- The 100.64.0.0/10 range is reserved for carrier-grade NAT, so a router WAN address inside it means your router cannot receive unsolicited inbound connections and a forwarding rule on it never fires.
- Four options exist: a public IPv4 address from the ISP, IPv6 on both ends, a relay or tunnel service, and a device-to-device link where both ends connect out.
- Three lab topologies were built on 2026-10-16 and all three passed: two cone NATs went direct after 16 seconds, two symmetric NATs stayed on the relay, and a NAT-PMP router mapped one UDP port.
- An open port on a home router adds a service to the attack surface, and CISA advises removing unneeded services and disabling UPnP when it is not needed.
On this page (9)
- Why does port forwarding not work behind CGNAT?
- How do I know if I am behind CGNAT?
- What can I use instead of port forwarding behind CGNAT?
- Can I get a public IP from my ISP?
- Does IPv6 fix CGNAT?
- How does a tunnel service work behind CGNAT?
- Can two devices connect with no open port at all?
- Is an open port safe?
- What should I do if I am behind CGNAT?
Your forwarding rule is probably fine; behind CGNAT your router may not hold a public address at all. The address it reaches the internet through is shared with other customers, behind a translator you cannot configure.
- CGNAT
- Carrier-grade NAT: a network address translator run by the ISP that lets many customers share public IPv4 addresses, so no single customer's router holds one.
Why does port forwarding not work behind CGNAT?
Because the translator that decides which packets get in is at your ISP, not in your living room. A forwarding rule tells your router "send traffic for this port to that computer"; that only works if the traffic reaches your router in the first place.
Behind carrier-grade NAT it does not. Nothing arrives. An inbound packet arrives at the ISP's translator, which has no mapping created by an outgoing connection from you, and drops it. RFC 6888 sets out the common requirements for these translators, and the mapping logic is the same as at home: state is created by traffic going out, not coming in.
So no better rule on your router will help by default. A few ISPs support PCP on their translator, which lets a router request an inbound mapping (RFC 6887), but the ISP decides that. Otherwise you obtain an address that arrives at your router, or both ends of the conversation connect outward.
How do I know if I am behind CGNAT?
Compare two addresses with a VPN switched off on the router and the device you test from. Tunnel addresses can sit in the same range as CGNAT ones, and a VPN left on will fool the check.
- Open your router's status page and read its WAN address (sometimes called the internet or external address).
- Look up the public address your connection shows to the outside, using any address-lookup page.
- Compare. If the two differ, there is another translator between you and the internet.
A WAN address between 100.64.0.0 and 100.127.255.255 is in the shared address space that RFC 6598 reserves as 100.64.0.0/10. Carriers use it to number the links between their translators and your equipment.
One public example of the pattern: a GL.iNet forum thread dated 2026-04-05 describes a user on a 5G home connection whose address started with 100 and who found that forwarding WireGuard's port did nothing. A WAN address in the private ranges of RFC 1918 (10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16) means another NAT sits in front of your router, which usually blocks inbound traffic the same way.
What can I use instead of port forwarding behind CGNAT?
There are four alternatives, and they differ in what each end must have. Read the far-end column first; it usually decides.
| Option | What your home end needs | What the far end needs | Trade-off |
|---|---|---|---|
| Public IPv4 from the ISP | A WAN address that is routable; then an ordinary forwarding rule | Nothing special | Depends on the ISP agreeing; opens a port to the whole internet |
| IPv6 on both ends | IPv6 from the ISP and a firewall exception for the service | IPv6 from its own network | The far network may have no IPv6; the exception is still an open port |
| Relay or tunnel service | A client that connects out to the service | A client or a hostname the service gives you | A third party carries or fronts the traffic; the service sets the terms |
| Device-to-device link | An app on the home device that connects out | The same app, on your account or on an exit shared with you | Both devices must run it; the home device has to be on; when neither NAT allows a direct path, traffic stays on the relay, a machine someone else operates |
The first two keep the old model: someone connects to a port you opened. The last two replace it: the home side connects out, so nothing needs to be opened by hand on your router. (For the device link, the app may still ask the router for a temporary mapping, as described below.)
Can I get a public IP from my ISP?
Sometimes. The only way to find out is to ask. Ask for a public IPv4 address rather than a static one; those are different requests, and the ISP decides terms and whether it is available on your line.
After the change, repeat the three-step check. The WAN address should now match what the lookup page shows and sit outside 100.64.0.0/10. If it does, a normal forwarding rule will work, and you are back to the usual exposure questions covered below.
Does IPv6 fix CGNAT?
It fixes the address shortage, not the filter. That distinction matters. Under IPv6 your devices can have global addresses of their own, so nothing is shared and there is no translator to cross.
Home routers still keep inbound traffic out by default. RFC 6092 recommends that gateways require filter state to be activated by traffic originating at interior nodes, and allow manually configured exceptions. You add the exception, which is again a port open to the internet. The second condition is on the far side: whoever connects needs IPv6 as well, and many networks still do not have it.
How does a tunnel service work behind CGNAT?
A tunnel service gives your home side something to connect out to. The service holds a public address, your home end opens a connection to it, and visitors reach the service.
Pinggy's own page, read on 2026-10-16 (updated 2026-08-20), describes its answer to CGNAT as an SSH reverse tunnel to its hosted endpoint, with a sign-in for permanent URLs and custom domains. That is one vendor selling one service, and we make no claim about it beyond what its page says. A VPS you rent and run yourself plays the same role, at the price of keeping that server patched. Either way, the traffic passes through a machine someone else operates.
A peer behind CGNAT that must receive while idle needs PersistentKeepalive.
Can two devices connect with no open port at all?
Yes. It works when both ends connect out and the NAT in front of each lets the replies back in. This is what the term NAT traversal covers, and RFC 5128 surveys the techniques, including the hole punching used between two peers that both sit behind a NAT. Sharing an exit with a person you name rides on the same idea; see sharing a VPN with family.
- A cone NAT reuses one outside port for every destination a device talks to, so a peer can be told where to send.
- A symmetric NAT picks a new port per destination, which defeats that.
- Hole punching is both peers sending outward at once, so each NAT opens a path for the other.
RFC 6886 defines NAT-PMP, a protocol that lets a device ask its router for a port mapping.
This is how ForestVPN's My exits works. On the home computer you turn on Use as an exit; on your phone or laptop you pick that computer under My exits. No port forwarding and no router setup is involved. While the home computer serves as an exit, the app asks a router that offers UPnP, PCP or NAT-PMP for a temporary UDP mapping.
Anything on the home network that can run ForestVPN is reachable while you are connected through that exit. Details and limits are on the home anywhere page, including that the home computer has to be on and that home upload speed is the ceiling.
Sharing a device with a named person is on the family sharing page, and the mesh comparison sets it beside Tailscale, a mesh VPN service. Every plan includes it, the Free plan too; the limits on exits and people are on the home anywhere page.
Which path two devices end up on depends on the NATs in front of them, so we built three topologies and ran each once.
What happened in our network-fault lab?
How this was tested
- Product
- ForestVPN fv (mesh, lab build)
- Version
- 0.3.10, main sha 4adf0ab887
- System
- Linux aarch64 musl, Alpine container
- Checked
- Runs
- 1
Not tested
One run of each scenario on 2026-10-16, in a privileged container on a local Mac with no ISP path, using lab accounts and no production identity. The router in each scenario is a Linux masquerade, not an ISP carrier-grade translator, so these results describe the topology the script built on this date and say nothing about what CGNAT always does. The relay in these runs was the lab's stand-in (mesh_stub), not the production relay, so "stayed on the relay" describes the lab's relay. Not measured: a real ISP CGNAT, IPv6 paths, round-trip times, repeated runs.
| Scenario | What the script built | Path the pair ended on | Result recorded |
|---|---|---|---|
| mesh_punch_cone | Two cone NATs, nothing inbound unsolicited | Relayed first, then direct | Direct after 16 seconds of traffic; 208 relay bytes in 5 seconds afterwards; passed |
| mesh_punch_symmetric | Two endpoint-dependent (symmetric) NATs | Stayed on the relay | No endpoint switches; 0 of 20 probes lost over 20 seconds; passed |
| mesh_portmapped | The home side behind a NAT-PMP router, hole punching off | The address the router mapped | UDP port 51237 mapped; 5 of 5 probes answered with the relay cut; passed |
In the first two topologies the router offered no mapping protocol and the pair still connected, direct in the cone run and relayed in the symmetric run.
Symmetric NAT is the hard case for any peer-to-peer technique. It worked here only by staying on the relay: data flowed, but through a middleman.
Cone went direct, though we expected about 5 seconds and it took 16. In the third run the router handed out a NAT-PMP mapping on request.
Is an open port safe?
An open port is a service the whole internet can try, so it is only as safe as the software behind it and how fast you patch it.
CISA's home network guidance advises disabling unnecessary services to shrink the attack surface, and turning off UPnP unless there is a specific need, because, CISA warns, malware inside your network can use UPnP to weaken the router's firewall and let attackers control devices remotely.
The app asks for a mapping through any of UPnP, PCP or NAT-PMP, so switching UPnP off alone may not stop it; a router that answers none of them leaves the pair on hole punching or the relay. The outbound shapes in the table are not risk-free either: the home device runs a client, so keep it updated.
What should I do if I am behind CGNAT?
Run the three-step check. If the WAN address is outside 100.64.0.0/10 and matches the lookup page, forward as usual. If it is inside, write to the ISP once for a public IPv4 address; if that fails or you would rather open nothing, make the home side connect out. If you were weighing a rented server instead, self-hosted WireGuard vs a VPN service times that build.
For reaching your own devices, that means one app on each end and no router login.
| Plan | Price | Billed |
|---|---|---|
| Free | – | 2 GB per connection, 5 connections a day |
| Monthly | $7.99 | per month |
| Yearly | $49.99 | per year |
Questions and answers
Why does port forwarding not work behind CGNAT?
The shared translator sits at your ISP, outside your router. An inbound packet reaches it first, finds no mapping created by an outgoing connection, and is dropped, so the rule on your router never sees it. Forwarding on your own router only helps when your router holds the public address.
How do I know if I am behind CGNAT?
Read the WAN address on your router's status page. If it is inside 100.64.0.0/10, you are behind carrier-grade NAT. If it is a different address from the one a lookup page shows for your connection, another translator sits in between. Run the check with any VPN off.
Can I get a public IP from my ISP?
Some ISPs hand out a public IPv4 address on request and some do not; the answer and the terms are the ISP's. Ask support for a public IPv4 address, not a static one, and check the WAN address again afterwards.
Does IPv6 fix CGNAT?
It removes the shortage of addresses, so each device can have a global one. It does not remove the router's filter: IPv6 home routers are recommended to allow only traffic started from inside, so you still add an exception, and the device you reach from also needs IPv6.
What can I use instead of port forwarding?
A relay or tunnel service, or a link where both ends connect outward. With ForestVPN's My exits, your home computer and your phone both open outbound connections, and you forward nothing by hand.
Is an open port safe?
An open port exposes a service to the whole internet, which adds to what you must patch and watch. CISA advises removing unnecessary services and turning off UPnP unless needed. Outbound-only shapes such as a relay or tunnel service avoid a hand-opened inbound port, though each has its own risks. Turning UPnP off does not stop the mapping by itself, because the app also tries PCP and NAT-PMP; only a router that answers none of the three leaves the pair on hole punching or the relay.
How can I reach my home computer from outside with CGNAT?
Use an approach where the home side connects out: a hosted tunnel, a VPS you rent, or a device link. In ForestVPN, turn on Use as an exit on the home computer and pick it under My exits on the device you carry.
Sources
- RFC 6598: IANA-Reserved IPv4 Prefix for Shared Address Space (read October 16, 2026)
- RFC 6888: Common Requirements for Carrier-Grade NATs (CGNs) (read October 16, 2026)
- RFC 6092: Recommended Simple Security Capabilities in Customer Premises Equipment (CPE) for Providing Residential IPv6 Internet Service (read October 16, 2026)
- RFC 6887: Port Control Protocol (PCP) (read October 16, 2026)
- RFC 6886: NAT Port Mapping Protocol (NAT-PMP) (read October 16, 2026)
- RFC 5128: State of Peer-to-Peer (P2P) Communication across Network Address Translators (NATs) (read October 16, 2026)
- RFC 1918: Address Allocation for Private Internets (read October 16, 2026)
- CISA, Home Network Security (read October 16, 2026)
- Pinggy, How to Set Up Port Forwarding Even Behind CGNAT (read October 16, 2026)
- GL.iNet forum, Configuring port forwarding with CGNAT (read October 16, 2026)
How this was made
Drafted with AI assistance from IETF documents, a CISA page, a tunnel vendor's page and a forum thread read on 2026-10-16 and ForestVPN's own network-fault test logs, checked by automated gates and an editor.
