Организация каналов между офисами при помощи OpenVPN с дополнительной парольной защитой
OpenVPN пользуется заслуженной популярностью у системных администраторов, когда нужно быстро и эффективно соединить VPN-каналами удаленные офисы. Сегодня предлагаем вам статью нашего читателя в которой он расскажет вам как настроить безопасный канал между офисами с дополнительной парольной защитой на платформе Windows.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе
"Архитектура современных компьютерных сетей"
вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов.
На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
И так нам нужно организовать VPN канал между двумя офисами. Сеть Офис 1 (назовем его С_ОФ1) и Сеть Офис 2 (назовем его С_ОФ2).
Скажу сразу что в моем случае OpenVPN в обоих офисах установлен на Windows 7.
С_ОФ1 включает: Машина куда ставим OpenVPN Server имеет 2 сетевых интерфейса. Также на ней установлен прокси-сервер который раздает инет в локалку, тем самым являясь для всех машин в локалке основным шлюзом(192.168.0.100) 192.168.0.100 смотрит в сеть 192.168.1.2 смотрит в мир через роутер. Роутер имеет статический IP скажем 111.222.333.444. На роутере сделан проброс порта 1190 (в моем случае порт 1190 проброшена на 192.168.1.2) Пользователь в сети: 192.168.0.50
С_ОФ2 включает: Машина куда ставим OpenVPN Client имеет 2 сетевых интерфейса. Также на ней установлен прокси-сервер который раздает инет в локалку, тем самым являясь для всех машин в локалке основным шлюзом(172.17.10.10) 172.17.10.10смотрит в сеть 192.168.1.2 смотрит в мир через роутер. Пользователь в сети: 172.17.10.50
Задача: Пользователь С_ОФ1(192.168.0.50) должен видеть расшареные ресурсы на Пользователе С_ОФ2 (172.17.10.50) и наоборот.
Приступаем к настройке
Скачиваем OpenVPN с официального сайта в соответствии с разрядностью системы.
Запускаем установку, на 3-м шаге активируем неактивные пункты.
Следующий шаг - путь для установки. Чтобы облегчить себе дальнейшую жизнь, устанавливаем в корень диска С.
В процессе установки в систему инсталлируется виртуальный сетевой адаптер TAP-Win32 Adapter V9 и, соответственно, драйвер к нему. Этому интерфейсу программа OpenVPN как раз и будет назначать IP адрес и маску виртуальной сети OpenVPN. В нашем случае ему назначен адрес 10.10.10.1с маской 255.255.255.0 на сервере С_ОФ1 и 10.10.10.2 с аналогичной маской на клиенте С_ОФ2.
Переименуем его в "VPN"
В директории "C:\OpenVPN" следует сразу же создать дополнительно папку ssl (здесь мы будем хранить ключи аутентификации) папку ccd (здесь будут находится конфигурация настроек сервера для клиента).
В папке easy-rsa создаем файл vars.bat, данный пакетный файл будет задавать переменные для сеанса генерации сертификатов, в той части что касается организации и расположения заполняем своими данными.
1set HOME=C:\OpenVPN\easy-rsa
2set KEY_CONFIG=openssl-1.0.0.cnf
3set KEY_DIR=C:\OpenVPN\ssl
4set KEY_SIZE=1024
5set KEY_COUNTRY=RU
6set KEY_PROVINCE=Stavropol
7set KEY_CITY= Stavropol
8set KEY_ORG=ServerVPN
9set KEY_EMAIL=admin@localhost
10set KEY_CN=test
11set KEY_NAME=test
12set KEY_OU=test
13set PKCS11_MODULE_PATH=test
14set PKCS11_PIN=1234
Запускаем командную строку от имени администратора.
Переходим по пути C:\OpenVPN\easy-rsa, набрав для перехода в командной строке команду
1 cd C:\OpenVPN\easy-rsa
Запускаем vars.bat:
Далее запускаем clean-all.bat:
Теперь запускаем build-ca.bat. Так как вся информация о сервере у нас уже заполнена, все оставляем без изменений:
после этого у нас в папке ssl появится два файла ca.crt и ca.key.
Запускаем build-dh.bat:
в результате у нас в папке ssl появится файл dh1024.pem.
Создаем серверный ключ, для этого вводим команду:
1build-key-server.bat ServerVPN
где "ServerVPN" это название нащего VPN сервера, как в моем случае,
Важно! Указываем параметр "commonname" - пишем имя нашего VPN сервера. Все остальные параметры оставляем по умолчанию, на все вопросы отвечаем yes

