Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Создаем VPN на основе vtun

Бешков Андрей
tigrisha@regata.ru

Оригинал статьи находится на сайте http://onix.opennet.ru/

Компания в которой я работаю довольно быстро разрастается. У нас все время появляются новые филиалы. Соответственно увеличивается количество внутренних сетей. Настал момент когда появилась необходимость соединить эти разрозненые сети в единое пространство. Нам нужна надежная, безопасная и защищенная от подглядывания система связи. Единственной возможностью выполнить все предъявленые требования является создание своей корпоративной VPN. В сети так много сайтов, объясняющих каждому, как престижно иметь в своем распоряжении VPN. Но ни один из них не публикует детального описания, как этого добиться. Побродив несколько дней по просторам интернета, но так и не найдя нормального описания процесса развертывания VPN, решил написать об этом сам.

Я буду использовать vtun, написаный Максимом Краснянским на основе пакета VPPP. Главная страница проекта vtun находится по адресу http://vtun.sourceforge.net. Вы можете спросить, почему именно vtun. Ведь можно было использовать что-либо вроде PPP поверх SSH, IPSEC или GRE. Возможно, в ближайшее время я напишу о работе с IPSEC или OpenVPN. Главными достоинствами vtun являются простота в установке, гибкость настройки и отличная документация. Vtun достаточно хорошо защищает от атак основанных на действиях злоумышленника находящегося между двумя машинами туннеля. Этот тип атак обычно называют MIM (Men In the Middle), Чаще всего злоумышленник пытается выполнить одно или комплекс из следующих действий - измененить содержимого передаваемых пакетов, повторно проиграть записанную последовательность пакетов, выдать себя за одну из сторон участвуюших в передаче данных.

Поддерживаются разнообразные типы туннелей IP, Ethernet, PPP, SLIP. В качестве туннеля можно использовать даже pipe и TTY. Для шифрования потока данных используется OpenSSL. Доступны алгоритмы blowfish с ключом в 128 бит или MD5 с ключом той же длины. Компрессия потока производится с помощью библиотек LZO или zlib. Следует отметить, что zlib работает только с tcp туннелями. Если в Вашей операционной системе нет библиотек zlib или LZO, и Вы не смогли установить их самостоятельно, значит прийдется отключить компрессию. Это снизит скорость передачи данных. Но все же не окажет решающего влияния на работу vtun. Официально vtun работает на следующих операционных системах: Linux, Solaris, FreeBSD, NetBSD, OpenBSD и другие BSD клоны. В принципе, vtun должен работать на любой платформе, для которой есть универсальный драйвер tun/tap. Устройство tun используется для туннелирования IP фреймов, а tap соответственно для Ethernet фреймов. С помощью tun/tap пользовательские программы получают возможность самостоятельно обрабатывать IP пакеты. Для некоторых операционных систем необходимо перекомпилировать ядро с поддержкой tun/tap устройств. Vtun работает на основе клиент-серверной модели. Соответственно, для создания туннеля на одном из хостов, демон vtun должен быть запущен как сервер, а на другом как клиент.

Если между клиентом и сервером находится брандмауэр, значит необходимо разрешить прохождение пакетов, адресованных на порт 5000. Попытки провести vpn тоннель через систему с NAT, скорее всего завершатся фатально. Проблема в том, что NAT изменяет содержимое проходящих пакетов. Поэтому ни один пакет не пройдет проверку контрольной суммы.

После запуска демон, выполняющий роль сервера, по умолчанию начинает слушать порт 5000. При попытке подсоединиться на этот порт происходит аутентификация клиента на основе пароля, записанного в конфигурационном файле /usr/local/etc/ vtund.conf. Пароль применяется для аутентификации клиента всего лишь один раз на протяжении всей сессии. После успешной аутентификации сервер с помощью функции fork запускается еще один демон vtun, которому передается клиентское соединение. Новый демон будет существовать до тех пор, пока соединение не будет разорвано. В тоже время родительский демон продолжает ждать новых соединений. Это значит, что единственный демон может обслуживать множество одновременных подключений. Количество поддерживаемых соединений зависит только от мощности процессора и наличия оперативной памяти.

