Linux. Туннель по требованию, или автосоединение VPN.

Сложность материала: выше среднего.

Совершенно не всегда рационально постоянно держать VPN в подключенном состоянии. В данной статье поговорим о том, как автоматически «поднимать» туннель только когда в нем есть необходимость.

Для полноты картины, настоятельно рекомендую изучить две предыдущие статьи:

Linux. Строим туннель (VPN), с помощью OpenSSH
Linux. Маршрутизация некоторых сайтов через VPN.

Я буду полагать, что вы с ними ознакомились, чтобы не повторяться, во-первых, и не раздувать текст — во-вторых.

Итак, вы создали и настроили устройство tun0, прописали на него маршрутизацию. В момент отключения от VPN упомянутое устройство не уничтожается, а просто освобождается. Таким образом, мы не теряем маршрутизацию и другие настройки, связанные с ним.

Теперь главный вопрос: нам не нужен постоянно поднятый туннель, мы хотим, чтобы тот «активировался» только при попытке отправки трафика через tun0. Вероятно, можно завести правило в iptables, завернуть пакеты через NFLOG на какой-нибудь Snort и т.д., однако, полистав документацию и хорошо погуглив ничего адекватного не нашел. Было бы интересно рассмотреть простые варианты, если знаете – пожалуйста поделитесь в комментах.

В итоге, был написан демон под Linux – tuninetd. Его суть напоминает inetd, только для tun/tap. Вешается на устройство, как только видит пакет, освобождает его и запускает внешнюю команду, по указанному вами пути с параметром «start». Далее начинает слушать интерфейс, подобно tcpdump, на предмет простоя. Спустя указанное количество секунд именно простоя, т.е. с момента передачи последнего пакета, выполняет ту же самую внешнюю команду, только с параметром «stop», и снова вешается на устройство. Все дело в том, что на пустом интерфейсе невозможно зафиксировать поступающие пакеты, они сбрасываются ядром, libpcap (tcpdump) их не видит. Поэтому приходится слушать устройство, подписавшись к нему в качестве клиента, подобно тому, как это делает OpenVPN или OpenSSH в режиме туннеля.

В качестве обработки внешнего вызова, подразумевается скрипт (Shell, Python, Perl…), как прослойка для простого добавления логики. Shell на хорошем уровне должен знать любой Linux администратор, так что полагаю с этим проблем не возникнет. Тем не менее, в репозитории tuninetd присутствует пример такого скрипта.

Ну и поскольку демон построен на базе libpcap, вы можете указать фильтр срабатывания, с идентичным tcpdump синтаксисом. Поскольку построен на той же самой библиотеке. Таким образом сделать tuninetd чувствительным только к определенным пакетам или хостам – тут уже зависит от полета вашей фантазии и требований.

Кстати, в режиме демона, tuninetd кричит в системный лог о событиях и ошибках.

Дополнение (сенсор NFLOG)

Начиная с версии tuninetd 1.1.0 был дописан модуль обработки пакетов, поступающих через NFLOG, вместо привязки к устройству tun/tap. Таким образом, назначение демона значительно расширились. Можно контролировать появление/исчезновение активности любых сетевых служб или транзитного трафика. С помощью скрипта — обработчика вызовов (с параметрами «start» и «stop») решение может приобретать любой контекст, в зависимости от поставленной задачи. В том числе, демон может быть использован для организации простейших средств сетевой защиты.

Добавить комментарий