Как организовать VPN канал между офисами с помощью OpenVPN
Всем привет сегодня в статье мы подробно рассмотрим как настроить VPN канал между офисами с помощью OpenVPN с возможностью дополнительной парольной защитой. Не для кого не секрет, что OpenVPN в последнее время стал очень популярен во многих организациях, и дело тут не в том, что он полностью бесплатен, а дело в эффективности, с помощью которой можно соединить VPN-каналами удаленные офисы. Настраивать мы будет VPN туннель между офисами с дополнительной парольной защитой на платформе Windows.
Задача: Настроить VPN канал между двумя филиалами вашей компании. Сеть в первом филиале называется N_B1) и сеть во втором филиале N_B2. Установка OpenVPN в обоих офисах будет на ОС Windows 7. Приступим к выполнению поставленной задачи.
Network N_B1 содержит:
Компьютер или сервер, где устанавливается сервер OpenVPN, имеет 2 сетевых интерфейса, один как вы можете понять для wan ip адреса, а второй для внутренней сети..
Также на ней установлен proxy сервер который раздает инет в локальную сеть, тем самым являясь для всех машин в локальной сети основным шлюзом (192.168.2.100)
192.168.2.100 смотрит в локальную сеть 192.168.2.3 данный интерфейс смотрит в интернет через маршрутизатор, который имеет статический IP скажем 123.123.123.123. На нем сделан форвардинг или как его еще называют проброс порта 1190 (для примера порт 1190 проброшен на сетевом интерфейсе с ip адресом 192.168.2.3)
Пользователь в сети имеет 192.168.2.100
Network N_B2 содержит:
Компьютер или сервер, где устанавливается клиент OpenVPN, так же имеет 2 сетевых интерфейса.
Также на ней установлен proxy сервер который раздает интернет в локальную сеть, тем самым являясь для всех машин в локальной сети основным шлюзом(172.17.10.10)
172.17.10.10 смотрит в локальную сеть
192.168.2.3 смотрит в мир через маршрутизатор.
Пользователь в сети: 172.17.10.50
Задача: Человек из офиса с сетью N_B1 (192.168.2.100) должен видеть общие ресурсы на компьютере человека из сети N_B2 (172.17.10.50) и в обратном направлении.
Другими словами каждый каждого должен видеть и иметь возможность заходить в гости, вдруг кто фотки новые расшарит посмотреть своему коллеге из другого branche.
Приступаем к настройке
Загружаем OpenVPN с официального сайта, главное выберите правильную разрядность Windows, сам по себе дистрибутив очень легкий.
Запускаем установку OpenVPN, на 3-м шаге ставим птички OpenSSL Utilites и OpenVPN RSA Certificate Management Scripts.
Следующий шаг - путь для установки. Чтобы облегчить себе дальнейшую жизнь, устанавливаем в корень диска С.
Во время установки в ОС будет добавлен virtual network adapter TAP-Win32 Adapter V9, и дополнительный драйвер для него. Данному сетевому интерфейсу OpenVPN как раз и будет выдавать IP адрес и маску виртуальной сети OpenVPN. У нас назначен адрес 10.10.10.1 с маской 255.255.255.0 на сервере N_B1 и 10.10.10.2 с такой же маской на клиенте N_B2.
Переименуем его в "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 сервера, как в моем случае,
в результате у нас в папке ssl появятся файлы ServerVPN.crt, ServerVPN.csr, ServerVPN.key.
Приступаем к формированию клиентских ключей.
Выполняем команду:
build-key.bat UserVPN_1
где "UserVPN_1" имя нашего клиента.
В результате у нас в папке 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
#Сертификат для шифрования подключения
dh C:\\OpenVPN\\ssl\\dh1024.pem
#Сертификат центра сертификации
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.
Для того чтобы пинг шел по внутренним адресам наших N_B1 и N_B2 нужно включить службуМаршрутизации и удаленного доступа.
Hужно зайти в свойства службы, настроить ее на автоматическое включение и запустить.
После этого мы сможем пинговать внутренние IP сервера и клиента (172.17.10.10 клиент и 192.168.2.100 сервер).
Но у этого способа есть маленький недостаток: после включения этой службы и подключения к нашему VPN-каналу на значке сетевого подключения повиснет красный крест до отключения VPN.
При этом все сети работают в штатном режиме. Лично меня этот крест раздражает и иногда сбивает с толку.
Есть второй способ как сделать видимыми внутренние IP сетей наших сервера и клиента.
Для этого заходим в реестр, открываем ветку реестра:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TcpIP\Parameters
Находим параметр и меняем значение: IPEnableRouter типа REG_DWORD значение 1.
Не забываем перезагрузить машину, чтобы настройки вступили в силу!
Это нужно проделать и на сервере, и на клиенте.
Итак мы пингуем наши сети по внутренним IP, а так как у нас и сервер и клиент для своих сетей являются шлюзами, то и машины из сети 1 могут видеть машины из сети 2 и наоборот. то есть Пользователь N_B1 (192.168.2.100) может видеть расшаренные папки Пользователя N_B2 (172.17.10.50) и наоборот.
Если сервер и клиент не будут являться шлюзами для своих сетей, в том случае придётся прописывать маршруты руками.
Пример для N_B1:
route -p 172.17.10.0 255.255.255.0 192.168.2.100 (машина где установлен OpenVPN)
Пример для N_B2:
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 123456
UserVPN_2 365214
UserVPN_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С, установленной в другой организации.
Материал сайта pyatilistnik.org
Хороший пример реализации.
все хорошо и подробно расписано за исключением настройки клиента.
с этим набором файлов ca.crt, UserVPN_1.crt, UserVPN_1.key, ta.key клиент не стартует.
Статья Хорошая.
Да, вариант нерабочий. чего-то не хватает
Спасибо величайшее, лучший мануал!