Прямое соединение двух клиентов за NAT'ами, если хоть один из них не симметричный (symmetric nat), возможно с помощью
UDP и
TCP hole punching, но для этого нужно знать IP-адреса и порты обеих сторон.
Также существует способ определения IP-адреса клиента сервером —
ICMP Hole Punching, реализованный в программе
pwnat, но отправка пакета клиентом требует администраторских прав на устройстве, а также пакет может отбрасываться некоторыми файрволлами.
Могут ли p2p сети работать, если все пользователи имеют серые IP? Да, могут, но не всегда и не настолько стабильно, нежели при полноценном прямом подключении.