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, данный пакетный файл будет задавать переменные для сеанса генерации сертификатов, в той части что касается организации и расположения заполняем своими данными.
set HOME=C:\OpenVPN\easy-rsa
set KEY_CONFIG=openssl-1.0.0.cnf
set KEY_DIR=C:\OpenVPN\ssl
set KEY_SIZE=1024
set KEY_COUNTRY=RU
set KEY_PROVINCE=Stavropol
set KEY_CITY= Stavropol
set KEY_ORG=ServerVPN
set KEY_EMAIL=admin@localhost
set KEY_CN=test
set KEY_NAME=test
set KEY_OU=test
set PKCS11_MODULE_PATH=test
set PKCS11_PIN=1234
Запускаем командную строку от имени администратора.
Переходим по пути C:\OpenVPN\easy-rsa, набрав для перехода в командной строке команду
cd C:\OpenVPN\easy-rsa
Запускаем vars.bat:
Далее запускаем clean-all.bat:
Теперь запускаем build-ca.bat. Так как вся информация о сервере у нас уже заполнена, все оставляем без изменений:
после этого у нас в папке ssl появится два файла ca.crt и ca.key.
Запускаем build-dh.bat:
в результате у нас в папке ssl появится файл dh1024.pem.
Создаем серверный ключ, для этого вводим команду:
build-key-server.bat ServerVPN
где "ServerVPN" это название нащего VPN сервера, как в моем случае,
Важно! Указываем параметр "commonname" - пишем имя нашего VPN сервера. Все остальные параметры оставляем по умолчанию, на все вопросы отвечаем yes
в результате у нас в папке ssl появятся файлы ServerVPN.crt, ServerVPN.csr, ServerVPN.key.
Приступаем к формированию клиентских ключей.
Выполняем команду:
build-key.bat UserVPN_1
где "UserVPN_1" имя нашего клиента.
Важно! Указываем параметр "commonname" - пишем имя нашего VPN клиента(UserVPN_1). Все остальные параметры оставляем по умолчанию, на все вопросы отвечаем yes
В результате у нас в папке ssl появятся файлы UserVPN_1.crt, UserVPN_1.csr, UserVPN_1.key.
Если у вас несколько клиентов, то повторяем формирование ключей; не забывая каждому клиенту присваивать свои имена
build-key.bat UserVPN_2
build-key.bat UserVPN_3
Генерация ключа tls-auth (ta.key) для аутентификации пакетов, для этого переходим в корневую папку OpenVPN:
cd ..
и выполняем команду:
openvpn --genkey --secret ssl/ta.key
в результате в папке ssl плучим файл ta.key.
Приступаем к созданию конфига сервера. В папке config создаем файл OpenVPN.ovpn:
#Порт для работы OpenVPN
port 1190
#Указываем по какому протоколу работает OpenVPN
proto udp
#Тип интерфейса
dev tun
#Имя интерфейса
dev-node "VPN"
#Сертификат для шифрования подключения
dh C:\\OpenVPN\\ssl\\dh1024.pem
#Сертификат центра сертификации
ca C:\\OpenVPN\\ssl\\ca.crt
#Сертификат сервера
cert C:\\OpenVPN\\ssl\\ServerVPN.crt
#ключ сервера
key C:\\OpenVPN\\ssl\\ServerVPN.key
# Защита от DOS атак (для сервера, после пути к ключу, ставим 0 а для клиента 1)
tls-server
tls-auth C:\\OpenVPN\\keys\\ta.key 0
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
#Диапазон IP адресов для VPN сети
server 10.10.10.0 255.255.255.0
# Выбор криптографического шифра
cipher AES-256-CBC
#Логи
status C:\\OpenVPN\\log\\openvpn-status.log
log C:\\OpenVPN\\log\\openvpn.log
#Каталог, в которой лежит файл с названием нашего клиента, в моем случае UserVPN_1 без расширения, и в нем записать команды, которые будут выполнятся на клиенте:
client-config-dir "C:\\OpenVPN\\ccd"
#Уровень отладочной информации
verb 3
#Количество повторяющихся сообщений
mute 20
# Максимальное количество одновременно подключенных клиенты мы хотим разрешить
max-clients 2
#Время жизни неактивной сессии
keepalive 10 120
#Разрешаем клиентам видеть друг друга
client-to-client
#Включаем сжатие
comp-lzo
persist-key
persist-tun
#Маршруты добавляются через .exe если без него, то не у всех прописываются маршруты
route-method exe
#Задержка перед добавлением маршрута
route-delay 5
#Команда которая сообщает клиентам что за сервером локальная сеть с адресами 192.168.0.0 255.255.255.0
push "route 192.168.0.0 255.255.255.0"
#Прописывает маршрут на сервере чтобы видеть сеть за клиентом
route 172.17.10.0 255.255.255.0 10.10.10.2
#Шлюз
route-gateway 10.10.10.1
# каждому клиенту выдается по 1 адресу, без виртуальных портов маршрутизатора
topology subnet
В папке ccd создаем файл без расширения и называем его точно, как клиента UserVPN_1, открываем его блокнотом и пишем следующее:
#Присваиваем клиенту постоянный IP 10.10.10.2
ifconfig-push 10.10.10.2 255.255.255.0
#сообщаем серверу что за клиентом сеть 172.17.10.0
iroute 172.17.10.0 255.255.255.0
#если раскоментировать следующую строку, то клиент будет отключен (на случай если нужно этого клиента отключить от сервера, а остальные будут работать)
# disable
Создаем конфиг клиента.
#Говорим, чтобы клиент забирал информацию о маршрутизации с сервера (push опции)
client
#Порт для работы OpenVPN
port 1190
#Указываем по какому протоколу работает OpenVPN
proto udp
#Тип интерфейса
dev tun
#Имя интерфейса
dev-node "VPN"
# Адрес сервера, к которому подключаемся
remote 444.333.222.111 1190
#защита
remote-cert-tls server
#Сертификат центра сертификации
ca C:\\OpenVPN\\ssl\\ca.crt
#Сертификат сервера
cert C:\\OpenVPN\\ssl\\ UserVPN_1.crt
#ключ
key C:\\OpenVPN\\ssl\\ UserVPN_1.key
# Защита от DOS атак
tls-auth C:\\OpenVPN\\keys\\ta.key 1
tun-mtu 1500
tun-mtu-extra 32
mssfix 1450
ping-restart 60
ping 10
#Включаем сжатие
comp-lzo
persist-key
persist-tun
# Выбор криптографического шифра
cipher AES-256-CBC
#Логи
status C:\\OpenVPN\\log\\openvpn-status.log
log C:\\OpenVPN\\log\\openvpn.log
#Уровень отладочной информации
verb 3
#Количество повторяющихся сообщений
mute 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 сетей наших сервера и клиента.
Для этого заходим в реестр, открываем ветку реестра:
HKEY_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:
route -p 172.17.10.0 255.255.255.0 192.168.0.100 (машина где установлен OpenVPN)
Пример для С_ОФ2:
route -p 192.168.0.0 255.255.255.0 172.17.10.10(машина где установлен OpenVPN)
в моем случае этого не понадобилось.
Для автоматического запуска сервера и клиента нам нужно включить службу OpenVPN Service
теперь при загрузке машины сервер автоматически стартует, а при включении машины клиента он также автоматически подключится к серверу.
Дополнительная защита
Как известно в OpenVPN есть возможность аутентификации по сертификатам, как описано выше, а так же по логину и паролю, но можно еще и объединить их вместе. Насколько мне известно только в Linux есть возможность штатными средствами настроить аутентификацию по логину и паролю, но в Windows это тоже можно решить. Для этого в папке config создаем файл auth.vbs и пишем в него следующее
'VBscript auth.vbs для аутентификации в OpenVPN - auth-user-pass-verify auth.vbs via-file
'(c) 2007 vinni http://forum.ixbt.com/users.cgi?id=info:vinni
'Support: http://forum.ixbt.com/topic.cgi?id=14:49976
' в скрипте производится сравнение имени пользователя без учёта регистра.
' Если нужно иначе - уберите UCase(...) в 2 или 4 местах
On Error Resume Next
' открываем файл, имя которого передано OpenVPN-ом в скрипт через параметр
Set fso = CreateObject("scripting.filesystemobject")
Set CurrentUserPasswordFile = fso.OpenTextFile(WScript.Arguments(0),1) '1 = for reading
if Err.Number<>0 Then WScript.Quit(1)
' читаем из этого файла 2 строки - имя и пароль, которые ввёл пользователь "на том конце"
if CurrentUserPasswordFile.AtEndOfStream then WScript.Quit(1)
UserName=CurrentUserPasswordFile.ReadLine
if CurrentUserPasswordFile.AtEndOfStream then WScript.Quit(1)
Password=CurrentUserPasswordFile.ReadLine
CurrentUserPasswordFile.Close
' открываем переменную окружения common_name (это CN предъявленного клиентом сертификата)
' и сравниваем её с введенным именем пользователя.
' если это сравнение не нужно, то следующие 2 строки удалить или закомменировать
CurrentCommonName = CreateObject("Wscript.Shell").ExpandEnvironmentStrings("%common_name%")
if UCase(CurrentCommonName) <> UCase(UserName) then WScript.Quit(1)
' открываем наш файл с базой логинов и паролей
' по умолчанию это Users.pw в текущем каталоге
Set UserPasswordFileBase = fso.OpenTextFile("Users.pw",1) '1 = for reading
if Err.Number<>0 Then WScript.Quit(1)
' читаем в цикле пары строк, пропуская пустые МЕЖДУ ЭТИМИ ПАРАМИ,
' и сравниваем их с тем, что ввёл пользователь.
Do while not(UserPasswordFileBase.AtEndOfStream)
NextUserName=UserPasswordFileBase.ReadLine
if Err.Number<>0 Then WScript.Quit(1)
if NextUserName<>"" then
' если имя пользователя надо сравнивать с учётом регистра, то удалите здесь UCase(...)
if UCase(UserName)=UCase(NextUserName) then
if Password=UserPasswordFileBase.ReadLine then
' если имя и пароль совпали с парой из базы, то завершаем скрипт с результатом 0
' так нужно для OpenVPN'a, это признак успешной аутентификации
UserPasswordFileBase.Close
WScript.Quit(0)
end if
else
UserPasswordFileBase.ReadLine
end if
end if
Loop
' если поиск завершился безуспешно, то завершаем скрипт с результатом 1
' так нужно для OpenVPN'a, это признак НЕуспешной аутентификации
UserPasswordFileBase.Close
WScript.Quit(1)
Так же в папке config содаем файл Users.pw туда пише логин и пароль нашего клиента
UserVPN_1
123456
Если несколько клиентов то:
UserVPN_1
123456UserVPN_2
365214UserVPN_3
14578
Дальше нужно в конфиге клиента прописать строку auth-user-pass, теперь когда клиент будет подключаться к серверу у него будет выплывать окно авторизации где нужно ввести логин и пароль, который вы назначили ему в Users.pw,их нужно будет сообщить клиенту.
У меня настроено что имя пользователь(логин) соответствует имени клиента в сертификате, то есть UserVPN_1. но можно задать и другое имя отличное от имени в сертификате, для этого нужно смотреть настройки в auth.vbs.
' открываем переменную окружения common_name (это CN предъявленного клиентом сертификата)
' и сравниваем её с введенным именем пользователя.
' если это сравнение не нужно, то следующие 2 строки удалить или закомменировать
CurrentCommonName = CreateObject("WscrIPt.Shell").ExpandEnvironmentStrings("%common_name%")
if UCase(CurrentCommonName) <> UCase(UserName) then WScrIPt.Quit(1)
WScrIPt.Echo "Debug: CurrentCommonName= " & CurrentCommonName
А для того чтобы аутентификация работала и по сертификату, и по логину с паролем, но при этом не выплывало окно авторизации пользователя, так как это будет задерживать подключение клиента к серверу если, например, у вас включена автоматическая загрузка службы OpenVPN Service (как настроено у меня) или вы просто не хотите каждый раз вводить логин и пароль, в этом случае на клиенте в папке ssl создаем файл pass.txt и пишем в него наш логин и пароль вот так:
UserVPN_1
123456
а в конфиге клиента меняем строку 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.
Последние комментарии