Переадресация входящих подключений к вашему приложению относительно проста:
stunnel позволяет перенаправлять трафик на определенные порты через туннель SSL. Это требует, чтобы вы запустили его с обоих концов.
Большинство приличных SSH клиентов, таких как OpenSSH или PuTTY , также поддерживают переадресацию портов с дополнительным преимуществом, которое обычно может иметь любой удаленный сервер SSH выступать в качестве другого конца туннеля без каких-либо изменений.
Вы также можете использовать OpenVPN и другие решения VPN, но для этого необходимо добавить специальные правила пересылки на удаленный сервер.
Пересылка исходящих соединений, однако, сложнее без изменения вашего приложения. Правильный способ сделать это - реализовать протокол SOCKS , предпочтительно SOCKS5 . Кроме того, вы можете использовать внешнее приложение, такое как FreeCap , для перенаправления любых соединений из вашего приложения.
После этого вы можете переадресовывать свои соединения на любой сервер SOCKS. Например, большинство клиентов SSH позволяют использовать протокол SOCKS для маршрутизации исходящих соединений через удаленный сервер.
В качестве идентификатора серверы OpenVPN не обязательно становятся шлюзом по умолчанию для всего вашего трафика. Некоторые отправляют такую запись в таблицу маршрутов клиентам, но ее можно изменить. В моей собственной настройке OpenVPN я использую VPN только для доступа к частной сети и не маршрутизирую все через нее.
Если вы можете заставить свое приложение связывать все исходящие сокеты с одним или несколькими определенными портами, вы можете использовать правила фильтрации IP в вашей системе для маршрутизации любых соединений от этих портов через VPN.
EDIT:
Туннелирование пакетов UDP несколько сложнее. Обычно вам нужен прокси-процесс как на удаленном сервере, так и на локальном клиенте, который будет туннелировать входящие и исходящие соединения через постоянное TCP-соединение.
Лучшим вариантом будет полная реализация клиента SOCKS5 в вашем приложении, включая команду UDP-ASSOCIATE для пакетов UDP. Затем вам нужно будет найти прокси-сервер SOCKS5, поддерживающий туннелирование.
Я иногда использовал Делегат , который, кажется, швейцарский карманный нож прокси. Насколько я знаю, он поддерживает команду UDP-ASSOCIATE в своей реализации SOCKS5, а также поддерживает соединение двух процессов Delegate через TCP-соединение. Он также доступен как для Linux, так и для Windows. Я не помню, может ли оно также шифровать это TCP-соединение, но вы всегда можете туннелировать это через stunnel или SSH, если вам нужно.
Однако если у вас есть права системного администратора на удаленном VPN-сервере, возможно, у вас более простая настройка:
Попросите ваше P2P-приложение связать исходящие UDP-сокеты с клиентским VPN-интерфейсом. Вам необходимо настроить дополнительный маршрут по умолчанию для этого интерфейса. Таким образом, исходящие пакеты вашего приложения будут проходить через удаленный сервер.
Пусть удаленный сервер перенаправит вам входящие UDP-пакеты на определенные порты через VPN-соединение.
Это должна быть более простая настройка, хотя, если вы действительно заботитесь об анонимности, вы можете быть заинтересованы в том, чтобы ваше P2P-приложение не пропускало DNS или другие запросы, которые можно отслеживать.