С помощью ключей командной строки можно указать другое местоположение конфигурационного файла. Это дает нам возможность запустить на одном хосте несколько демонов vtun, ожидающих соединений на разных портах. Каждый из демонов будет использовать собственные настройки. Соответственно, некоторые из них могут быть серверами, а другие клиентами. Это дает нам возможность развернуть множество не пересекающихся между собой VPN.

Давайте представим, что у нас есть филиал, магазин и офис, использующие адреса из пространства частных сетей. Необходимо эти подразделения соединить с помощью VPN. Для этих целей мы будем использовать реальные IP адреса, выданные нам провайдером из сети 80.80.20.0. Для соединения сетей нам понадобятся три компьютера. На каждом из них будет по три сетевых интерфейса. Два реальных и один виртуальный. Более подробно это показано в приведенной ниже таблице.

  Система имя машины внутренняя подсеть внутренний интерфейс внешний интерфейс виртуальный интерфейс tun
офис FreeBSD 4.5 vpn_office 192.168.30.0 192.168.30.251 ed0 80.80.20.2 ed1 192.168.0.2
филиал Debian Linux 3.0 vpn_filial 192.168.20.0 192.168.20.251 eth0 80.80.20.1 eth1 192.168.0.1
магазин Solaris 2.7 vpn_shop 192.168.40.0 192.168.40.251 le0 80.80.20.3 le1 192.168.0.3

Схема соединения наших сетей выглядит так :

Это значит что каждая из наших сетей может напрямую взаимодействовать с двумя другими. Ниже мы опишем установку vtun для каждой из операционных систем. Клоны BSD систем в отличии от Linux сразу, после установки по умолчанию имеют работающее и правильно настроеное устройство tun. Поэтому для FreeBSD нам не прийдется его создавать. По большей части установка одинакова для всех систем. Наиболее подробно будет обсуждаться процедура установки програмного обеспечения для FreeBSD, по причине наибольшей любви к это системе. В описаниях инсталяции для других систем внимание будет особо заостряться на отличиях. Это должно дать возможность полноценно и легко поставить и настроить vtun для любой и трех обсуждаемых систем.

Под FreeBSD установить vtun можно тремя способами с помощью пакетов либо через порты или ручным способом. Мне больше нравится третий вариант так как он дает гораздо большей возможностей для контроля над тем что происходит. Итак приступим к установке програмного обеспечения по третьему способу.

Берем исходник портированой библиотеки LZO. Если не удалось скачать, то берем дистрибутив здесь. Распаковываем и собираем в комплектации по умолчанию.

# tar zxvf lzo-1.08.tar.gz
# cd lzo-1.08
# ./configure
# make
# make check
# make test
# make install

Скачиваем исходный код vtun. Конфигурируем его c указанием где искать библиотеки и заголовочные файлы библиотеки lzo.

# tar zxvf vtun-2.5.tar.gz
# cd vtun
# ./configure --with-lzo-headers=/usr/local/include/ --with-lzo-lib=/usr/local/lib


Случается, что команда ./configure завершается с ошибкой. Вероятнее всего это означает, что система не смогла обнаружить библиотеку lzo. Если Вам не удастся самостоятельно избавиться от этой ошибки, значит прийдется отключить поддержку LZO. Vtun может работать и без библиотеки LZO. Для этого выполните команду:

# ./configure --disable-lzo

А затем, как положено, выполняем компиляцию и установку.

# make
# make install 

Если все прошло гладко, значит пришло время заняться конфигурационными файлами каждой из трех машины. В нашем случае машина vpn_office будет выполнять роль сервера, соответственно, vpn_filial и vpn_shop станут клиентами. Конфигурационный файл vtun для FreeBSD находится в директории /usr/local/etc/vtund.conf.

Давайте посмотрим, из чего состоит конфигурационный файл хоста vpn_office.

 

options { 
port 5000; 
ifconfig /sbin/ifconfig; 
route /sbin/route; 
} 


default    { 
compress lzo:9; 
speed 0; 
} 

