Подключение к VPN без установки клиентского ПО
Вопрос
Иногда мне приходится писать программное обеспечение для установления сокета с конкретным сервером, находящимся в Cisco VPN.Я просто пишу свое программное обеспечение так, как будто VPN не существует (используя стандартную библиотеку сокетов).Когда приходит время запуска этой программы, я вручную подключаюсь к VPN с помощью клиентского программного обеспечения, установленного на моем компьютере, а затем запускаю саму программу.
Однако было бы желательно написать программное обеспечение, использующее преимущества специализированной библиотеки сокетов, способной взаимодействовать напрямую через VPN, без использования какого-либо установленного клиентского программного обеспечения.
Вот некоторый код Java, иллюстрирующий функциональность, которую я хотел бы:
String vpnHost = ...;
String vpnUser = ...;
String vpnPassword = ...;
VPNConnection vpnConnection = new CiscoVPNConnection(vpnHost, vpnUser, vpnPassword);
String serverHost = ...;
int serverPort = ...;
Socket socket = vpnConnection.openSocket(serverHost, serverPort);
Можно ли установить такое подключение к VPN без установки какого-либо клиентского ПО?
Решение
Это зависит от того, как настроен VPN-сервер.
Большинство продуктов VPN используют IPSEC — стандартный протокол шифрования TCP/IP-соединений.Большинство продуктов также используют ISAKMP, протокол управления ключами архитектуры безопасности Интернета, который также является стандартом для настройки сеанса.Исходный код IPSEC и ISAKMP легко доступен и может быть уже установлен в вашей системе.
Теперь о плохих новостях:хотя все, что я уже упомянул, является стандартным, схемы аутентификации, которые можно использовать с ISAKMP, почти все являются запатентованными.Две «стандартные» схемы аутентификации — это общий ключ и сертификаты X.509.Если VPN-сервер настроен на разрешение любого из этих действий, у вас есть шанс.В противном случае вы не сможете по-настоящему использовать VPN, поскольку протокол действительно является запатентованным, и его практически невозможно перепроектировать, поскольку сеанс аутентификации зашифрован.
Гораздо более простой путь:вам действительно нужен VPN или есть способ туннелировать через SSL?Я думаю, что Java поддерживает SSL;вы можете просто создать нужный вам безопасный сокет и продолжить работу с ним.
Если вы знаете, какую клиентскую систему вы используете, рассмотрите возможность вызова клиента Cisco VPN для этой системы.
В противном случае вам придется повторить то, что делает VPN-клиент.VPN-клиент выполняет аутентификацию и настройку сеанса с помощью ISAKMP и устанавливает результат в ядро для создания VPN-соединения.Доступны реализации ISAKMP;вам нужно только выяснить, какая аутентификация используется, и попытаться ее настроить.На этом этапе вы напишете свой собственный VPN-клиент.
Другие советы
Я использую пакет vpnc в Linux для подключения к Cisco VPN моей компании, поскольку у нас нет совместимого клиента Linux.Однако vpnc написан на языке C, поэтому вам придется выполнить порт.
Вы можете прочитать официальный документ Cisco и после этого создать bat-файл со следующими данными:VpnClient Connect [имя подключения] Pwd [пароль] и отключить.Включите его в свою Java-программу:Runtime.getRuntime().exec("cmd /c start [Путь к bat-файлу]");