|
Lego city Интернет-магазин детских товаров. Дневник на. legobaby.ru |
|
Osb продажа Вид продукции, цены, контакты. Торговая и информационная система. stroyshopper.ru |
Статья напечатана в журнале
Сегодня редко когда все подразделения компании находятся в пределах одного здания. Поэтому рано или поздно перед системным администратором станет задача обеспечить удобный и безопасный доступ ко внутренним ресурсам. А значит объединить территориально разнесенные сети с помощью надежного и защищенного канала, обеспечивающего надежную защиту от прослушивания и вмешательства из вне. В этой ситуации на помощь приходят виртуальные частные сети.
В настоящее время существует множество различных решений позволяющих создавать виртуальные частные сети (ВЧС, англ. Virtual Private Network — VPN), остановим свой на выбор OpenVPN (openvpn.net). Это полнофункциональное решение созданное на основе SSL позволяющее просто решить весь спектр задач по подключению удаленных пользователей или сетей, с четко разграниченными правами доступами, поддержкой беспроводных сетей и балансировки нагрузки. Имеются реализации для всех популярных операционных систем: Linux, *BSD, Solaris, Mac OS X, Windows от 2000. Поддерживаются адаптивная компрессия потока, работа через NAT, использование всех доступных в SSL алгоритмов шифрования, аутендификации и сертификатов. Клиенты могут иметь как статические, так и динамические IP-адреса, что весьма полезно при использовании dial-up или перемещении пользователя. Может работать в chroot окружении, в целях безопасности демон после запуска понижает права до минимально необходимых. OpenVPN является обычным пользовательским приложением использующим драйверы tun/tap. Tun применяется при туннелировании IP-пакетов, а tap, он же ethertap, — при туннелировании фреймов Ethernet. В терминологии OpenVPN такие туннели называются соответственно – routed (точка-точка) и bridged (один сервер – несколько клиентов). Драйвер TUN/TAP позволяет пользовательским программам самостоятельно обрабатывать соответствующие пакеты. OpenVPN оптимизирован для работы с протоколом UDP, который используется по умолчанию и рекомендуем разработчиками, но можно использовать и TCP.
$ sudo modprobe tun
$ /bin/lsmod | grep tun
$ ls /dev/net/tun
Если ответ ничего не содержит, пересоберите ядро активировав следующие пункты:
Device Drivers —>
Network device support —>
[*]Network device support
<M> Universal TUN/TAP device driver support
Теперь скачиваем последнюю версию OpenVPN с сайта проекта и вперед:
$ cd openvpn-x.x.x/
Если в системе есть все необходимое, то в большинстве случаев достаточно дать стандартные “./configure; make; sudo make install”. Проблемы при установке обычно возникают в случае отсутствия библиотек lzo или ssl. После установки, работу компонентов можно протестировать, введя “make check”. Кому сообщение о том, что “ All 2 test passed” покажется мало информативным, следует провести два доступных теста вручную. Система, построенная на основе OpenVPN, может использовать два вида ключевой информации и соответственно алгоритмов шифрования: симметричное шифрование со статическим ключом и асимметрично с использование TLS/SSL сертификатов и ключей. Посмотреть, какие алгоритмы шифрования доступны, можно с помощью команды:
$ sudo openvpn –show-ciphers
Проверим работу OpenVPN со статическим ключом. Сначала создадим такой ключ:
$ sudo openvpn —genkey —secret /etc/openvpn/static.key
$ sudo openvpn --test-crypto --secret /etc/openvpn/static.key
Результатом должно быть сообщение о том, что “OpenVPN crypto self-test mode SUCCEEDED”. Для проверки работы с асимметричными ключами следует воспользоваться готовыми конфигурационными файлами, которые находятся в подкаталоге sample-config-files архива. Выполняем в разных консолях, следующие команды:
$ sudo openvpn sample-config-files/loopback-client
$ sudo useradd openvpn
Очень не рекомендую использовать здесь nobody, если несколько серверов работают от имени этого пользователя он становится не менее всемогущим чем root. И каталог, в котором будут храниться настройки и ключи (если он еще не создан):
1. Корневой сертификат (CA — Certificate Authority) – build-ca (для подписи сертификатов сервера и клиентов);
2. Ключ и сертификат сервера – build-key-server;
3. Ключи для клиентов – простые (build-key) и защищенные паролем (build-key-pass);
4. Ключи PKCS (Public Key Cryptography Standards) — build-key-pkcs12 (подойдут при хранении на сменных носителях, вроде eToken);
5. Создать сертификат и ключ, если СА не доступен в локальной системе – простой (build-req), защищенный паролем (build-req-pass), и подписать их (sign-req);
6. Создать сертификат и ключ, используя корневой СА — build-inter;
7. Создать ключ Diffie Helman — build-dh (используется при установленном соединении для шифрования трафика);
8. Отозвать — сертификат (revoke-crt);
9. Отозвать с созданием списка отозванных сертификатов (Certificate Revocation List — CRL) — revoke-full
Чтобы меньше вбивать руками, первоначально стоит заглянуть в скрипт vars и подправить значения параметров KEY_COUNTRY, KEY_PROVINCE, KEY_CITY=BISHKEK, KEY_ORG, KEY_EMAIL. Кроме того, параметр KEY_CONFIG, указывает на файл openssl.cnf находящийся в этом же каталоге. Он аналогичен одноименному файлу, используемому OpenSSL, в него также стоит заглянуть, либо, взяв свой вариант в /etc/ssl (если конечно до этого туда кто-то заглядывал). Теперь можно создавать все необходимое:
$ sudo ./vars
$ sudo ./clean-all
$ sudo ./build-ca
При вызове следующих скриптов, в качестве параметра необходимо указывать имя компьютера, для которого создаются ключ и сертификат. Создаем сначала все необходимое для работы сервера:
$ sudo ./build-dh
И затем для клиентов:
$ sudo ./build-key client1
$ sudo ./build-key-pass client2
Для второго клиента был создан ключ, защищенный паролем. На сервере оставляем файлы ca.crt, dh1024.pem, server.srt и server.key. На компьютеры клиентов кроме сертификата и ключа переносим и ca.crt.
OpenVPN работает по принципу клиент-серверной архитектуры, в одном из двух режимов: routed и bridged. Количество клиентов во втором случае ограничивается только мощностью компьютера, играющего роль сервера. Причем возможен одновременный запуск на одном компьютере нескольких процессов openvpn, каждый из которых считывает собственный конфигурационный файл и работает в режиме сервера или клиента. Таким образом, без проблем создается несколько виртуальных сетей. Есть несколько вариантов запуска сервера. Например, вызов openvpn из командной строки со всеми параметрами в придачу. Сервер может также запускаться через xinetd. Традиционным считается вариант с использованием конфигурационного файла и стартового скрипта в /etc/init.d. Последний и рассмотрим.
Для создания конфигурационного файла сервера воспользуемся имеющимся шаблоном server.conf который находится в подкаталоге sample-config-file. Все параметры в нем хорошо комментированы. Вариантов описания даже одной конфигурации сети, может быть несколько, поэтому рассмотрим лишь один из них. Копируем файл в /etc/openvpn и приступаем к редактированию:
# необязательный параметр, указывающий на каком интерфейсе слушать
# иначе сервер будет принимать соединения на всех интерфейсах
# local 195.95.95.95
# если используется несколько серверов, каждый должен работать на своем порту
# port 1194
# тип виртуального устройства (tun, tap, null), в некоторых случаях необходимо указывать и его номер
dev tun
# по умолчанию используется протокол UDP, чтобы использовать tcp следует
# указать на это с помощью proto, возможны варианты udp, tcp, tcp-server, tcp-client
# proto tcp-server
# включаем сжатие
comp-lzo
# отсылка ping пакетов, чтобы межсетевые экраны не разорвали соединения при их неактивности
ping 15
# для dial-up, NAT, PPP понадобится и следующие параметры
# ping-restart 45
# ping-timer-rem
# persist-tun
# persist-key
# вывод отладочных сообщений, максимальное значение 9 стоит устанавливать только при отладке
verb 3
# назначаем виртуальному интерфейсу IP-адрес своему 10.1.0.1 и удаленному 10.1.0.2
# используется при соединении точка-точка,
ifconfig 10.1.0.1 10.1.0.2
# mode server
# server 10.1.0.0 255.255.255.0
# Скрипт содержащий сведения о новом маршруте
up ./server.up
# удаляем маршрут при остановке
down ./server.down
push “route 192.168.1.0 255.255.255.0”
# использование SSL/TLS (только для сервера)
tls-server
# файлы ключей
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
# И Diffie-Hellman Parameters при использовании tls-server
dh /etc/openvpn/keys/dh1024.pem
# пользователь и група от имени которых будет работать программа
user openvpn
group openvpn
Файл server.up содержит информацию о новом маршруте, в простейшем случае запись такая:
Где 192.168.1.1 адрес внутреннего интерфейса сервера OpenVPN. И server.down:
$ sudo openvpn —config /etc/openvpn/server.conf
$ telnet localhost 1194
В том случае, когда OpenVPN устанавливался из исходных текстов необходимо обеспечить его автоматический запуск при загрузке системы и остановку при выключении. Разработчики заранее подготовили несколько скриптов. В подкаталоге gentoo находится готовый файл openvpn.init для одноименного дистрибутива, в sample-scripts – файл для запуска и остановки OpenVPN в RedHat/Fedora и других RedHat chkconfig-based дистрибутивов. Хотя после небольшой доработки можно использовать их в любом другом дистрибутиве. В общем случае подойдут простые скрипты – openvpn-startup.sh и openvpn-shutdown.sh. Хотя заглянуть внутрь первого также стоит:
#!/bin/sh
dir=/etc/openvpn
# если используете его, то самостоятельную загрузку iptables следует отключить
$dir/firewall.sh
# включаем IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# оставляем одну запись
openvpn —cd $dir —daemon —config server.conf
# openvpn —cd $dir —daemon —config vpn2.conf
# openvpn —cd $dir —daemon —config vpn2.conf
Теперь копируем его в /etc/init.d/, делаем исполняемым и создаем необходимые символические ссылки на уровнях запуска, помня, что OpenVPN желательно загружать, после того как будет поднята сеть:
$ chmod +x openvpn-startup.sh
$ sudo cp openvpn-startup.sh /etc/init.d/
$ sudo ls –n /etc/init.d/openvpn-startup.sh /etc/rc3.d/S99openvpn-startup
$ sudo ls –n /etc/init.d/openvpn-startup.sh /etc/rc5.d/S99openvpn-startup
$ chmod +x openvpn-shutdown.sh
$ sudo cp openvpn-shutdown.sh /etc/init.d/
$ sudo ls –n /etc/init.d/openvpn-shutdown.sh /etc/rc6.d/K80openvpn-shutdown
/sbin/iptables -I INPUT -p udp —dport 1194 -j LogAccept
/sbin/iptables -I OUTPUT -p udp —sport 1194 -j LogAccept
/sbin/iptables -I FORWARD -s 10.0.1.0/24 -d 192.168.1.0/24 -j LogAccept
/sbin/iptables -I FORWARD -d 10.0.1.0/24 -s 192.168.1.0/24 -j LogAccept
А это в server.down:
/sbin/iptables -D INPUT -p udp —dport 1194 -j LogAccept
/sbin/iptables -D OUTPUT -p udp —sport 1194 -j LogAccept
/sbin/iptables -D FORWARD -s 10.0.1.0/24 -d 192.168.1.0/24 -j LogAccept
/sbin/iptables -D FORWARD -d 10.0.1.0/24 -s 192.168.1.0/24 -j LogAccept
Некоторые варианты настройки iptables можно подсмотреть в файле firewall.sh.
# для клиента обязательно указываем IP-адрес сервера OpenVPN
# если используется стандартный порт (1194), его можно опустить
remote 195.95.95.95 1194
proto udp
comp-lzo
ping 15
verb 3
# обратите внимание, что IP-адреса проставлены наоборот
ifconfig 10.1.0.2 10.1.0.1
up ./client.up
down ./client.down
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
user openvpn
group openvpn
Клиент и сервер готовы. Можно запускать и пробовать соединиться. Команда “ifconfig” должна показать наличие “tun0” на обеих компьютерах. Также должен проходить ping по по адресу 10.1.0.2. При этом захваченный с помощью tcpdump пакет на интерфейсах eth0 и tun0 должен отличаться, что говорит о шифровании. Успехов.
Не обязательно все настройки и управление OpenVPN в Linux осуществлять путем прямого редактирования конфигурационных файлов, доступны и графические интерфейсы позволяющие сделать это легко и просто. Самым простым является
kovpn (www.enlighter.de), с его помощью можно запускать и останавливать демон, не вызывая консоль, и при запросе вводить имя и пароль. Чуть больше возможностей у (home.gna.org/kvpnc/), здесь и создание ключей, импорт и экспорт конфигурационных файлов и сертификатов, работа с несколькими профилями.
Он к тому же он умеет работать и с некоторыми другими VPN клиентами Cisco VPN (vpnc), IPSec (FreeS/WAN (OpenS/WAN), racoon), PPTP. Имеет к тому же локализованный интерфейс. Написанный на Mono OpenVPN-Admin (openvpn-admin.sf.net), позволяет создавать и управлять сертификатами с помощью понятных мастеров, создавать и работать с несколькими профилями. Есть версии не только для Linux, но и Windows, планируется вариант для Nokia 770. Также мультиплатформенный, написанный на Perl и Tk OpenVPN Control (openvpn-control.sf.net), сего помощью можно просматривать и управлять подключениями к серверу. Есть и модуль к Webmin (www.openit.it/index.php/openit_en/software_libero/openvpnadmin) позволяющий в удобном графическом окружении отредактировать vars, сгенерировать все необходимые ключи и сертификаты, включая DH и управлять ими, создавать серверы и отслеживать активные соединения.