Как общаться двум компам которые находятся за своими NAT?
NAT Traversal, STUN, TURN.

Совсем без чего-нибудь промежуточного с белым адресом, хотя бы чисто для первоначальной инициализации соединения и поиска "компов" друг другом - никак.
Даже в WebRTC в самом простом случае есть сигнальный сервер, через который пиры обмениваются кандидатами, и иногда получается без излишеств типа STUN/TURN, но зачастую только в идеальном мире.
Zerotier поставьте и никакие велосипеды можно не изобретать