СЕРГЕЙ ЯРЕМЧУК, фрилансер. Автор более 800 статей и шести книг. С «СА» с первого номера. Интересы: сетевые технологии, защита информации, свободные ОС
Строим виртуальную сеть с tinc
Когда зарождались протоколы, используемые в сегодняшнем Интернете, никто и не думал о том, что спустя некоторое время к нему без проблем смогут подключаться миллионы пользователей, а компании будут вести свой бизнес с его помощью. Со временем начали всплывать просчеты создателей и постепенно стали появляться проекты, основная цель которых – минимизировать допущенные ошибки. Сегодня после антивирусов и межсетевых экранов наиболее популярным и востребованным средством являются виртуальные частные сети (Virtual Private Network – VPN), которые, несмотря на первоначальную возню с установкой и отладкой, все-таки делают жизнь админа спокойнее и упрощают настройку многих сетевых сервисов.
Хотя на рынке присутствует большое количество коммерческих продуктов, имеющих в том числе и аппаратные решения, большой интерес вызывают именно свободные проекты. Причин много. Так, не сразу становится ясно, подойдет ли конкретной организации схема сети с VPN, а вкладывать деньги эксперимента ради вряд ли кто рискнет. С другой стороны, очень часто переход сети на VPN является личной инициативой администратора, которому надоели постоянно возникающие проблемы. Да и отношение к бесплатному софту как к некачественному, второсортному постепенно проходит. Большая часть свободных утилит для создания VPN доступна только под UNIX, и если администратор до этого не работал с такими системами, то у него не сразу получится разобраться с настройкой софта. Также не все проекты имеют реализации для различных операционных систем. Выход один – нужен удобный, простой и в то же время функциональный инструмент. Основной идеей проекта tinc (сокращение от There Is No Cabal) как раз и является простота настройки VPN-сети.
Что может tinc?
Особенностью tinc является использование одного исполняемого файла – демона tincd, который является одновременно и сервером, и клиентом. Какие преимущества это дает? В tinc подключить новый компьютер в уже работающую виртуальную сеть довольно легко, для этого необходимо добавить всего лишь один файл, без запуска нового демона или еще одного виртуального сетевого устройства. Удаленные компьютеры могут обмениваться информацией между собой, по прямому каналу, а не через основной сервер, как это реализовано в том же vtun. В vtun для обмена напрямую придется создавать еще один туннель, что при большом количестве клиентов затрудняет настройку. Хотя возможен запуск и нескольких экземпляров tinc на одном компьютере, что позволяет создавать несколько виртуальных сетей. При этом демон самостоятельно осуществляет маршрутизацию и направляет пакеты по назначению кратчайшим путем.
Процесс обработки информации происходит в user space и не требует обязательной перекомпиляции ядра. Принято считать, что такие реализации работают медленнее и нагружают систему больше, но я, признаюсь, дотошных тестов не видел, а работа VPN зависит от многих обстоятельств, среди которых и используемое оборудование, канал, общая нагрузка на сеть, поэтому вряд ли можно говорить о полном и безоговорочном преимуществе VPN-систем, встроенных в ядро, все зависит от конкретной обстановки. Но вот устанавливать user space-реализации проще, хотя после включения IPSec в ядра серии 2.6 некоторые вопросы по настройке отпали сами по себе.
Также tinc способен создавать мост для Ethernet-сегментов и соединять несколько сетей в одну, позволяя, например, использовать программы, нормально работающие только по LAN. На сегодняшний день поддерживаются операционные системы Linux, FreeBSD, OpenBSD, NetBSD, MacOS/X, Solaris, Windows 2000 и XP.
На момент написания статьи последней версией была 1.0.3, которую и рекомендуется использовать. В более ранних версиях были обнаружены серьезные проблемы с безопасностью, заключающиеся в отсутствии порядковых номеров и опознавательного кода сообщения для каждого пакета, что позволяло производить атаку на отказ в обслуживании, повторно запуская старые пакеты. Устранение этого недостатка привело к тому, что более новые версии программы несовместимы со старыми, которые к тому же имеют реализацию не для всех платформ. Хотя криптография на месте не стоит и на сегодняшний день считается, что использование 32 бит для порядковых номеров и 4 бит, используемых по умолчанию для кода аутентификации сообщения (message authentication code – MAC), является уже недостаточным. Поэтому в конфигурации по умолчанию tinc менее защищен чем TLS или IPsec, а полностью переработать tinc разработчики планируют к версии 2.0. Я раньше думал, что самым простым в настройке и использовании является vtun (http://vtun.sourceforge.net/), но после знакомства с героем сегодняшней статьи свое мнение пересмотрел.
Установка tinc
Разработчиками взят курс на упрощение процесса установки и настройки систем на базе tinc, да и документации на сайте хотя и сравнительно немного, но в ней отражены практически все основные вопросы, которые могут возникнуть при настройке tinc, в том числе и особенности установки в различных операционных системах. Поэтому рассказывать обо всех возможных вариантах смысла, думаю, нет. Остановлюсь на установке VPN между двумя системами, для которых процесс настройки диаметрально отличается. Одна построена на базе Linux, в качестве платформы для второй выбрана Windows XP. При этом в BSD и Solaris процесс настройки совсем немного отличается от Linux и, зная особенности работы сетевых сервисов в этих системах и уловив смысл производимых действий, установить tinc в них труда особого не составит.
Особенности установки tinc в Linux
Система tinc использует для работы универсальные драйверы tun и tap. Tun применяется при туннелировании IP-пакетов, а tap, он же ethertap, – при туннелировании фреймов Ethernet. Драйвер TUN/TAP позволяет пользовательским программам самостоятельно обрабатывать соответствующие пакеты. Поэтому эти устройства должны быть включены при конфигурировании ядра. В большинстве дистрибутивов это уже сделано, но если команды:
# ls -al /dev/net/tun
и
# ls -al /dev/tap*
ничего не выводят, то либо придется их создать самому, либо поручить это системе, прописав в файле /etc/modules.conf строку (для ядер 2.4.0 и выше):
alias char-major-10-200 tun
После обновления зависимостей модуля ядра командой:
# /sbin/depmod –a
вы должны увидеть необходимые устройства. Более подробно это все описано в файлах tuntap.txt и ethertap.txt, которые находятся в каталоге /usr/src/linux/Documentation/networking (при установленных исходниках ядра). Иначе придется ядро все-таки пересобирать, включив следующие строки.
Code maturity level options
[*] Prompt for development and/or incomplete code/drivers
Network device support
Universal tun/tap device driver support
Для шифрования трафика используется OpenSSL (http://www.openssl.org/), и для сжатия потока в системе должны быть установлены библиотеки zlib (http://www.gzip.org/zlib) и lzo (http://www.oberhumer.com/opensource/lzo). При этом zlib является опциональной и используется для сжатия UDP-пакетов, а вот наличие lzo в системе обязательно, иначе получите ошибку при конфигурировании. В ближайшем будущем планируется избавить пользователя от поиска программ для удовлетворения всех зависимостей, собрав все необходимое в единый архив.
После того как все библиотеки установлены, берем с сайта проекта http://www.tinc-vpn.org/ бинарные пакеты, скомпилированные под используемую операционную систему, либо исходные тексты. Размер архивов не превышает 600 Кб. Установка из исходников обычно проблем не вызывает и заключается в стандартном ./configure, make и make install. После чего в /usr/local/bin появится всего один бинарный файл tincd.
Установка под Windows
Демон tinc в этой операционной системе использует драйвер TAP-Win32, который можно взять с сайта OpenVPN (http://openvpn.sourceforge.net/). Этот драйвер в настоящее время включен в последнюю версию пакета 1.0.3 для Windows и устанавливается вместе с tinc (рис. 1), поэтому отдельно устанавливать его уже не надо. Также для запуска демона понадобится наличие Cygwin (http://www.cygwin.com/) или MinGW (http://www.mingw.org/). Со второй работать не пробовал, а вот при работе через Cygwin потребуется только cygwin.dll.
Рисунок 1
После установки всех необходимых библиотек и tinc, заходим в каталог C:Program Files inc ap-win32 и запускаем файл addtap.bat. Теперь в меню «Сетевые подключения» должно появиться новое соединение, которому можно присвоить более осмысленное имя.
Рисунок 2
Выбираем «Свойства –> Протокол Интернета TCP/IP» и редактируем его параметры, в которых указываем адрес и сетевую маску компьютера в виртуальной сети.
Рисунок 3
В последней версии tinc сам прописывает себя в автоматически запускаемые сервисы после первого успешного запуска, но на всякий случай проверьте его наличие в ме-ню «Настройка –> Панель Управления –> Администрирование –> Службы».
Рисунок 4
Конфигурационные файлы tinc
Tinc во время своей работы использует два вида конфигурационных файлов, плюс в двух скриптах записываются системно-зависимые параметры, необходимые для поднятия и остановки сетевых VPN-интерфейсов (для UNIX-систем), и в отдельном файле (rsa_key.priv) находятся закрытые ключи сервера. В подкаталоге doc-архива с исходными текстами программы находится архив sample-config.tar.gz, содержащий примеры конфигурационных файлов. По умолчанию демон tincd будет искать свои конфигурационные файлы в каталоге /usr/local/etc/tinc/, если вы решили положить их, например, в /etc/tinc/, то при запуске необходимо будет дополнительно использовать опцию --config=/etc/tinc/.
Для одной виртуальной сети такого расположения файлов вполне достаточно, но если планируется организация на компьютере нескольких виртуальных сетей, то для каждой необходимо будет создать подкаталог, выбрав в качестве его имени название VPN-сети. Например, для виртуальной сети vpn_net создаем каталог /usr/local/etc/tinc/vpn_net/. Теперь при запуске демона tincd при помощи опции -n vpn_net указываем название нужной виртуальной сети, в логах информация о ней будет отображаться как tinc.vpn_net. В созданном подкаталоге должны обязательно лежать два скрипта tinc-up и tinc-down, в которых описываются команды для сетевого интерфейса. Для Linux эти файлы выглядят так.
Файл tinc-up
#!/bin/sh
ifconfig $INTERFACE 192.168.10.1 netmask 255.255.0.0
Файл tinc-down
#!/bin/sh
ifconfig $INTERFACE down
Естественно, что для других UNIX-подобных систем эти строки будут немного другими, подробности смотрите в tinc Manual. Раздел 7. «Platform specific information». Для Windows эти файлы не требуются.
Для работы в UNIX-подобных системах желательно наличие в файле /etc/services следующих строк.
tinc 655/tcp TINC
tinc 655/udp TINC
И в /etc/networks должно быть указано символическое имя будущей VPN.
vpn_net 192.168.10.0
Как говорилось выше, tincd является одновременно как клиентом, так и сервером. За счет этого существенно упрощена настройка системы, а также дальнейшее наращивание сети в любом направлении.
Для работы серверной части демона используется файл tinc.conf, в нем клиенты, с которыми должен соединяться сервер, определяются параметром ConnectTo и более подробно описываются отдельным файлом, лежащим тут же в подкаталоге hosts и имеющим такое же название, как и в опции ConnectTo. При этом на противоположной стороне можно прописать встречное соединение, указав параметр ConnectTo, демоны на этих системах не передерутся за то, кто из них самый главный, но таким образом можно спокойно наращивать в дальнейшем виртуальную сеть, не заботясь о конфликтах. Все параметры файла tinc.conf приведены в таблице 1. Использовать все приведенные параметры нет необходимости, в самом общем случае файл будет выглядеть так:
# Sample tinc configuration file
Name = office
ConnectTo = home
ConnectTo = stock-room
Device = /dev/net/tun
То есть демон, носящий имя office, будет пытаться соединиться с двумя компьютерами home и stock-room, описание которых находится в одноименных файлах, лежащих в подкаталоге hosts. В Windows вместо Device удобнее использовать параметр Interface, т.е. файл будет выглядеть так:
Name = home
ConnectTo = office
ConnectTo = stock-room
Interface = VPN
В случае если VPN-интерфейсов два, нужно написать Interface = VPN2 и назвать его так в «Сетевых подключениях».
Таблица 1. Параметры, которые могут быть использованы в файле tinc.conf
Параметр
|
Возможное значение (по умолчанию)
|
Описание
|
AddressFamily
|
ipv4|ipv6|any (any)
|
Определяет версию протокола, используемую на входящих и исходящих сетевых интерфейсах
|
BindToAddress
|
IP-адрес
|
Если компьютер имеет несколько IP-адресов, tinc будет слушать их все, эта опция позволяет связать его с одним из них
|
BindToInterface
|
eth0/ppp0 и т.д.
|
При наличии нескольких сетевых интерфейсов tinc будет слушать на всех, используя эту опцию, можно определить, на каком из них слушать
|
BlockingTCP
|
yes|no (no)
|
Эта опция определяет, будут ли блокироваться уже установленные, но перегруженные TCP-соединения, если no, то подключение в этом случае с других узлов будет невозможно
|
ConnectTo
|
Имя файла в подкаталоге hosts
|
Указывает на узел, к которому будет пытаться присоединится демон tincd, если такой опции нет, то он будет только принимать входящие соединения
|
Device
|
/dev/tap0, /dev/net/tun и т.п. в зависимости от системы
|
Используемое виртуальное сетевое устройство. При этом демон может работать только с одним виртуальным устройством
|
Hostnames
|
yes|no (no)
|
Включает необходимость разрешения адресов (как реальных, так и VPN). Поскольку DNS-запросы могут быть блокированы, это может привести к задержкам в работе
|
Interface
|
|
Определяет интерфейс, соответствующий виртуальному сетевому устройству.
При установленной Device эта секция обычно устанавливается нормально
|
Mode
|
router (по умолчанию)
|
Опция Mode позволяет демонам tincd взаимодействовать между собой. В режиме router для формирования маршрутной таблицы применяется переменная Subnet, используемая в конфигурационном файле отдельных узлов. Поддерживается передача только unicast-пакетов
|
switch
|
Такой режим полезен при соединении вместе нескольких Ethernet-сетей. В этом режиме поддерживаются ARP, широковещательные и групповые запросы, различаются МАС-адреса. И на основании этой информации строится таблица маршрутизации
|
hub
|
Похож на предыдущий, только вместо построения таблиц маршрутизации се пакеты просто передаются другим демонам
|
KeyExpire
|
Секунды (3600)
|
Интервал времени между сменами сеансовых симметричных ключей шифрования, при помощи которых собственно и происходит шифрование трафика
|
MACExpire
|
Секунды (600)
|
При установленном Mode в switch определяет время хранения МАС-адресов
|
Name
|
|
Уникальное имя этого узла в VPN-подключении
|
PingTimeout
|
Секунды (60)
|
Время между отсылками контрольных пакетов, если в период такого же времени удаленный узел не ответит, соединение будет разорвано, а остальные узлы будут оповещены об этом
|
PriorityInheritance
|
yes|no (no)
|
Включает наследование поля TOS (Type Of Service) уходящими UDP-пакетами
|
PrivateKey
|
Path (/usr/local/etc/tinc/netname/rsa_key.priv)
|
Полный путь к файлу, в котором хранится секретный ключ сервера tincd. Возможно использование только одной из этих опций
|
PrivateKeyFile
|
TunnelServer
|
yes|no (no)
|
При включении этой опции демон tincd сможет пересылать информацию другим демонам, иначе он будет работать только с узлами, присутствующими в /usr/local/etc/tinc/[netname]/hosts/
|
Все опции, которые можно использовать в файле описания удаленного узла, приведены в таблице 2. В простейшем файл home будет выглядеть так:
# Sample host configuration file
Address = 10.10.1.67
Port = 655
Subnet = 192.168.10.0/24
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
Так как в Windows все параметры задаются при настройке сетевого соединения, то в файле клиентов достаточно только секции Subnet.
Таблица 2. Параметры файла описания клиентов
Параметр
|
Возможное значение (значение по умолчанию)
|
Описание
|
Address
|
IP-адрес (рекомендуется) или доменное имя
|
Внешний (не VPN) адрес компьютера, с которым необходимо соединиться
|
Cipher
|
(blowfish)
|
Симметричный алгоритм, используемый для шифрования UDP-потока. Поддерживаются все алгоритмы, реализуемые библиотекой OpenSSL, при установке в none шифрование отключается
|
Compression
|
0 (выкл., знач. по умолч.),
1 (быстрее zlib), 9 (лучше zlib),
10 (быстрее lzo) и 11 (лучше lzo)
|
Уровень компрессии UDP-потока
|
Digest
|
(sha1)
|
Алгоритм, применяемый для аутентификации UDP-пакетов. Поддерживаются все алгоритмы, реализуемые библиотекой OpenSSL, при установке в none опция отключается
|
IndirectData
|
yes|no (no)
|
Определяет, может ли другой демон, кроме тех, что определены опциями ConnectTo, подсоединяться к системе
|
MACLength
|
bytes (4)
|
Размер кода аутентификации сообщения, значение по умолчанию на сегодняшний день считается уже недостаточным, поэтому нужно использовать максимальное значение, поддерживаемое выбранным алгоритмом в Digest
|
Port
|
номер_порта (655)
|
Порт, на котором удаленный демон слушает входящие соединения
|
Subnet
|
|
VPN-подсеть, в которой происходит вся работа
|
TCPonly
|
yes|no (no)
|
При активации этой опции для подключения используются только TCP?пакеты
|
PublicKey или PublicKeyFile
|
path
|
При хранении открытого ключа клиента в отдельном файле, этой опцией указывается полный путь к нему
|
Но кроме правильно описанных параметров в конфигурационных файлах, для нормальной работы всей системы необходимо наличие пары ключей, при помощи которых будет происходить закрытие информации. Для генерации ключей запускается демон с ключом -К, а если на компьютере запускается несколько виртуальных сетей, то добавляется опция -n. Например, на компьютере office, выполняем такую команду:
# tincd -K -n vpn_net
Generating 1024 bits keys:
............++++++ p
.........++++++ q
Done.
Appending key to existing contents.
Make sure only one key is stored in the file.
|
При этом по умолчанию закрытый ключ будет записан в файл /usr/local/etc/tinc/vpn_net /rsa_key.priv, а открытый ключ в файл /usr/local/etc/tinc/vpn_net/hosts/office. Для Windows это будет естественно немного другой путь, C:Program Files tincvpn_net sa_key.priv, а открытый – C:Program Files tincvpn_nethostshome.
Отсюда наиболее оптимальным будет такой вариант настройки виртуальной сети. На каждом узле создается свой host-файл, в который кроме параметров записывается и открытый ключ. А затем администраторы обмениваются этими файлами между собой и подключают опцией ConnectTo. Теперь, когда все настроено, можно пробовать запустить демон.
# tincd -n vpn_net
Скорее всего, при первом запуске выскочит такая ошибка.
Could write pid file /usr/local/var/run/tinc.vpn_net.pid: No such file or directory |
Означающая, что демон не может найти файл tinc.vpn_ net.pid. Вероятной причиной появления такого сообщения является отсутствие нужных каталогов. Выход: либо создать все необходимые каталоги, либо указать новое место для pid-файла, использовав опцию --pidfile=/path/to/file.
После этого узлы должны соединиться между собой и образовать единый канал. Для контроля можно проверить наличие необходимых интерфейсов командами ifconfig -a (ipconfig для Windows) и просмотреть открытые порты при помощи netstat -a.
Рисунок 5
Для выявления возможных ошибок могут пригодиться дополнительные параметры запуска. Опция --logfile[=file] указывает на необходимость ведения журнала (по умолчанию запись будет вестись в /usr/local/var/log/tinc.netname.log), опция --debug задает уровень отладочных сообщений (0-5) и --bypass-security отключает шифрование.
Вот в принципе и все. Несмотря на то, что написано много, настройка сервиса на отдельном компьютере не занимает времени больше 10-15 минут. Со временем разработчики собираются интегрировать все приложения, от которых зависит работа tinc, в единый пакет, что еще больше должно упростить установку. А так tinc представляет собой довольно удобный, гибкий и простой инструмент, позволяющий быстро создавать и легко наращивать виртуальные сети, доступный к тому же для всех популярных сегодня операционных систем.