в результате у нас в папке ssl появятся файлы ServerVPN.crt, ServerVPN.csr, ServerVPN.key.
Приступаем к формированию клиентских ключей.
Выполняем команду:
1build-key.bat UserVPN_1
где "UserVPN_1" имя нашего клиента.
Важно! Указываем параметр "commonname" - пишем имя нашего VPN клиента(UserVPN_1). Все остальные параметры оставляем по умолчанию, на все вопросы отвечаем yes

В результате у нас в папке ssl появятся файлы UserVPN_1.crt, UserVPN_1.csr, UserVPN_1.key.
Если у вас несколько клиентов, то повторяем формирование ключей; не забывая каждому клиенту присваивать свои имена
1build-key.bat UserVPN_2
2build-key.bat UserVPN_3
Генерация ключа tls-auth (ta.key) для аутентификации пакетов, для этого переходим в корневую папку OpenVPN:
1cd ..
и выполняем команду:
1openvpn --genkey --secret ssl/ta.key
в результате в папке ssl плучим файл ta.key.
Приступаем к созданию конфига сервера. В папке config создаем файл OpenVPN.ovpn:
1#Порт для работы OpenVPN
2port 1190
3
4#Указываем по какому протоколу работает OpenVPN
5proto udp
6
7#Тип интерфейса
8dev tun
9
10#Имя интерфейса
11dev-node "VPN"
12
13#Сертификат для шифрования подключения
14dh C:\\OpenVPN\\ssl\\dh1024.pem
15
16#Сертификат центра сертификации
17ca C:\\OpenVPN\\ssl\\ca.crt
18
19#Сертификат сервера
20cert C:\\OpenVPN\\ssl\\ServerVPN.crt
21
22#ключ сервера
23key C:\\OpenVPN\\ssl\\ServerVPN.key
24
25# Защита от DOS атак (для сервера, после пути к ключу, ставим 0 а для клиента 1)
26tls-server
27tls-auth C:\\OpenVPN\\keys\\ta.key 0
28tun-mtu 1500
29tun-mtu-extra 32
30mssfix 1450
31
32#Диапазон IP адресов для VPN сети
33server 10.10.10.0 255.255.255.0
34
35# Выбор криптографического шифра
36cipher AES-256-CBC
37
38#Логи
39status C:\\OpenVPN\\log\\openvpn-status.log
40log C:\\OpenVPN\\log\\openvpn.log
41
42#Каталог, в которой лежит файл с названием нашего клиента, в моем случае UserVPN_1 без расширения, и в нем записать команды, которые будут выполнятся на клиенте:
43client-config-dir "C:\\OpenVPN\\ccd"
44
45#Уровень отладочной информации
46verb 3
47
48#Количество повторяющихся сообщений
49mute 20
50
51# Максимальное количество одновременно подключенных клиенты мы хотим разрешить
52max-clients 2
53
54#Время жизни неактивной сессии
55keepalive 10 120
56
57#Разрешаем клиентам видеть друг друга
58client-to-client
59
60#Включаем сжатие
61comp-lzo
62persist-key
63persist-tun
64
65#Маршруты добавляются через .exe если без него, то не у всех прописываются маршруты
66route-method exe
67
68#Задержка перед добавлением маршрута
69route-delay 5
70
71#Команда которая сообщает клиентам что за сервером локальная сеть с адресами 192.168.0.0 255.255.255.0
72push "route 192.168.0.0 255.255.255.0"
73
74#Прописывает маршрут на сервере чтобы видеть сеть за клиентом
75route 172.17.10.0 255.255.255.0 10.10.10.2
76
77#Шлюз
78route-gateway 10.10.10.1
79
80# каждому клиенту выдается по 1 адресу, без виртуальных портов маршрутизатора
81topology subnet
В папке ccd создаем файл без расширения и называем его точно, как клиента UserVPN_1, открываем его блокнотом и пишем следующее:
1#Присваиваем клиенту постоянный IP 10.10.10.2
2ifconfig-push 10.10.10.2 255.255.255.0
3
4#сообщаем серверу что за клиентом сеть 172.17.10.0
5iroute 172.17.10.0 255.255.255.0
6
7#если раскоментировать следующую строку, то клиент будет отключен (на случай если нужно этого клиента отключить от сервера, а остальные будут работать)
8# disable
Создаем конфиг клиента.
1#Говорим, чтобы клиент забирал информацию о маршрутизации с сервера (push опции)
2client
3
4#Порт для работы OpenVPN
5port 1190
6
7#Указываем по какому протоколу работает OpenVPN
8proto udp
9
10#Тип интерфейса
11dev tun
12
13#Имя интерфейса
14dev-node "VPN"
15
16# Адрес сервера, к которому подключаемся
17remote 444.333.222.111 1190
18
19#защита
20remote-cert-tls server
21
22#Сертификат центра сертификации
23ca C:\\OpenVPN\\ssl\\ca.crt
24
25#Сертификат сервера
26cert C:\\OpenVPN\\ssl\\ UserVPN_1.crt
27
28#ключ
29key C:\\OpenVPN\\ssl\\ UserVPN_1.key
30
31# Защита от DOS атак
32tls-auth C:\\OpenVPN\\keys\\ta.key 1
33tun-mtu 1500
34tun-mtu-extra 32
35mssfix 1450
36ping-restart 60
37ping 10
38
39#Включаем сжатие
40comp-lzo
41persist-key
42persist-tun
43
44# Выбор криптографического шифра
45cipher AES-256-CBC
46
47#Логи
48status C:\\OpenVPN\\log\\openvpn-status.log
49log C:\\OpenVPN\\log\\openvpn.log
50
51#Уровень отладочной информации
52verb 3
53
54#Количество повторяющихся сообщений
55mute 20
Устанавливаем на клиенте OpenVPN, предаём ему ca.crt, UserVPN_1.crt, UserVPN_1.key, ta.key.
Настраиваем файрволы и антивирусы на клиенте и на сервере для беспрепятственного прохождения пакетов. Описывать не буду все зависит от установленных антивирусов и файрволов.
После всего этого запускаем наш сервер и клиент.
Если все правильно сделали наш сервер получит IP 10.10.10.1 и подключится к нему клиент и получит IP 10.10.10.2 . И так подключение у нас состоялось теперь сервер и клиент пингуют друг друга по IP нашей VPN сети, то есть 10.10.10.1 и 10.10.10.2.
Для того чтобы пинг шел по внутренним адресам наших С_ОФ1 и С_ОФ2 нужно включить службу Маршрутизации и удаленного доступа.
Hужно зайти в свойства службы, настроить ее на автоматическое включение и запустить.
После этого мы сможем пинговать внутренние IP сервера и клиента (172.17.10.10 клиент и 192.168.0.100 сервер).
Но у этого способа есть маленький недостаток: после включения этой службы и подключения к нашему VPN-каналу на значке сетевого подключения повиснет красный крест до отключения VPN.
При этом все сети работают в штатном режиме. Лично меня этот крест раздражает и иногда сбивает с толку.
Есть второй способ как сделать видимыми внутренние IP сетей наших сервера и клиента.
Для этого заходим в реестр, открываем ветку реестра:
1HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TcpIP\Parameters
Находим параметр и меняем значение: IPEnableRouter типа REG_DWORD значение 1.
Не забываем перезагрузить машину, чтобы настройки вступили в силу!
Это нужно проделать и на сервере, и на клиенте.
Итак мы пингуем наши сети по внутренним IP, а так как у нас и сервер и клиент для своих сетей являются шлюзами, то и машины из сети 1 могут видеть машины из сети 2 и наоборот. то есть Пользователь С_ОФ1(192.168.0.50) может видеть расшаренные папки Пользователя С_ОФ2 (172.17.10.50) и наоборот.
Если сервер и клиент не будут являться шлюзами для своих сетей, в том случае придётся прописывать маршруты руками.
Пример для С_ОФ1:
1route -p 172.17.10.0 255.255.255.0 192.168.0.100 (машина где установлен OpenVPN)
Пример для С_ОФ2:
1route -p 192.168.0.0 255.255.255.0 172.17.10.10(машина где установлен OpenVPN)
в моем случае этого не понадобилось.
Для автоматического запуска сервера и клиента нам нужно включить службу OpenVPN Service
теперь при загрузке машины сервер автоматически стартует, а при включении машины клиента он также автоматически подключится к серверу.
Дополнительная защита
Как известно в OpenVPN есть возможность аутентификации по сертификатам, как описано выше, а так же по логину и паролю, но можно еще и объединить их вместе. Насколько мне известно только в Linux есть возможность штатными средствами настроить аутентификацию по логину и паролю, но в Windows это тоже можно решить. Для этого в папке config создаем файл auth.vbs и пишем в него следующее
1'VBscript auth.vbs для аутентификации в OpenVPN - auth-user-pass-verify auth.vbs via-file
2'(c) 2007 vinni http://forum.ixbt.com/users.cgi?id=info:vinni
3'Support: http://forum.ixbt.com/topic.cgi?id=14:49976
4' в скрипте производится сравнение имени пользователя без учёта регистра.
5' Если нужно иначе - уберите UCase(...) в 2 или 4 местах
6On Error Resume Next
7' открываем файл, имя которого передано OpenVPN-ом в скрипт через параметр
8Set fso = CreateObject("scripting.filesystemobject")
9Set CurrentUserPasswordFile = fso.OpenTextFile(WScript.Arguments(0),1) '1 = for reading
10if Err.Number<>0 Then WScript.Quit(1)
11' читаем из этого файла 2 строки - имя и пароль, которые ввёл пользователь "на том конце"
12if CurrentUserPasswordFile.AtEndOfStream then WScript.Quit(1)
13UserName=CurrentUserPasswordFile.ReadLine
14if CurrentUserPasswordFile.AtEndOfStream then WScript.Quit(1)
15Password=CurrentUserPasswordFile.ReadLine
16CurrentUserPasswordFile.Close
17' открываем переменную окружения common_name (это CN предъявленного клиентом сертификата)
18' и сравниваем её с введенным именем пользователя.
19' если это сравнение не нужно, то следующие 2 строки удалить или закомменировать
20CurrentCommonName = CreateObject("Wscript.Shell").ExpandEnvironmentStrings("%common_name%")
21if UCase(CurrentCommonName) <> UCase(UserName) then WScript.Quit(1)
22' открываем наш файл с базой логинов и паролей
23' по умолчанию это Users.pw в текущем каталоге
24Set UserPasswordFileBase = fso.OpenTextFile("Users.pw",1) '1 = for reading
25if Err.Number<>0 Then WScript.Quit(1)
26' читаем в цикле пары строк, пропуская пустые МЕЖДУ ЭТИМИ ПАРАМИ,
27' и сравниваем их с тем, что ввёл пользователь.
28Do while not(UserPasswordFileBase.AtEndOfStream)
29 NextUserName=UserPasswordFileBase.ReadLine
30 if Err.Number<>0 Then WScript.Quit(1)
31 if NextUserName<>"" then
32' если имя пользователя надо сравнивать с учётом регистра, то удалите здесь UCase(...)
33 if UCase(UserName)=UCase(NextUserName) then
34 if Password=UserPasswordFileBase.ReadLine then
35' если имя и пароль совпали с парой из базы, то завершаем скрипт с результатом 0
36' так нужно для OpenVPN'a, это признак успешной аутентификации
37 UserPasswordFileBase.Close
38 WScript.Quit(0)
39 end if
40 else
41 UserPasswordFileBase.ReadLine
42 end if
43 end if
44Loop
45' если поиск завершился безуспешно, то завершаем скрипт с результатом 1
46' так нужно для OpenVPN'a, это признак НЕуспешной аутентификации
47UserPasswordFileBase.Close
48WScript.Quit(1)
Так же в папке config содаем файл Users.pw туда пише логин и пароль нашего клиента
1UserVPN_1
2123456
Если несколько клиентов то:
1UserVPN_1
2123456
3
4UserVPN_2
5365214
6
7UserVPN_3
814578
Дальше нужно в конфиге клиента прописать строку auth-user-pass, теперь когда клиент будет подключаться к серверу у него будет выплывать окно авторизации где нужно ввести логин и пароль, который вы назначили ему в Users.pw,их нужно будет сообщить клиенту.
У меня настроено что имя пользователь(логин) соответствует имени клиента в сертификате, то есть UserVPN_1. но можно задать и другое имя отличное от имени в сертификате, для этого нужно смотреть настройки в auth.vbs.
1' открываем переменную окружения common_name (это CN предъявленного клиентом сертификата)
2' и сравниваем её с введенным именем пользователя.
3' если это сравнение не нужно, то следующие 2 строки удалить или закомменировать
4
5CurrentCommonName = CreateObject("WscrIPt.Shell").ExpandEnvironmentStrings("%common_name%")
6if UCase(CurrentCommonName) <> UCase(UserName) then WScrIPt.Quit(1)
7WScrIPt.Echo "Debug: CurrentCommonName= " & CurrentCommonName
А для того чтобы аутентификация работала и по сертификату, и по логину с паролем, но при этом не выплывало окно авторизации пользователя, так как это будет задерживать подключение клиента к серверу если, например, у вас включена автоматическая загрузка службы OpenVPN Service (как настроено у меня) или вы просто не хотите каждый раз вводить логин и пароль, в этом случае на клиенте в папке ssl создаем файл pass.txt и пишем в него наш логин и пароль вот так:
1UserVPN_1
2123456
а в конфиге клиента меняем строку auth-user-pass на auth-user-pass C:\OpenVPN\ssl\pass.txt.
Теперь я включаю машину где установлен OpenVPN -Server, запускается служба и сервер VPN автоматически поднимается. Клиент запускает машину и у него также проходит автоматическое подключение к моему серверу. Теперь можно заходить в общие папки или по RDP работать, например, в 1С, установленной в другой организации.
Автор: Чурилов Александр Андреевич,
дата написания 31.03.2015.
контакты re-anim@mail.ru
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе
"Архитектура современных компьютерных сетей"
вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов.
На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Помогла статья? Поддержи автора и новые статьи будут выходить чаще: