Как соединить 2 пк находящихся за нат?
Без стороннего сервиса - абсолютно никак.

Сторонний сервис можете поднять и сами в виде VPN, но я бы просто воспользовался тем же Хамачи или аналогами.
В качестве наводки - почитайте вот это
- https://ru.wikipedia.org/wiki/STUN
- https://en.wikipedia.org/wiki/UDP_hole_punching
- https://habr.com/ru/post/481034/
- https://habr.com/ru/post/509730/

Я не проверял и вовсе не уверен, что оно работает, но суть вот в чем:
- компьютер за NAT в целом может обмениваться UDP пакетами с внешним сервисом - при этом NAT выдает компьютеру "временный внешний порт" на IP адресе NAT
- если А и Б подключаются к внешнему сервису (называется STUN) одновременно, последний может отдать А данные о том, каков "временный внешний порт" Б (и его адрес), а Б - отдать информацию об А
- после этого А и Б могут обмениваться пакетами через свои временные порты напрямую - посылая пакеты друг дружке на временные адреса (нужен постоянный обмен данными чтоб не оборвалось соединение - чтоб NAT не забрал временный порт обратно). С этого момента STUN не нужен и более не участвует в обмене трафиком
- в интернете есть вагон и маленькая тележка бесплатных STUN серверов
- безопасность не гарантируется (в теории (после установления соединения) можно поднять IPSEC туннель)
- так работает большинство VoIP (скайп, телега, итп) в условиях, когда оба абонента находятся за NAT (по возможности, конечно - некоторые NAT провайдеры даже такое соединение блокируют)