@ianfontinell CG-NAT is only the norm if you're on a cellular connection, or if you're in certain parts of the world such as the Phillipines. There's a BIG difference between a regular plain old NAT and a CG-NAT.
With a regular NAT, there's only ever one address translation, and it happens at the point where your router connects to your ISP. So for example...
Your ISP gives your internet connection an address, say 1.2.3.4, then on your home network, you're running 192.168.1.0/24, and your particular computer uses 192.168.1.100, and that your torrent client uses port 22791.
When a connection request is sent to 1.2.3.4, it will make it all the way to your router before it gets dropped because your router doesn't know explicitly where to send unsolicited traffic for that port. When you port forward, when the connection makes it to your router, it knows that traffic coming in on destination port TCP or UDP 22791 is to be forwarded to 192.168.1.100. This is commonly referred to as a Destination NAT (Network Address Translator).
As well, when any device on your network such as your PC makes a connection out to the internet, it identifies to your router as 192.168.1.100, but before your router passes the packet out to your ISP, the SNAT (Source NAT), it translates the source address to 1.2.3.4 so that your ISP and the internet know where it comes from.
With a CG-NAT (Carrier Grade Network Address Translator), there's an extra step involved whereas you still have the IP address 1.2.3.4, which is what the internet will see, but then due to the lack of availability of IPv4 addresses (as there's only so many of them around the entire world), there's a second private layer network in the middle. So when the connection makes it to 1.2.3.4, your carrier router drops the packet, because it does not know which of the many subnets on the internal network beyond that CG-NAT the connection is supposed to be sent.
Outgoing connections work in a very similar way to having a double NAT. Your PC will still have the same 192.168.1.100, but before your router passes it to your ISP's router, it changes it to say 10.201.176.24 to pass through that seemingly invisible link between your ISP and the actual internet. It is only when the connection makes it to the actual internet that your ISP's CG-NAT then converts it to your public 1.2.3.4 before passing it out to the internet. This is done so as to be able to pool a far greater number of either end-user devices, or entire customer connections behind a single IP address shared across multiple connections, devices, or customers.
The problem here is that while you can control the port forwarding between your end of your ISP's private link and your network, the other end of your ISP's network before it links into the internet itself generally cannot be configured to forward such connections. The end result is that port forwarding in this situation becomes impossible, and the only solution for proper incoming connection routing to get to your PC becomes a VPN.
This is where IPv6 comes in handy and sooner or later, will eventually replace IPv4 entirely. With IPv6, you can fit literally every single IPv4 address in the entire world into a /96 block. The "standard" for IPv6 for the standard SLAAC setup to work is a /64 block, which actually has a little more than twice the number of IP addresses as ALL of IPv4. You can in theory break the block down into smaller blocks, but this usually requires super custom and often static configurations, as it breaks standard functions like SLAAC.
Now here's the amazing part about IPv6. A /64 block is about twice the size as ALL of IPv4, but yet the standard for an ISP to issue to any one given end-user connection is a /56 block. For perspective, the "standard" /56 block is capable of holding up to 256 different /64 blocks, each one of which holds about 2x the size of ALL of IPv4 addresses.
Also, by comparison, the "standard" for a home network on IPv4 is a /24 subnet, which holds exactly 256 IP addresses, of which, only 254 are actually able to be used because you need a base address at the beginning of the subnet (in this case the .0) as well as a broadcast address at the end of the subnet (in this case, the .255). If you need more than 254 devices on your home network including your router, your only other option is to break it down into a larger subnet (such as a /16), or you have to start subnetting to hide one or more other subnets behind a router on the /24 subnet. With IPv6, this is simply not the case, and the only time you really need to subnet at all is if you have multiple legs of a network across multiple interfaces on a "real" router. There are about 3.4 BILLION IP addresses in all of IPv4, of which, that single /64 block that is usually the only thing to get used in the /56 you get assigned holds approximately TWICE the amount.
So there's a part of me that kind of can't wait for every provider in the world to finally fully roll out IPv6, and eventually just abandon IPv4 completely because it will make CG-NAT a thing of the past.