OpenVPN: для семейства операционных систем Microsoft Windows 2000/XP/2003
В семейство серверных операционных систем Windows 2000/2003 входит компонент, позволяющий организовать безопасный канал передачи данных между удаленными подразделениями …. Копнем глубже!
В семейство серверных операционных систем Windows 2000/2003 входит компонент, позволяющий организовать безопасный канал передачи данных между удаленными подразделениями, либо просто для удаленного доступа в сеть офиса сотрудников компании, по протоколам PPTP и L2TP. Настройки не отличаются сложностью и достаточно понятно описаны во встроенной справке.
Однако в процессе эксплуатации возникли некоторые проблемы в работе канала, самой неприятной из которых является то, что при нестабильном удаленном подключении (часто рвется связь) встроенная служба “маршрутизации и удаленного доступа” зависает. В результате, периодически приходилось вручную “поднимать” соединение между офисом и удаленным подразделениями. С этим можно было мириться, когда удаленных подразделений насчитывается 2 или 3 … С ростом числа подразделений эта проблема превращается в катастрофу, которая периодически отнимает практически все время системного администратора.
И так, в качестве альтернативы был выбран программный продукт – OpenVPN (http://openvpn.net/). Обо всех достоинствах, принципе работы и функционале продукта можно узнать на официальном сайте разработчиков. У нас же речь пойдет о конкретном типовом решении. Кроме того, учитывая то обстоятельство, что большинство корпоративных сетей развернуто на базе операционных систем MS Windows, решение будет также ориентировано под работу в среде Windows.
Средствами OpenVPN достаточно просто построить каскад из vpn-серверов, что может пригодиться при решении задач анонимности в интернет.
Скачать программу можно с сайта разработчиков http://openvpn.net/download.html.
Теперь перейдем непосредственно к постановке задачи и её решению
ЗАДАЧА :
Есть главный офис и 2 подразделения. В офисе есть сервер с реальным ip-адресом (123.123.123.123). Нужно объединить сеть офиса и сети 2-х подразделений в одну сеть.
Адресные пространства локальных сетей:
офис – 192.168.16.0/24 (mask 255.255.255.0)
подразделение 1 – 192.168.60.0/24 (mask 255.255.255.0)
подразделение 2 – 192.168.50.0/24 (mask 255.255.255.0)
ОС на сервере офиса Win2k server SP4.
Cервер подразделения 1 – WinXP Prof SP1.
Cервер подразделения 2 – Win2k3 server EE SP1.
Сервер в главном офисе будет VPN-сервером, сервера в подразделениях – его клиенты.
На всех серверах должна работать служба “DHCP – клиент”
РЕШЕНИЕ:
Установка OpenVPN (общие правила для сервера и клиентов)
1. Рекомендуется устанавливать в каталог, в полном пути которого не будет пробелов (иначе, пути нужно заключать в кавычки):
1 |
c:\OpenVPN |
2. Для ключей и сертификатов создаём папку:
1 |
c:\OpenVPN\ssl |
Подготовка сервера к выдаче сертификатов.
1)Копируем из папки C:\OpenVPN\easy-rsa в папку c:\OpenVPN\ssl файлы index.txt.start и serial.start и переименовываем их в index.txt и serial
2)В каталоге C:\OpenVPN easy-rsa делаем копии файлов vars.bat.sample и openssl.cnf.sample и переименовываем их в vars.bat и openssl.cnf
3)Редактируем файл vars.bat
Изменяем пути домашнего каталога и хранилища ключей:
1 2 |
- set HOME=c:\OpenVPN\easy-rsa - set KEY_DIR=c:\OpenVPN\ssl |
Длину ключа можно оставить по умолчанию:
1 |
- set KEY_SIZE=1024 |
Для уменьшения времени на ввод данных при генерации сертификатов и уменьшения вероятности ошибки при вводе данных, можно задать следующие значения переменных:
1 2 3 4 5 |
- set KEY_COUNTRY=RU - set KEY_PROVINCE=Moscow - set KEY_CITY=Moscow - set KEY_ORG=MyCompany - set KEY_EMAIL=admin@domain.ru |
ВАЖНО!
– поле Organization Name (KEY_ORG) должно совпадать с тем, что будет указано при генерации сертификата центра сертификации (ca.crt).
4)Редактируем openssl.cnf
Меняем следующие значения (обратить внимание на двойной слеш):
1 2 |
- database = $dir\\index.txt - serial = $dir\\serial |
А также, для будущего удобства, можно изменить следующее:
– раскомментировать параметр organizationalUnitName_default и задать ему какое-нибудь значение:
1 |
organizationalUnitName_default = My Department |
5. Создаем папку C:\OpenVPN\config\ccd для файлов-конфигураций пользователей.
Создание сертификатов и ключей сервера.
Примечания:
– Все последующие действия производятся из командной строки, которая открыта на протяжении всего процесса генерации ключей
– Перед глазами лучше держать открытые в проводнике каталоги c:\OpenVPN\easy-rsa (чтобы не путаться в названиях bat-файлов) и c:\OpenVPN\ssl (чтобы видеть результаты).
1)Запускаем командную строку.
2)Объявляем переменные: запускаем файл vars.bat
3)Создаем корневой сертификат и ключ на 10 лет (кстати, если мы все правильно прописали в файлах vars.bat и openssl.cnf, то, вместо ввода значений, можно просто нажимать кнопку “Enter”)
1 |
build-ca.bat |
или
1 |
openssl req -days 3650 -nodes -new -x509 -keyout %KEY_DIR%\ca.key -out %KEY_DIR%\ca.crt -config %KEY_CONFIG% |
4)Создаем сертификат и ключ для сервера, и подписываем его в нашем центре сертификации (на 2 вопроса при подписи созданного сертификата, ответить утвердительно).
Запускаем bat-файл с именем сервера, в качестве параметра
1 |
build-key-server.bat ServerVPN |
или
1 2 |
openssl req -days 3650 -nodes -new -keyout %KEY_DIR%\ServerVPN.key -out %KEY_DIR%\ServerVPN.csr -config %KEY_CONFIG% openssl ca -days 3650 -out %KEY_DIR%\ServerVPN.crt -in %KEY_DIR%\ServerVPN.csr -extensions server -config %KEY_CONFIG% |
В результате будут созданы файлы ServerVPN.crt, ServerVPN.csr, ServerVPN.key
5)Создаем сертификаты и ключи для клиентов, и подписываем их в нашем центре сертификации.
ВНИМАНИЕ! В процессе генерации сертификата будет запрос на ввод значения для поля commonName, – для клиентов имена должны различаться (например, для подразделения 1 – commonName=Client1, для подразделения 2 – commonName=Client2).
Запускаем bat-файл с именем клиента, в качестве параметра (не забываем про Organization Name, см. выше)
1 |
build-key.bat ClientVPN1 |
или
1 2 |
openssl req -days 3650 -nodes -new -keyout %KEY_DIR%\ClientVPN1.key -out %KEY_DIR%\ClientVPN1.csr -config %KEY_CONFIG% openssl ca -days 3650 -out %KEY_DIR%\ClientVPN1.crt -in %KEY_DIR% \ClientVPN1.csr -config %KEY_CONFIG% |
В результате должны получиться файлы ClientVPN1.crt, ClientVPN1.csr, ClientVPN1.key
Аналогично и для второго подразделения, только имя файла сертификата (не путать с commonName) изменил на ClientVPN2.
6)Создаем ta-ключ для защиты от DOS-атак:
1 |
openvpn --genkey --secret C:\OpenVPN\ssl\ta.key |
7)Создаем ключ Diffie-Hellman (сертификат для шифрования установки соединения, выполняется долго)
1 |
build-dh.bat |
или
1 |
openssl dhparam -out %KEY_DIR%/dh%KEY_SIZE%.pem %KEY_SIZE% |
Конфигурационный файл сервера.
1)Создаем в папке C:\OpenVPN\config\ файл с названием serverVPN.ovpn
2)Открываем его и вставляем туда нижеследующее содержание:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# Тип интерфейса dev tun # Имя интерфейса (должно совпадать с названием интерфейса в списке адаптеров Windows) # Необязательный параметр # dev-node "OpenVPN Adapter" # Указываем серверу, что работать будем по протоколу TCP proto tcp-server # Порт 8888 port 8888 # Признак серверной конфигурации tls-server #Укажем адресное пространство в vpn-сети server 10.10.0.0 255.255.255.0 # Включаем сжатие comp-lzo # Метод добавления маршрута (актуально только для Windows) #Помогает в случае ошибок добавления маршрутов # route-method exe # Маршрут для сервера, чтобы видеть сети 192.168.60.x и 192.168.50.x route 192.168.60.0 255.255.255.0 10.10.0.2 route 192.168.50.0 255.255.255.0 10.10.0.2 # Маршрут, который добавляется в таблицу КАЖДОГО клиента, чтобы видеть сеть за сервером # здесь он закомментирован, т.к. использовались персональные файлы клиентов # push "route 192.168.16.0 255.255.255.0" # Разрешаем vpn-клиентам видеть друг друга client-to-client # Каталог с конфигурациями пользователей client-config-dir C:\OpenVPN\config\ccd # Файл с описанием vpn-сетей между клиентом и сервером # Если при старте сервера он не существует, то создается автоматически ifconfig-pool-persist C:\OpenVPN\config\ccd\ipp.txt # Указываем пути к сертификатам сервера # Сертификат для шифрования установки соединения dh C:\OpenVPN\ssl\dh1024.pem # Сертификат центра сертификации ca C:\OpenVPN\ssl\ca.crt # Сертификат сервера cert C:\OpenVPN\ssl\ServerVPN.crt # Ключ сервера key C:\OpenVPN\ssl\ServerVPN.key # Использование интерфейса и ключа при перезапуске сервера persist-tun persist-key # Защита от DOS-атак (для сервера, после пути к ключу, ставим значение 0) tls-auth C:\OpenVPN\ssl\a.key 0 tun-mtu 1500 tun-mtu-extra 32 mssfix 1450 # Время жизни неактивной сессии keepalive 10 120 # Пути к файлам журналов # Журнал состояния (перезаписывается ежеминутно) status C:\OpenVPN\log\openvpn-status-server.log # Системный журнал log C:\OpenVPN\log\openvpn-server.log # Степень детализации отладочной информации в логах (параметр от 0 до 9) verb 3 |
3)Остановимся подробнее на каталоге C:OpenVPNconfigccd. В нём создадим 2 файла с дополнительными персональными настройками для каждого клиента. Для 1-го клиента в этом каталоге нужно создать файл без расширения одноименного названия (client1), в который нужно вписать следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# маршрут для клиента client1, чтобы он мог видеть сеть за сервером, т.е. 192.168.16.0/24 push "route 192.168.16.0 255.255.255.0" # маршрут для клиента client1, чтобы видеть сеть другого клиента, т.е. 192.168.50.0/24 push "route 192.168.50.0 255.255.255.0" # Правило, разрешающее работу клиентам из сети 192.168.60.0/24 с сетью за vpn-сервером. iroute 192.168.60.0 255.255.255.0 # Чтобы отключить пользователя, нужно раскомментировать параметр disable. # disable |
Для второго клиента файл называется client2 и содержит:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# маршрут для клиента client2, чтобы видеть сеть за сервером, т.е. 192.168.16.0/24 push "route 192.168.16.0 255.255.255.0" # маршрут для клиента client2, чтобы видеть сеть другого клиента, т.е. 192.168.60.0/24 push "route 192.168.60.0 255.255.255.0" # Правило, разрешающее работу клиентов из сети 192.168.50.0/24 с сетью за vpn-сервером. iroute 192.168.50.0 255.255.255.0 # Отключить пользователя (для этого нужно раскомментировать параметр disable) # disable |
4)Содержание файла ipp.txt следующее:
1 2 |
client1,10.10.0.4 client2,10.10.0.8 |
Подробности см. в результатах выполнения команды:
1 |
openvpn.exe --show-valid-subnets |
5)Запускаем службу “OpenVPN service”.
6)Если все выполнено правильно, то в системной панели пропадет значок “Сетевой кабель не подключен” для интерфейса “TAP-Win32 Adapter V8”
7)В случае проблем, всю необходимую информацию можно получить из системных журналов.
Подготовка конфигурационных файлов клиентов.
1)Создаем каталог (c:\OpenVPN\config-clients), где будут храниться конфигурационные файлы (c:\OpenVPN\config-clients), сертификаты и ключи (c:\OpenVPN\config-clients\ssl) клиентов.
2)Перемещаем все созданные ранее сертификаты и ключи клиентов (см. в папке c:OpenVPNssl) в соответствующие клиентские каталоги, а так же копируем сертификат центра сертификации (ca.crt) и ta-ключ (ta.key).
В нашем примере, для клиента Client1 в каталоге c:\OpenVPN\config-clients\Client1\ssl должны находиться следующие файлы: ca.crt, ClientVPN1.crt, ClientVPN1.key, ta.key
Аналогично и для Client2
3)Создаем для клиента Client1 конфигурационный файл ClientVPN1.ovpn в папке c:\OpenVPN\config-clients\Client1. Редактируем его содержание:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
dev tun # Имя интерфейса # dev-node "OpenVPN Adapter" # Указываем, по какому протоколу будет работать клиент proto tcp # Адрес vpn-сервера remote 123.123.123.123 8888 # Метод добавления маршрутов # route-method exe # Пауза перед добавлением маршрутов (в секундах) route-delay 3 #Информацию о маршрутизации получать с сервера client # Признак клиентской конфигурации tls-client # Защита, от атаки "man in the middle" ns-cert-type server # Указываем пути к сертификатам и ключам клиента # Сертификат центра сертификации ca C:\OpenVPN\ssl\ca.crt # Сертификат клиента cert C:\OpenVPN\ssl\ClientVPN1.crt # Ключ клиента key C:\OpenVPN\ssl\ClientVPN1.key # Защита от DOS-атак (для клиента, после пути к ключу, ставим 1) tls-auth C:\OpenVPN\ssl\a.key 1 # Включаем сжатие comp-lzo tun-mtu 1500 tun-mtu-extra 32 mssfix 1450 ping-restart 60 ping 10 # Журнал состояния (перезаписывается ежеминутно) status C:\OpenVPN\log\openvpn-status-ClientVPN1.log # Системный журнал log C:\OpenVPN\log\openvp-ClientVPN1n.log # Степень детализации отладочной информации (от 0 до 9) в логах verb 3 |
4. Для второго клиента Client2, создаем файл ClientVPN2.ovpn в папке c:OpenVPNconfig-clientsClient2, где все, кроме названий файлов сертификатов и ключей, будет аналогично Client1.
Установка OpenVPN на клиенте client1 (client2 – аналогично).
1)В случае если клиентом является сервер удалённого подразделения, необходимо разрешить пересылку пакетов между интерфейсами. Для этого необходимо изменить ключ реестра
1 |
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters для параметра IPEnableRouter на “1” и необходимо перезагрузить компьютер. |
Это нужно сделать и для сервера в главном офисе.
Если клиентом является обычный удалённый пользователь, то в изменении ключа реестра нет необходимости.
Изменения в реестр следует вносить, если на сервере и/или клиенте не настроена служба “Маршрутизации и удаленного доступа”. Если же служба настроена, то все маршруты нужно прописать в разделе “статические маршруты”.
2)Устанавливаем OpenVPN в папку c:\OpenVPN
3)Копируем соответствующие сертификаты и ключи, т.е. все файлы из директории на сервере c:\OpenVPN\config-clients\Client1\ssl, в папку на клиенте c:\OpenVPN\ssl, а файл ClientVPN1.ovpn из директории на сервере c:\OpenVPN\config-clients\Client1 в папку c:\OpenVPN\config на клиенте.
4)Запускаем службу “OpenVPN Service”
5)Если все прописано правильно, то в системной панели пропадет значок “Сетевой кабель не подключен” для интерфейса “TAP-Win32 Adapter V8”
6)Аналогичная процедура и для client2. Разница только в ключах и сертификатах.
Последний штрих.
Для того чтобы конечные пользователи разных подсетей видели друг друга, им необходимо прописать постоянный маршрут в удаленную сеть.
Примечания:
- данный пример не стоит рассматривать, как единственно правильный;
- все вышеописанное работает на 100%;
- ответы на все вопросы всегда можно найти на сайте разработчиков;
- все вышеописанные процедуры можно автоматизировать, например, средствами WSH.