filial {{                        # описываем клиента филиал
    pass secret;
    type tun;
    proto udp;
    encr yes;
    keepalive yes;



up {
ifconfig "%% 192.168.0.2 192.168.0.1 netmask 255.255.255.255 mtu 1450 up";
route "add -net 192.168.20.0/24 192.168.0.1";
};

down {
ifconfig "%% down";
route "delete 192.168.20.0";
};
}



shop {                      # описываем клиента магазин
    pass secret;         
    type tun;;             
    proto udp;            
    encr yes;            
    keepalive yes;      

up {
ifconfig "%% 192.168.0.2 192.168.0.3 netmask 255.255.255.255 mtu 1450 up";
route "add -net 192.168.40.0/24 192.168.0.3";
};

down {
ifconfig "%% down";
route "delete 192.168.40.0";
};
} 

Разделы options и default являются глобальными и остаются неизменными на протяжении всего конфигурационного файла. Это значит что параметры устанавленные внутри них влияют на все последующие блоки конфигурационного файла. Давайте подробно рассмотрим содержимое вышеназваных разделов.

port - Номер порта на котором демон будет ждать входящие соединения от клиентов.

ifconfig - Путь к программе ifconfig. Эта программа необходима для управления сетевыми интерфейсами.

route - Путь к программе route. Используется для работы с маршрутами прохождения сетевых пакетов.

compress - Опция управления сжатием передаваемых данных. Может принимать значения lzo, zlib и no. Этой опцией можно указать какую библотеку мы будем использовать для компрессии потока. Второе значение описывает степень сжатия. Чем больше число, тем сильнее будет сжатие. Но в то же время стоит помнить верхние значения сжатия, заставят демона потреблять гораздо больше ресурсов процессора . Максимальное значение сжатия равно 9. Если компиляцию с поддержкой lzo выполнить не удалось, то можно отключить сжатие установив значение compress no.

speed - Ограничение накладываемое на скорость передачи данных. Позволяет притормозить передачу данных особо жадных до трафика клиентов.

pass - Пароль используемый при аутентификации входящего соединения.

type - Тип соединения. Может принимать значения tun, ether, pipe, tty.

proto - Описывает протокол используемый для передачи данных. Может принимать значения udp и tcp.

encr - Включаем шифрование соединения. Может принимать значения no или yes.

keepalive - Пытаться восстанавливать соединение если оно будет прервано. Может принимать значения no или yes.

Секция up описывает действия, выполняемые при удачном соединении. Рассмотрим ее на примере клиента filial. Внутри мы описываем способ конфигурирования виртуального интерфейса с адресом 192.168.0.2. Затем привязываем этот интерфейс соединением типа точка точка к другому виртуальному интерфейсу 192.168.0.1. И завершаюшим штрихом настраиваем маршрутизацию для сети 192.168.20.0/24 через интерфейс с адресом 192.168.0.1.

Так же стоит рассмотреть секцию down, описываюшую действия, выполняемые при разрыве соединения. Нам необходимо удалить виртуальный интерфейс tun и разрушить маршрутизацию для сети 192.168.40.0/24.

Комбинацией опций type и proto можно создать разные виды туннелей:

Ethernet туннель

type ether ;

proto udp;

up {

ifconfig "%% xxxxxxxx";

};

Ethernet туннель позволяет работать с любым протоколом работающим поверх Ethernet. Например IP, IPX, Appletalk, DECnet. Компрессию можно производить используя LZO. Если LZO не работает то нужно установить proto tcp и compress zlib.

IP туннель

type tun;

proto udp;

up {

ifconfig "%% xxxxxxxx";

};

SLIP или PPP туннель

type tcp;

proto udp;

up {

ifconfig "%% xxxxxxxx";

};

pipe или TTY туннель

type tun;

proto tcp;

up {

program /xx/xx "xyyyyyyyyy";

};

TTY или pipe туннель может работать с любыми программами. Возможно применение сжатия, шифрования и даже ограничения пропускной способности. Для туннеля типа pipe лучше всего использовать протокол proto tcp. Можно конечно использовать и proto udp, но работать такой туннель будет не стабильно.

 


страницы 1, 2, 3