2004 г.
Виртуальный туннель на базе Linux
Сергей Яремчук, Издательский Дом "КОМИЗДАТ"
Есть разные способы организации виртуальной частной сети (VPN). И вот один из них - бесплатный и с простой настройкой
Все течет, все меняется. Фирмочка, на заре своей деятельности занимавшая комнатушку-полукладовку, расползается на пол-этажа - а еще через несколько лет это уже компания со штаб-квартирой на два здания и с филиалами по всей стране.
Расширение затрагивает не только рабочие площади, но и компьютерные сети. Первым признаком роста компании обычно является появление сервера, так как администрировать старую одноранговую сеть при возросшем количестве пользователей становится все труднее. Но вскоре и он перестает справляться: получить данные хотят все, а сервер-то один.
Сеть начинает дробиться, а пользователи - жаловаться на неудобства. Они привыкли, что сервер находится в одной с ними сети и что доступ к нему можно получить двумя щелчками мыши. Теперь же для получения нужной информации приходится продираться сквозь множество сетей.
Вдобавок возникают проблемы с защитой информации. Злоумышленнику достаточно установить компьютер где-то в разрыве между сетями, чтобы спокойно "отлавливать" всю проходящую информацию. Единственный для сисадмина выход из сложившейся ситуации - соединить всё в одну единую защищенную сеть VPN (Virtual Private Network).
Существует несколько свободных проектов, позволяющих создать такую сеть: IPsec, FreeS/WAN, CIPE и просто РРР поверх SSH. Они позволяют добиться желаемого результата - но разобраться с настройкой нелегко.
В качестве альтернативы можно использовать дистрибутивы Linux, уже имеющие в своем составе средства создания виртуальных частных сетей: Smoothwall или Astaro Security Linux. Эти системы применимы и в качестве роутера - но обычно только в том случае, когда вся сеть собирается "с нуля".
"Виртуальный туннель" VTun
Другое дело - "виртуальный туннель" VTun. Буквально через 10 минут после того, как в строке браузера был набран адрес этого проекта, я уже знал, что он подходит на все сто. VTun предоставляет самый простой из всех известных мне способов создания виртуального туннеля в сетях TCP/IP.
Главными достоинствами VTun являются отличная документация, простота установки и конфигурирования, гибкость настройки. VTun поддерживает различные типы туннелей: IP, ppp, SLIP, Ethernet, TTY и pipe. Потоки кодируются 128-битным ключом при помощи OpenSSL по алгоритму BlowFish. Для генерации ключа используется алгоритм MD5.
В качестве базового (транспортного) протокола может использоваться не только более надежный TCP, но и - для близких подсетей - более быстрый UDP. Для ускорения передачи данных возможна (но не обязательна) компрессия потока при помощи библиотек zlib и lzo. Библиотека zlib обеспечивает эффективную компрессию для TCP. Более быстрая (и рекомендуемая разработчиками) lzo поддерживает оба протокола (UDP и TCP).
Кроме того, VTun позволяет ограничить входную и выходную скорость туннелей во избежание перегрузки сервера при наличии большого количества клиентов.
Официально проект поддерживает все Unix-подобные операционные системы: Linux (RedHat, Debian, Corel и пр.), FreeBSD и другие аналоги BSD (FreeBSD 3.x, 4.x, OpenBSD, Apple OS/X и пр.), а также Solaris 2.6, 7.0, 8.0.
Система работает через универсальные драйверы tun и tap. Tun применяется при туннелировании IP-пакетов, а tap (он же ethertap) - при туннелировании фреймов Ethernet. Драйвер TUN/TAP позволяет пользовательским программам самостоятельно обрабатывать соответствующие пакеты. Его можно рассматривать как виртуальное устройство PPP или Ethernet, которое принимает пакеты не от физических носителей, а от пользовательской программы, и не отправляет пакеты через физические носители, а записывает их в программу пользователя. Более подробная информация о работе этого устройства есть в файлах документации исходников ядра /usr/src/linux/Documentation/networking/tuntap.txt и ethertap.txt. Там же находятся примеры применения этих устройств.
Настройка драйверов
В настоящее время драйверы TUN/TAP реализованы для Linux, Solaris и FreeBSD, но работают они и под другими BSD-системами. Перед началом работы желательно убедиться в наличии необходимых устройств /dev/net/tun или /dev/tap#. У меня в RedHat и FreeBSD устройство tun было создано при установке:
[root@grinder /]# ls -al /dev/net/tun
crw-r--r-- 1 root root 10, 2003Июн 23 11:26 /dev/net/tun
Если почему-либо этого не произошло, можно попробовать создать его самостоятельно:
[root@grinder /]# mkdir /dev/net (если еще нет)
[root@grinder /]# mknod /dev/net/tun c 10 200
И задать права доступа:
[root@grinder /]# chmod 0700 /dev/net/tun
Теперь для автоматической загрузки соответствующего модуля ядра добавляем в файл /etc/modules.conf такие строки:
alias char-major-10-200 tun
И обновляем зависимости модулей:
# /sbin/depmod -a
Или вручную:
[root@grinder /]# /sbin/modprobe tun
Проверяем работу системы:
[root@grinder /]# /sbin/lsmod
Module Size Used by Not tainted
tun 5696 0 (unused)
Аналогично для TAP:
[root@grinder /]# mknod /dev/tap0 c 36 16
[root@grinder /]# mknod /dev/tap1 c 36 17
Теперь устройство готово к работе. Если что-то не получилось, то, скорее всего, придется заново переконфигурировать ядро.
Для поддержки tap необходимо включить следующие строки:
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
#
# Network device support
#
CONFIG_ETHERTAP=m
А для tun - такую строку:
CONFIG_TUN=m
Архитектура VTun
VTun работает по принципу клиент-серверной архитектуры. На одном из хостов программа запускается как сервер, а на остальных - как клиент. Количество клиентов ограничивается только мощностью компьютера, исполняющего роль сервера.
При использовании firewall необходимо разрешить прохождение пакета на порт 5000, по умолчанию используемый VPN-сервером для прослушивания сети на предмет наличия подключений. При установке соединения клиент пытается соединиться с этим портом. Сервер производит аутентификацию на основе пароля, записанного в файле /usr/local/etc/vtun.conf. Если все проходит нормально, сервер вызовом fork () запускает еще один демон vtun (который и будет в дальнейшем работать с клиентом) а сам возвращается в исходное состояние и ждет дальнейших подключений.
Но это еще не все. Возможен одновременный запуск на одном компьютере нескольких демонов vtun, каждый из которых считывает собственный конфигурационный файл и работает в режиме сервера или клиента. Таким образом, создается несколько сетей vtun. Единственная проблема состоит в том, что при трансляции сетевого адреса (NAT) использовать VPN-тунель не удастся, так как последний подтверждает подлинность пакетов на основании сквозного шифрования и проверки контрольной суммы. NAT же перезаписывает содержание проходящих пакетов, поэтому они не пройдут такую проверку.
Установка VTun
Кроме собственно дистрибутива VTun, для установки понадобятся также пакет OpenSSL и библиотеки zlib и lzo. Впрочем, без последних можно обойтись - но тогда поток не будет сжиматься. В дистрибутивах FreeBSD или OpenBSD все это устанавливается отдельно. В ОС RedHat 9, с которой мне пришлось работать, дело обстоит так:
# rpm -qa | grep openssl
openssl-0.9.7a-2
openssl-devel-0.9.7a-2
# rpm -qa | grep zlib
zlib-devel-1.1.4-8
zlib-1.1.4-8
[root@grinder sergej]# rpm -qa | grep lzo
Как видим, все готово, кроме библиотек lzo. Если чего-то не хватает, то последние версии zlib можно найти по адресу, lzo - на сайте, а OpenSSL - на ее официальном сайте. Пользователям же систем BSD удобнее найти все это в системе портов.
После того как все необходимые программы установлены, приступаем к установке VTun:
# tar xvfz vtun-2.6.tar.gz
# cd vtun
#./configure
Иногда, если программа при конфигурировании не нашла некоторые файлы, она выдает примерно следующее сообщение об ошибке:
checking for ZLIB Library and Header files...
checking for deflate in -lz... yes
checking for LZO Library and Header files...
checking for lzo1x.h... no
configure: error: headers not found.
Другими словами, программа не нашла заголовочные файлы библиотек LZO. Если эти библиотеки установлены, нужно просто указать место их расположения вручную при помощи опций --with-lzo-headers=DIR и --with-lzo-lib=DIR:
#./configure with-lzo-headers=/usr/local/include/
--with-lzo-lib=/usr/local/lib/
Если сообщение об ошибке продолжает появляться или если библиотека не установлена, то для продолжения работы без поддержки библиотеки LZO используем ключ --disable-lzo, для библиотек ZLIB - --disable-zlib, для отключения шифрования - --disable-ssl. После этого выполняем компиляцию и установку программы, как обычно:
# make
# make install
Если все прошло без ошибок, то перед запуском необходимо внести изменения в конфигурационные файлы серверов и клиентов. Файл /usr/local/etc/vtun.conf, созданный при установке, хорошо комментирован и содержит готовые шаблоны для работы VTun как в качестве сервера, так и клиента. Наша задача состоит в том, чтобы убрать лишнее и подставить нужные для работы параметры.
Типичный файл сервера выглядит так:
options {
port 5000;
syslog daemon;
# В этом блоке описываются пути
# к используемым программам
ppp /usr/sbin/pppd;
ifconfig /sbin/ifconfig;
route /sbin/route;
firewall /sbin/ipchains;
ip /sbin/ip;
}
default {
compress lzo:9;
speed 0;
}
Разделы options и default являются общими. Их содержимое распространяется на все последующие секции. Однако при дальнейшей настройке значение опций из раздела default можно переопределить для каждого клиента. Ниже описывается настройка отдельных клиентов. Обратите внимание, что названия всех опций можно сократить до 4-х знаков.
mashine1 {
passwd Ma;;*TU;
type tun;
proto udp;
encrypt yes;
keepalive yes;
up {
ifconfig "%% 192.168.0.1 pointopoint 192.168.0.3
mtu 1450";
};
}
mashine2 {
passwd Ma&^TU;
type ether;
device tap0;
proto udp;
compress zlib:5;
speed 256:128;
encrypt yes;
stat yes;
keepalive yes;
up {
ifconfig "%% 192.168.0.2 192.168.0.1
netmask 255.255.255.0";
route "add -net 192.168.0.0 netmask 255.255.255.0";
firewall "-A forward -s 192.168.0.0/24 -d 0.0.0.0/0
-j MASQ";
};
down {
ifconfig "%% down";
route "delete 192.168.0.0";
firewall "-D forward -s 192.168.0.0/24 -d 0.0.0.0/0
-j MASQ";
};
}
Возможные значения опций при настройке Vtun |
Опция |
Описание |
Секция options |
type |
Способ запуска демона vtund: как самостоятельной программы (по умолчанию) или через inetd. Возможные значения - stand, inetd |
рort |
Номер порта, который прослушивает сервер в ожидании входящих сообщений |
рersist |
Возможные значения - yes, no. При значении yes клиент будет повторно пытаться соединиться с сервером в случае обрыва. Игнорируется сервером |
timeout |
Время ожидания для клиента. Игнорируется сервером |
Секция default и секции клиентов |
рassword |
Пароль для соединения сервера с клиентом. Одинаков для файлов настройки на обоих компьютерах. Поскольку пароль хранится в открытом виде, доступ к содержащему его файлу должен иметь только root |
type |
Тип используемого туннеля. Игнорируется клиентом. Возможные значения: tun (IP tunnel, пo PPP, Ether), ether (Ethernet), tty (serial tunnel, по PPP, SLIP, используется по умолчанию) и pipe (pipe tunnel) |
device |
Используемое сетевое устройство. Обычно vtund правильно распознает устройство автоматически, так что эту опцию можно не трогать |
proto |
Возможные значения: tcp, udp. Используемый протокол. По умолчанию - ТСР. UDP может применяться только для ether и tun. Игнорируется клиентом |
сompress |
Метод и степень компрессии. Возможные значения - no (без компрессии), yes (компрессия по умолчанию), zlib и lzo (если система откомпилирована с поддержкой этих библиотек). Через двоеточие указывается степень компрессии от 1 до 9. Чем больше число, тем выше степень компрессии. При этом нужно помнить, что более высокие степени сжатия потребляют больше системных ресурсов. Игнорируется клиентом |
encrypt |
Включение/выключение шифрования. Возможные значения - yes, no. Игнорируется клиентом |
keepalive |
Возможные значения - yes, no. Определяет, нужно ли пытаться восстановить соединение в случае обрыва. Игнорируется клиентом |
stat |
Включение/выключение режима ведения статистики. Возможные значения - yes, no. Если эта опция включена, то сервер каждые 5 минут заносит статистические данные в файл /var/log/vtund/host_X |
speed |
Ограничение скорости для особо "прожорливых" клиентов. Параметры задаются в Кб/с. Допустимыми значениями являются 8, 16, 32, 64, 128, 256 и т.д. По умолчанию параметр равен 0, что означает максимально возможную скорость. Можно задать скорость в форме in:out, где in - скорость передачи данных клиенту, out - от клиента. Одна цифра означает одинаковую скорость в обоих направлениях. Игнорируется клиентом |
srcaddr |
Жесткая связь с абсолютным адресом и портом |
Multi |
Управление параллельными соединениями. Значения yes и allow разрешают параллельные соединения, no и deny - запрещают, killold разрешает новое соединение, запрещая старые. Игнорируется клиентом |
up, down |
Указывают на инструкции, которые выполняются при удачном соединении и разрыве связи. Используются, чтобы инициализировать протоколы, устройства, маршрутизацию и firewall. Кроме запускаемых программ, могут задаваться шаблоны и аргумент wait, позволяющий vtund дождаться завершения работы программы. Шаблоны могут быть следующими:
- ' (одиночная кавычка) - группа аргументов;
- \ (обратная косая черта) - символ escape;
- %d - устройство TUN или TAP или имя TTY-порта;
- %% - то же, что и %d;
- %A - локальный IP-адрес;
- %P - локальный порт TCP или UDP;
- %a - удаленный IP-адрес;
- %p - удаленный порт TCP или UDP
|
Большинство параметров обычно настраивается автоматически, прибегать к ручной настройке придется только в крайнем случае. Рассмотрим пример файла для одного из клиентских компьютеров. В нем убраны лишние параметры из секции сервера и изменены значения IP-адресов на поднимаемых интерфейсах (Адреса интерфейсов, используемых в примере, приведены в таблице).
Адреса интерфейсов, используемых в примере |
Компьютер |
Внешний IP |
IP внутренней сети |
Виртуальный интерфейс |
Сервер |
1.2.3.4 |
192.168.10.0 |
192.168.0.1 |
Клиент mashine2 |
10.20.30.40 |
192.168.20.0 |
192.168.0.2 |
options {
port 5000;
timeout 60;
ifconfig /sbin/ifconfig;
route /sbin/route;
firewall /sbin/ipchains;
}
mashine2 {
pass Ma&^TU;
type ether;
up {
ifconfig "%% 192.168.0.2 netmask 255.255.255.0";
};
down {
ifconfig "%% down";
};
}
Обратите внимание: синтаксис параметров ifconfig, firewall и общая настройка сетевых интерфейсов в приведенных примерах будут отличаться для различных операционных систем.
После того как все файлы готовы, запускаем на компьютере, исполняющем роль сервера, демон vtund в режиме сервера:
Server# vtund -s
На компьютерах-клиентах запускаем vtund с указанием имени хоста, фигурирующего в конфигурационном файле, и IP-адрес или имя сервера:
mashine2# vtund -р mashine2 1.2.3.4
За ошибками при этом наблюдаем в другой консоли:
# tail -f /var/log/message
Если ничего подозрительного не появилось, создание VPN-сети можно считать законченным.
Последняя настройка
Чтобы еще раз убедиться в правильности установки, можно посмотреть при помощи команды ifconfig -a, какие интерфейсы установлены на компьютерах и какие значения параметров им присвоены. Если имеются устройства tun# и tap# с указанными в файле параметрами - значит, все в порядке.
Способ шифрования легко определить при помощи обычной команды ping. Необходимо выполнить эту команду в направлении защищенной и незащищенной сети и "отловить" передаваемые пакеты при помощи tcpdump. По умолчанию ping передает одни и те же данные при каждом вызове, поэтому, если полученные пакеты отличаются, значит, данные шифруются.
При такой конфигурации все клиенты имеют доступ к сети сервера, но не друг к другу. Если есть необходимость в туннеле между компьютерами-клиентами, то один из них настраивается как сервер, а на втором запускается новый клиент. Данные нового соединения могут быть получены как из отдельного файла, который указывается при запуске опцией -f, так и из основного файла. При этом необходимо присвоить новому соединению отдельное имя со своими параметрами, с которым затем и будет запускаться клиент, а сервер будет слушать его попытки соединения.
Единственное, что пока что огорчает, так это отсутствие реализации VTun хотя бы для Windows-клиентов. А в остальном настроить VTun, зная параметры действующих сетей и опции утилит настройки сетевых соединений, обычно не представляет сложности.