Хотите реализовать VPN только для одного приложения - PullRequest
8 голосов
/ 12 февраля 2011

Я ищу, чтобы добавить поддержку VPN для моего программного обеспечения,

Я знаю PPTP и OpenVPN, оба устанавливают общесистемную привязку, устанавливая драйвер TAP, поэтому все приложения перенаправляют свой трафик на них.

Как я могу реализовать поддержку VPN только для моего приложения? Есть какая-нибудь библиотека, пример, подсказка или способ сделать это?

Мое программное обеспечение на самом деле сделано на C ++ / MFC. Использование стандартного CAsyncSocket.

Ответы [ 3 ]

14 голосов
/ 20 февраля 2011

Переадресация входящих подключений к вашему приложению относительно проста:

  • 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 или другие запросы, которые можно отслеживать.

0 голосов
/ 26 февраля 2011

Я думаю, вам просто нужен SSL: http://www.openssl.org/

OpenVPN основан на SSL - но это полный vpn.

Вопрос в том, что вам нужно?Если вам нужно шифрование (частное соединение приложения), а не vpn (виртуальная частная сеть), перейдите по ссылке ssl.

Здесь можно найти подсказки:

Добавление поддержки SSL в существующий протокол TCP& UDP код?

http://sctp.fh -muenster.de / dtls-samples.html

http://fixunix.com/openssl/152877-ssl-udp-traffic.html

0 голосов
/ 25 февраля 2011

Поместите SSH-соединение в ваше приложение или используйте SSL. Вам придется использовать протокол / сервис вместо технологии VPN. Удачи!

...