Сначала вы должны прочитать прохождение NAT в Википедии.
Однако, на самом деле, в основном, используются следующие способы: UPnP, STUN, TURN, а также ICE, представляющий собой комбинацию STUN и TURN.
Поскольку TCP является протоколом, ориентированным на соединение, NAT может управлять им для каждого соединения и отбрасывать все пакеты, когда соединение установлено.
Но UDP не имеет соединения, и ответ может приходить с другого порта или с разных адресов (по сравнению с вашим исходным адресатом). Также нет точного времени ожидания для сообщения UDP. Таким образом, для NAT обычно меньше ограничений для UDP.
В результате многие из этих реализаций P2P используют UDP или некоторые виды протоколов на основе UDP, такие как microTP, RUDP, UDT или даже SCTP через UDP (на основе WebRTC).
Вы также можете узнать из статей об обходах NAT, RFC и BEP (документы BitTorrent).
Редактировать: есть еще один интересный способ - обход ICMP. На самом деле ICMP (особенно сообщение о превышении TTL) имеет даже меньше ограничений, чем UDP для NAT, поскольку сообщение об ошибке может быть отправлено из любого уголка Интернета, и маршрутизаторы с NAT не могут знать, что эти сообщения не являются истинными. Однако для отправки ICMP-пакетов требуется разрешение root в Unix-подобных системах и разрешение администратора в Windows.