Самый простой подход IMO - использовать ssh-туннелирование.Как я уже писал в своем комментарии, на SU много вопросов, которые покажут вам, как это сделать.
Но при условии, что вы хотите что-то запрограммировать ...
Вам понадобитсясоздать клиента и сервер.У клиента будут потоки, которые вызывают accept
на любых локальных портах, которые вы хотите открыть.Когда соединение приходит к порту, вы создаете другой поток, который открывает соединение с сервером и постоянно отправляет данные по сети.
Программа сервера прослушивает один порт, который вы открываете в брандмауэре.Он ожидает подключения к этому порту, а когда он получает соединение, открывает соединение с указанным локальным портом.Затем он перетасовывает байты из одного в другой.
Единственная хитрость заключается в том, что вам нужно определить протокол для указания порта назначения в потоке клиент-сервер.Самый простой подход - записать двухбайтовое целое число в начале потока.