Шаг 1: Устанавливаем
Пакеты с OpenVPN доступны для большинства распространенных дистрибутивов, в том числе для RedHat/Fedora, Mandriva, OpenSUSE, Slackware, Debian и Ubuntu. Если OpenVPN не включен в ваш любимый дистрибутив, попробуйте поискать пакет на http://rpmfind.net (для систем, использующих RPM) или http://linuxpackages.net (Slackware и производные) Наконец, программу можно загрузить в исходных текстах с официального сайта (http://openvpn.net).Для установки OpenVPN также необходимо установить OpenSSL (http://openssl.org) и liblzo (http://www.oberhumer.com/opensource/lzo), которые есть во многих дистрибутивах. Для работы OpenVPN нужен модуль ядра tun. Он присутствует в большинстве систем, но если команда modrpobe tun завершается с ошибкой «Can’t locale module tun», вам придется пересобрать ядро – о том, как это сделать, подробно рассказано в LXF89. Необходимо включить опцию CONFIG_TUN (Device Drivers –> Network device support –> Universal TUN/TAP device driver support).
Если вы собираетесь использовать OpenVPN постоянно, пропишите модуль tun в /etc/modules для автоматической инициализации при загрузке либо включите его непосредственно в ядро. В противном случае перед запуском OpenVPN вам нужно будет загружать модуль tun самостоятельно (командой modprobe tun). Если вы планируете предоставлять клиентам доступ в Интернет через VPN, необходимо настроить NAT (Network Address Translation). Скорее всего, это уже сделано за вас разработчиками дистрибутива, но на случай возникновения проблем имейте в виду, что нам потребуется опция CONFIG_IP_NF_TARGET_MASQUERADE (Networking –> Networking options –> Network packet filtering –> IP tables support –> Full NAT). Для работы с NAT используется утилита iptables (см. LXF87-88), которая, скорее всего, уже установлена в вашей системе. Проверьте это и, в случае необходимости, добавьте ее через менеджер пакетов вашего дистрибутива.
Шаг 2: Создаем ключи
Итак, OpenVPN установлен. Что дальше? В первую очередь необходимо создать ключи и сертификаты для сервера и клиентов. Скрипты, облегчающие эту задачу, находятся в каталоге easy-rsa (см. врезку «Где же easy-rsa?» внизу).В первую очередь, отредактируйте расположенный в нем файл vars. Установите значения переменных:
- KEY_COUNTRY – равным двухсимвольному коду вашей страны (для России это RU).
- KEY_PROVINCE – названию вашего региона (например, Moscow region или MSK).
- KEY_CITY, соответственно – ваш город (скажем, Moscow).
- KEY_ORG – организация (OpenVPN Solutions подойдет).
- KEY_EMAIL – ваш e-mail адрес (me@my.e-ma.il).
Также можно изменить параметр KEY_SIZE, отвечающий за размер ключей (максимальный размер ключа, поддерживаемый OpenVPN – 2048 бит).
Далее необходимо инициализировать переменные, используемые при создании публичного ключа командой
# . ./varsи, на всякий случай, удалить существующие ключи командой
# ./clean-allПосле этого следует сгенерировать корневой сертификат (см.LXF93):
# ./build-caВ процессе выполнения последнего скрипта вам будет задано несколько вопросов. Нужно ввести только Common Name для сертификата (например, RootCA), все остальные параметры уже заданы в качестве переменных окружения скриптом vars.
После создания корневого сертификата необходимо сгенерировать для сервера секретный ключ. В этом вам поможет скрипт buildkey-server. Как и в предыдущем случае, для большинства вопросов можно оставить ответы по умолчанию. На вопрос о Common Name введите “server”, на два последних вопроса (подписать ли сертификат и – каламбур, но перевод именно такой – сертифицировать ли его) ответьте утвердительно; когда вас спросят о пароле (“A challenge password”) – введите пароль для ключа сервера (запоминать его не нужно). Наберите
# ./build-key-server serverДалее, создайте ключи для необходимого количества клиентов. Эта процедура аналогична созданию ключа для сервера, за исключением того, что для клиентов ключи создаются скриптом build-key, а не buildkey-server. У каждого ключа, конечно же, должно быть указано свое значение в поле Common Name:
# ./build-key clientnameЕсли вы хотите защитить паролем ключи клиентов, воспользуйтесь вместо build-key скриптом build-key-pass.
И наконец, в довершение ко всем сертификатам и ключам необходимо создать файл параметров Диффи [Diffie] и Хеллмэна [Hellman]. Алгоритм Диффи и Хеллмэна позволяет обмениваться секретными ключами по небезопасным каналам. Для их генерации запустите скрипт build-dh без параметров:
# ./build-dhЭтот процесс занимает определенное время, поэтому владельцам слабых компьютеров стоит попить чаю, вместо того чтобы просто сидеть и ждать окончания работы скрипта.
Если вам уже надоело возиться с ключами, сертификатами и прочим – не падайте духом: осталось только скопировать нужные файлы на клиентские компьютеры. Клиентам необходимы следующие файлы:
- ca.crt (Root CA certificate) необходим серверу и всем клиентам, он не является секретным.
- clientname.crt (сертификат клиента clientname) необходим только клиенту clientname, он не является секретным.
- clientname.key (ключ клиента clientname) необходим только клиенту clientname, это секретный ключ.
Эти файлы можно найти в подкаталоге keys каталога easy-rsa.
Шаг 3: Настраиваем
Итак, у нас есть все необходимые для работы OpenVPN файлы – все, кроме конфигурационных, созданием которых мы и займемся. Начнем с сервера. Для создания новых конфигурационных файлов удобно использовать примеры из поставки OpenVPN, они находятся в подкаталоге sample-config-files каталога OpenVPN (../sample-config-files, если вы находитесь в каталоге easy-rsa). В принципе, можно использовать стандартный конфигурационный файл для сервера, изменив некоторые параметры. Вот список этих параметров (некоторые из них, например, port и protocol, изменять не обязательно):- ca – полный путь до корневого сертификата, который мы создали скриптом build-ca.
- cert – полный путь до сертификата сервера, который мы создали его скриптом build-key-server.
- key – путь до ключа сервера, созданного все тем же скриптом build-key-server.
- dh – путь до файла параметров Диффи и Хеллмэна, созданного скриптом build-dh.
- server – режим запуска OpenVPN. В строке с режимом запуска для сервера должна быть указана подсеть и маска подсети (пример – server 10.8.0.0 255.255.255.0). Подсеть, указанная по умолчанию – 10.8.0.0/24. Если в вашей сети она уже используется, задайте другую локальную подсеть.
- port – порт, на котором будет запущен сервер. Стандартный порт OpenVPN – 1194, но вы можете изменить его по своему желанию.
- protocol – протокол. По умолчанию OpenVPN использует экономичный UDP, но вы можете предпочесть надежный TCP.
Если вы не сторонник конфигураций по умолчанию, отредактируйте файл в соответствии со своими предпочтениями. Если же вы не хотите тратить на это время, то можете использовать мой вариант, составленный специально для этой статьи. Вы найдете его на прилагаемом к журналу диске.
Для создания конфигурационного файла клиента также можно использовать пример, идущий в поставке с OpenVPN. В нем надо изменить пути к необходимым файлам на свои, указать адрес и порт сервера в директиве remote и, кроме того, удостоверится, что выбранные настройки совпадают с настройками сервера (протокол, сжатие и т.п.). Пример конфигурационного файла клиента можно также взять с диска LXF. Тех же, кто хочет предоставлять VPN-клиентам доступ в Интернет, ждет еще один шаг: включение NAT (Network Address Translation, Трансляция сетевых адресов) и настройка маршрутизации. Для начала необходимо написать соответствующее правило IPTables:
# iptables -t nat -A POSTROUTING -s маска_подсети -o внешний_интерфейс -j MASQUERADEнапример:
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ppp0 -j MASQUERADEЕго необходимо сохранить, добавив в файл с правилами iptables или в скрипты загрузки. Затем необходимо включить маршрутизацию, записав в /etc/sysctl.conf строку “net.ipv4.ip_forward = 1” и выполнив команду
# sysctl -w net.ipv4.ip_forward=1
Шаг 4: Проверка связи
Если вы дошли до этого места, спешу вас обрадовать – остался всего один, очень простой шаг. Надо запустить OpenVPN на сервере, а потом и на всех клиентах. Для сервера: перейдите в каталог с ключами (keys) и выполните:# openvpn --config ../sample-config-files/server.confПосле чего вы должны увидеть подобные строки:
Thu Aug 31 12:04:20 2006 OpenVPN 2.0.7 i486-pc-linux-gnu [SSL] [LZO] [EPOLL] built on Jul 22 2006На клиенте (клиентах) выполните команду
Thu Aug 31 12:04:20 2006 Diffie-Hellman initialized with 1024 bit key
Thu Aug 31 12:04:20 2006 TLS-Auth MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Thu Aug 31 12:04:20 2006 TUN/TAP device tun0 opened
...
Thu Aug 31 12:04:20 2006 Initialization Sequence Completed
# openvpn --config client.confпосле чего проверьте наличие tun-интерфейса командой ifconfig:
# ifconfig tun0Обратите внимание на статус (UP): он означает, что интерфейс находится в активном состоянии. Если в вашей системе имеется более одного tun-интерфейса (это можно проверить командой ifconfig без параметров), замените tun0 на tun1, tun2 и т.п.
tun0 Link encap:UNSPEC HWaddr 00:00:00:00:00:00
inet addr:85.140.161.153 P-t-P:10.8.0.2 Mask:255.255.255.0
UP POINTOPOINT RUNNING MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Если интерфейс сконфигурирован правильно, проверьте доступность других хостов. Когда путь к файлу соответствий «клиент-IP» (опция ifconfig-pool-persist в конфигурационном файле сервера) не указан, их адреса назначаются сервером OpenVPN случайным образом. Наберите:
$ ping 10.8.0.2
Вместо 10.8.0.2 подставьте IP-адрес, выданный командой ifconfig на другой машине. В случае, если интерфейс сконфигурирован правильно, но ответа не приходит, необходимо выяснить, разрешают ли правила межсетевого экрана ICMP-трафик. Приходящие ответы свидетельствуют о том, что VPN-соединение установлено и работает.
Шаг 5: Удаление недействительных сертификатов
Такая задача может возникнуть, если например, один из сотрудников работал через VPN, а потом уволился. Естественно, что ключи остались. Как обеспечить невозможность подключится с этим сертификатом:# cd /usr/share/doc/openvpn/easy-rsa/2.0/проделываем такую операцию для каждого удаляемого клиента
# . ./vars
# ./revoke-full client1
eсли будет выдавать ошибку error on line 282 of config file '....openvpn/easy-rsa/openssl.cnf', то комментируем следующие строки в openssl.cnf:
[ pkcs11_section ]и опять выполняем пункт 1.
engine_id = pkcs11
dynamic_path = /usr/lib/engines/engine_pkcs11.so
MODULE_PATH = $ENV::PKCS11_MODULE_PATH
PIN = $ENV::PKCS11_PIN
init = 0
Если всё хорошо, то должна появится такая строка
"Revoking Certificate ... Data Base Updated"Копируем только что создавшийся crl.pem на место того, который уже есть (путь к нему нужно смотреть в файле openvpn.conf, параметр crl-verify) Если такого параметра нет - то добавляем его и указываем местоположение нового файла
crl-verify /etc/openvpn/crl-verify.pemДелаем рестарт демона:
# /usr/local/etc/rc.d/openvpn restartТеперь не смогут подключится те, кого мы удалили из базы.
Некоторые распростанённые проблемы и методы решения
- После установки в ОС создаётся новый сетевой интерфейс с "адаптером" TAP-Win32 Adapter V8, отображаемый ОС как сетевой адаптер с неподключенным кабелем, он же может отбражаться в области значков. Это виртуальный адаптер OpenVPN. Его можно переименовать по желанию и это имя можно будет использовать в конфиг-файлах в команде dev-node TAP-interface-name
- Этот адаптер НЕ НУЖНО отключать (распространённое явление - не устанавливается OpenVPN-соединение т.к. отключен этот интерфейс)
- На этом адаптере в общем случае НЕ НУЖНО настраивать никакие параметры IP-протокола (кроме NetBIOS, см.ниже), включение и конфигурация этого интерфейса производятся автоматически при установке OpenVPN-соединения.
- Если не нужен NetBIOS, то во избежание проблем с NetBIOS-ом, свойственных multihomed-хостам РЕКОМЕНДУЕТСЯ отключить NetBIOS для данного интерфейса: сетевые подключения - свойства данного сетевого интерфейса – свойства протокола TCP/IP – дополнительно – WINS – Параметры NetBIOS = Отключить NetBIOS через TCP/IP.
- На этом адаптере во избежание непонятных проблем желательно НЕ ВКЛЮЧАТЬ фаервол (брандмауэр), по крайней мере на начальном этапе установки, изучения и запуска.
- Не происходит добавление маршрута в таблицу маршрутизации, вероятно при включенной службе RRAS (чаще всего возникает на серверных ОС, например, Windows Server 2003, но встречал и на XP) - ошибка: "NOTE: FlushIpNetTable failed on interface [2] {427E6BDF-F41F-4E7A-B8C4-4F12B25A6C11} (status=1413) : Invalid index."
Решение: "route-method exe" в конфиг.файле - это указывает OpenVPN-у, что добавление маршрута надо делать не через API, а через route.exe. Кроме того, может потребоваться небольшая задержка перед добавлением маршрута через route.exe (встречалось, что без задержки route.exe ещё не видит только что появившийся интерфейс и не добавляет маршрут), это делается route-delay 10 (на серверах лично меня "не напрягает" задержка 10 секунд, на клиентах можно уменьшить до экспериментально вычисленного предела). - При запуске OpenVPN-соединения из учётной записи пользователя (без прав Администратора) возникает ошибка, связанная с недостатком прав для установки интерфейса, либо не прописывается маршрут. Вариантов решения два:
- Отключить UAC
- Запускать от Администратора
Для того, чтобы клиенты видели подсеть за OpenVPN-сервером, необходимо
- В конфиге OpenVPN указать: push "route 192.168.0.0 255.255.255.0", где 192.168.0.0 - офисная подсеть
- На маршрутизаторе создать маршрут в сеть 192.168.3.0/24, направленный на 192.168.0.9, где 192.168.3.0 - подсеть OpenVPN соединений, а 192.168.0.9 - ip севера OpenVPN
Для выдачи статических ip клиентам необходимо:
- В конфиге OpenVPN на сервере раскомментировать строку
client-config-dir ccd
- Создать директорию /etc/openvpn/ccd/ и в ней файлы с именами, как у сертификатов клиентов
- В файлах конфигурации /etc/openvpn/ccd/* прописать ip примерно таким образом:
ifconfig-push 192.168.3.30 192.168.3.29
где 192.168.3.30 - ip,который мы хотим дать клиенту. - Также можно прописать строку push-reset для того, чтобы сбросить общие push-настройки данного клиента.
Комментариев нет:
Отправить комментарий