This isn't unique to Ethereum per se, but I'm curious how p2p clients (e.g. geth) allow peers to receive messages from the outside world with default router configurations. I have tried running the tests in this NAT port mapping module, but I believe they are failing because my router is not configured for port mapping.
So if routers don't allow port mapping by default, how do peers exchange data? Would a peer connect to a bootstrap node, who would read that peer's externally facing IP/port and then send a message with that information?