Я использую сервер uvnc. Отдельно сервер с репитером, туда коннектятся все клиенты (с установленным сервисом, либо запускаемым клиентом, который показывает id) с определенными id и ожидают подключения. Сам коннекчусь используя подправленный chunk wrapper, т.е. просто указываю нужный id и попадаю куда хочу (но подойдет обычный vnc клиент с нужной командой). В этом случае нужен внешний адрес только на сервере с репитером, всё остальное проходят через любые наты. Есть минус, что при плохом интернете всё очень печально.