Date: 13 Nov 2002
From: Бешков Андрей <tigrisha@regata.ru>
Subject: Построение VPN на основе FreeBSD и vtun
Создаем VPN на основе FreeBSD и vtun
Бешков Андрей, tigrisha@regata.ru
В сети так много сайтов, объясняющих каждому, как престижно иметь в
своем распоряжении VPN. Но ни один из них не публикует детального
описания, как этого добиться. Побродив несколько дней по просторам
интернета, но так и не найдя нормального описания процесса
развертывания VPN, решил написать об этом сам.
Я буду использовать vtun, написаный Максимом Краснянским на основе
пакета VPPP. Вы можете спросить, почему именно vtun. Ведь можно было
использовать что-либо вроде PPP поверх SSH, IPSEC или GRE. Возможно, в
ближайшее время я напишу о работе с IPSEC или OpenVPN. Главным
достоинством vtun является простота в установке и настройке. Он
поддерживает разнообразные типы туннелей IP, Ethernet, PPP, SLIP. В
качестве туннеля можно использовать даже pipe. Для шифрования
используется OpenSSl. Доступны алгоритмы blowfish с ключом в 128 бит
или MD5 с ключом той же длины. Компрессия потока производится с
помощью библиотек LZO или zlib. Следует отметить, что zlib работает
только с tcp туннелями. Поддерживаются следующие операционные системы:
Linux, Solaris, FreeBSD, NetBSD, OpenBSD и другие BSD клоны. В
принципе, vtun должен работать на любой платформе, для которой есть
универсальный драйвер tun/tap. Устройство tun используется для
туннелирования IP фреймов, а tap для Ethernet фреймов. С помощью
tun/tap пользовательские программы получают возможность самостоятельно
обрабатывать IP пакеты. Для некоторых операционных систем необходимо
перекомпилировать ядро с поддержкой tun/tap устройств. Vtun работает
на основе клиент-серверной модели. Соответственно, для создания
туннеля на одном из хостов демон vtun должен быть запущен как сервер,
а на другом в роли клиента.
После запуска демон, выполняющий роль сервера, по умолчанию начинает
слушать порт 5000. Если между клиентом и сервером находится
брандмауэр, необходимо разрешить прохождение пакетов, адресованных на
порт 5000. При попытке подсоединиться на этот порт происходит
аутентификация клиента на основе пароля, записанного в
конфигурационном файле /usr/local/etc/vtund.conf. Затем с помощью
функции fork запускается еще один демон vtun, которому передается
клиентское соединение. Новый демон будет существовать до тех пор, пока
соединение не будет разорвано. В тоже время родительский демон
продолжает ждать новых соединений. Это значит, что единственный демон
может обслуживать множество одновременных подключений.
С помощью ключей командной строки можно указать другое местоположение
конфигурационного файла. Это дает нам возможность запустить на одном
хосте несколько демонов vtun, ожидающих соединений на разных портах.
Каждый из этих демонов будет использовать собственные настройки.
Соответственно, некоторые из этих демонов могут быть серверами, а
другие клиентами.
Давайте представим, что у нас есть филиал, магазин и офис,
использующие адреса из пространства частных сетей. Необходимо эти
подразделения соединить с помощью VPN. Для этих целей мы будем
использовать реальные ip адреса, выданные нам провайдером из сети
80.80.20.0. Для соединения сетей нам понадобятся три компьютера. На
каждом из них будет по три сетевых интерфейса. Более подробно это
показано в приведенной ниже таблице.
имя машины внутренняя подсеть внутренний интерфейс внешний интерфейс
виртуальный интерфейс tun
офис vpn_office 192.168.30.0 192.168.30.251 ed0 80.80.20.2 ed1
192.168.0.2
филиал vpn_filial 192.168.20.0 192.168.20.251 ed0 80.80.20.1 xl0
192.168.0.1
магазин vpn_shop 192.168.40.0 192.168.40.251 wb0 80.80.20.3 fxp0
192.168.0.3
А пока берем исходник библиотеки LZO.
http://www.freebsd.org/cgi/pds.cgi?ports/archivers/lzo
Если не удалось скачать, то берем дистрибутив здесь.
http://www.oberhumer.com/opensource/lzo/
Распаковываем и собираем.
# tar zxvf lzo-1.08.tar.gz
# cd lzo-1.08
# ./configure
# make
# make check
# make test
# make install
Скачиваем vtun http://vtun.sourceforge.net/download.html
Конфигурируем его 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.
Если Вам не удастся самостоятельно избавиться от этой ошибки,
выполните команду:
# ./configure --disable-lzo
А затем, как положено, выполняем компиляцию и установку.
# make
# make install
Повторяем эти действия на каждой из трех машин. Если все прошло
гладко, значит пришло время заняться конфигурированием каждой машины.
В нашем случае машина vpn_office будет выполнять роль сервера,
соответственно, vpn_filial и vpn_shop станут клиентами.
Конфигурационный файл vtun находится в директории
/usr/local/etc/vtund.conf.
Давайте посмотрим, из чего состоит конфигурационный файл хоста
vpn_office.
options {
port 5000; # номер порта, используемого для соединения
с клиентами
ifconfig /sbin/ifconfig; # путь к программе ifconfig
route /sbin/route; # путь к программе route
}
default {
compress lzo:9; # если не удалось включить поддержку lzo, то пар
аметр должен принять значение compress no;
speed 0; # ограничения скорости соединения нет
}
# настройки, определенные в блоках options и default, относятся ко всем
# остальным блокам
filial {{ # описываем клиента филиал
pass secret; # пароль соединения - слово secret
type tun; # тип IP туннеля tun
proto udp; # используется протокол UDP
encr yes; # включить шифрование
keepalive yes; # постоянно поддерживать соединение
# секция up описывает действия, выполняемые при удачном соединении
# конфигурируем виртуальный интерфейс с адресом 192.168.0.2
# и привязываем его к другому виртуальному интерфейсу 192.168.0.1
# настраиваем маршрутизацию для сети 192.168.20.0/24 через интерфейс с адресом
192.168.0.1
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 описывает действия, выполняемые при разрыве соединения
# удаляем виртуальный интерфейс tun
# разрушаем маршрутизацию для сети 192.168.20.0/24
down {
ifconfig "%% down";
route "delete 192.168.20.0";
};
}
shop { # описываем клиента магазин
pass secret; # пароль соединения - слово secret
type tun;; # тип IP туннеля
proto udp; # используется протокол UDP
encr yes; # включить шифрование
keepalive yes; # постоянно поддерживать соединение
# конфигурируем виртуальный интерфейс с адресом 192.168.0.2
# и привязываем его к другому виртуальному интерфейсу 192.168.0.3
# настраиваем маршрутизацию для сети 192.168.40.0/24 через интерфейс с адресом
192.168.0.3
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";
};
# описываем действия, выполняемые при разрыве соединения
# удаляем виртуальный интерфейс tun
# разрушаем маршрутизацию для сети 192.168.40.0/24
down {
ifconfig "%% down";
route "delete 192.168.40.0";
};
}
А вот это мы запишем в файл конфигурации хоста vpn_shop.
options {
port 5000;
ifconfig /sbin/ifconfig;
route /sbin/route;
}
default {
compress lzo:9;
speed 0;
}
shop {
pass secret;
type tun;
proto udp;
encr yes;
keepalive yes;
up {
ifconfig "%% 192.168.0.3 192.168.0.2 netmask 255.255.255.255 mtu 1450 up";
route "add -net 192.168.30.0/24 192.168.0.2";
};
down {
ifconfig "%% down";
route "delete 192.168.30.0";
};
}
Ну и наконец, конфигурация хоста vpn_filial.
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.1 192.168.0.2 netmask 255.255.255.255 mtu 1450 up";
route "add -net 192.168.30.0/24 192.168.0.2";
};
down {
ifconfig "%% down";
route "delete 192.168.30.0";
};
}
Скачать конфигурационные файлы можно здесь http://onix.by.ru/files/vtun-cfg.tar.gz
В связи с тем, что в файлах vtund.conf находится пароль соединения,
доступ к ним должен иметь только пользователь root. После всех этих
манипуляций можно запускать vtun. На машине vpn_office запускаем демон
в режиме сервера.
vpn_office# vtund -s
На другой консоли смотрим на сообщения об ошибках.
vpn_office# tail -f /var/log/messages
Если ошибок не появилось, значит все у нас хорошо. Соответственно, на
хостах vpn_shop и vpn_filial запускаем демоны в режиме клиента.
vpn_shop# vtund -p shop 80.80.20.2
vpn_filial# vtund -p filial 80.80.20.2
Снова ждем ошибок. Не дождавшись, смотрим, какие сетевые интерфейсы у
нас подняты на каждой из машин. Больше всего нас интересуют интерфейсы
vtun0 и vtun1. У Вас должны получиться примерно такие данные.
vpn_office# ifconfig -u
Теперь можно попробовать, как работает наша VPN. Выполним команду ping
на хостах vpn_filial и vpn_shop.
vpn_filial# ping 192.168.30.251
PING 192.168.30.251 (192.168.30.251): 56 data bytes
64 bytes from 192.168.30.251: icmp_seq=0 ttl=64 time=5.788 ms
64 bytes from 192.168.30.251: icmp_seq=1 ttl=64 time=5.724 ms
64 bytes from 192.168.30.251: icmp_seq=2 ttl=64 time=5.683 ms
64 bytes from 192.168.30.251: icmp_seq=3 ttl=64 time=5.685 ms
--- 192.168.30.251 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 5.683/5.720/5.788/0.043 ms
vpn_shop# ping 192.168.30.251
PING 192.168.30.251 (192.168.30.251): 56 data bytes
64 bytes from 192.168.30.251: icmp_seq=0 ttl=64 time=6.092 ms
64 bytes from 192.168.30.251: icmp_seq=1 ttl=64 time=5.785 ms
64 bytes from 192.168.30.251: icmp_seq=2 ttl=64 time=5.851 ms
64 bytes from 192.168.30.251: icmp_seq=3 ttl=64 time=5.826 ms
--- 192.168.30.251 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 5.785/5.888/6.092/0.120 ms
Итак, мы создали шифрованный туннель между тремя частными сетями.
Теперь каждая машина, находящаяся в любой из этих сетей, сможет
общаться с любой машиной из другой сети. Главное - не забыть
установить на всех машинах сети правильный адрес шлюза по умолчанию.
Вот теперь можно отдохнуть.
407 Прочтений • [Построение VPN на основе FreeBSD и vtun (vlan freebsd vpn security)] [08.05.2012] [Комментариев: 0]