Все ленты — последние статьи

Организация VPN каналов между офисами.

Организация VPN каналов между филиалами компании имеет большое значение в работе любого IT-специалиста. В данной статье рассматривается один из способов реализации этой задачи на основе программного продукта OpenVPN.

Ниже мы рассмотрим топологию сети, в которой будем организовывать VPN-туннель, разберем особенности конфигурирования программы OpenVPN и пошагово настроим маршрутизацию для наших офисов. Статья написана из расчета, что OpenVPN будет устанавливаться на платформы Windows 7 и Windows Server 2008.


Топология сети.

Использованная нами сетевая топология стандартна. Имеется Сеть Центрального Офиса (назовем её СЦО) и Сеть Филиала (назовем её СФ). Стоит задача соединить офисы таким образом, чтобы конечный пользовательский компьютер (далее ПК1) офиса СЦО имел доступ к общим ресурсам пользовательского компьютера (далее ПК2) СФ.

CЦО имеет в своем составе:
  • Интернет-шлюз (назовем его ИШ1) с двумя сетевыми интерфейсами:
    • 111.111.111.111 — выдаётся провайдером, смотрит в интернет.
    • 192.168.0.1 — назначается нами, смотрит в СЦО.
  • OpenVPN Сервер (далее ОС) на котором будем поднимать OpenVPN с одним виртуальным и одним физическим интерфейсом:
    • 10.8.0.1 — адрес виртуального интерфейса (интерфейс устанавливается в процессе установки программы OpenVPN). Адрес для этого интерфейса назначается программой. Мы с вами не должны менять адрес самостоятельно из управления сетевыми адаптерами.
    • 192.168.0.2 — физический интерфейс, параметры задаются нами, смотрит в СЦО.
  • ПК1 — пользовательский компьютер 1, с сетевым интерфейсом 192.168.0.3, смотрит аналогично в СЦО.
СФ имеет в своем составе:
  • Интернет-шлюз (далее ИШ2) с двумя сетевыми интерфейсами:
    • 222.222.222.222 — выдаётся провайдером, смотрит в интернет.
    • 192.168.1.2 — назначается нами, смотрит в СФ.
  • OpenVPN Клиент (далее ОК) на котором будем поднимать OpenVPN с одним виртуальным и одним физическим интерфейсом:
    • 10.8.0.2 — адрес виртуального сетевого интерфейса (интерфейс устанавливается в процессе установки программы OpenVPN). Адрес для этого интерфейса так же назначается программой OpenVPN.
    • 192.168.1.2 — физический интерфейс, параметры задаются нами, смотрит в СФ.
  • ПК2 — пользовательский компьютер 2, с сетевым интерфейсом 192.168.1.3, смотрит в СФ.
Настраиваем OpenVPN сервер.
Теперь перейдем к самой программе, основам и особенностям её конфигурирования. OpenVPN доступен в вариантах для Linux и Windows. Вы можете скачать установочный пакет на сайте разработчика.
Сам процесс инсталлирования не вызовет никаких проблем. Единственное, стоит отключить антивирус на время установки, дабы избежать дополнительных проблем. На момент написания статьи, к примеру, продукты Лаборатории Касперского не блокировали установку, а лишь выводили подозрение на некоторые устанавливаемые компоненты.
В процессе установки в систему инсталлируется виртуальный сетевой адаптер TAP-Win32 Adapter V9 и, соответственно, драйвер к нему. Этому интерфейсу программа OpenVPN как раз и будет назначать ip адрес и маску виртуальной сети OpenVPN. В нашем случае ему назначен адрес 10.8.0.1 с маской 255.255.255.0 на сервере ОС и 10.8.0.2 с аналогичной маской на клиенте ОК.
По стандарту программа устанавливается в C:\ProgramFiles\OpenVPN. В этой директории следует сразу же создать дополнительно папку keys (здесь мы будем хранить ключи аутентификации) папку ccd (здесь будут находится конфиги настроек сервера для клиента).
В директории C:\ProgramFiles\OpenVPN\sample-config представлены стандартные конфиги. Конфиги, которые мы будем создавать, должны размещаться в директории C:\Program Files\OpenVPN\config.
Настройка OpenVPN начинается с генерации ключей. Генерируемые ключи делятся на:
  • главный CertificateAuthority (CA) сертификат и ключ, используемый для подписывания каждого сертификата сервера и клиента.
  • публичный и приватный ключи для сервера и каждого (это важно) клиента отдельно.
Последовательность создания ключей следующая (названия файлов сертификатов и ключей указаны в скобках):
  • Генерируем основной CA (ca.crt) сертификат и CA (ca.key) ключ.
  • Генерируем сертификат (server.crt) и ключ (server.key) сервера.
  • Генерируем сертификат (office1.crt) и ключ (office1.key) для клиента.
  • Генерация параметров DiffieHellman (dh1024.pem).
  • Генерация ключа tls-auth (ta.key) для аутентификации пакетов.
Разберем каждый пункт более подробно.
Генерируем основной сертификат СА и СА ключ:
Заходим в Пуск — Выполнить набираем cmd, жмем OK, заходим в командную строку. Пишем:
cd C:/Program Files/OpenVPN/easy-rsa
Таким образом мы находимся в директории easy-rsa:
Во время выполнения всех пунктов генерации ключей вы должны находиться именно в ней. Выполняем команду:
init-config
Не закрывая командную строку, зайдем в C:\ProgramFiles\OpenVpn\easy-rsa и отредактируем файл vars.bat, заполнив следующие параметры (указав, естественно, свои данные):
KEY_COUNTRY=RF
KEY_PROVINCE=MO
KEY_CITY=Malinino
KEY_ORG =Organization
Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.">KEY_EMAIL=Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Теперь создадим СА сертификат и СА ключ. Раскрываем командную строку, которая все это время висела где то на рабочем столе, и продолжаем вписывать команды:
vars
clean-all
build-ca
Последняя команда как раз и выполняет генерацию СА сертификата и СА ключа. В процессе создания ключа вам будут задавать вопросы, на которые вы можете отвечать просто нажатием Enter'a (тогда значения будут браться из файла vars.bat который мы редактировали выше) или же вводить свои. Стоит обратить внимание на вопрос:
Common Name (eg, your name or your server's hostname) []: OpenVPNS
Здесь вы должны задать название для сервера — в примере мы ввели OpenVPNS.
Генерируем сертификат (server.crt) и ключ (server.key) сервера.

Не выходя из директории, в нашей командной строке продолжим вводить команды. Сгенерируем сертификат сервера и ключа командой:
build-key-server server
На вопросы отвечаем так же как в первом пункте. На вопрос:
Common Name *: server
Введем: server. На вопросы:
Sign the certificate? [y/n]
и
1 out of 1 certificate requests certified, commit? [y/n]
надо дать положительный ответ: Y.
Генерируем сертификат (office1.crt) и ключ (office1.key) для клиента.
Очевидно, что клиентов может быть много, в нашем примере он один — office1. В зависимости от количества клиентов следующая команда в командной строке выполняется несколько раз, причем названия генерируемых ключей так же меняйте:
build-key office1
если требуется еще сертификаты и ключи, скажем для второго клиента, то вводим:
build-key office2
В процессе ответа на вопросы не забывайте, что каждый клиент на вопрос CommonName должен получить уникальное имя, например: office1, office2 и т.д.
Генерация параметров DiffieHellman (dh1024.pem).
Вводим в командной строке, находят во все той же директории easy-rsa:
build-dh
Генерация ключа tls-auth (ta.key) для аутентификации пакетов
В конце создаем ключ для tls-аутификации командой:
openvpn --genkey -secret ta.key
Теперь разберемся с тем, какие файлы оставлять на сервере, а какие перенести клиенту. На сервере (OC) должны находиться в созданной нами папке keys только следующие файлы:
  • ca.crt
  • ca.key
  • dh1024.pem
  • server.crt
  • server.key
  • ta.key
На клиенте OK аналогично серверу ОС создадим так же папочку keys, там должны быть:
  • ca.crt
  • office1.crt
  • office1.key
  • ta.key
Все файлы с расширением .key являются секретными. Передавать их стоит только по защищенным каналам, лучше на физическим носителе.
Далее приступим к созданию конфига для нашего сервера ОС и клиента ОК. В директории config создаем файл со следующим названием и расширением: server.ovpn Открываем его блокнотом и начинаем писать конфиг:
Выбираем протокол для передачи данных — в данном случае upd:
proto udp
Стандартный порт для OpenVPN:
port 1194
Режим работы программы L3-туннель. В данном режиме OpenVPN — роутер:
dev tun
Режим клиент-сервер:
tls-server
Данного топология доступна с версии 2.1 и заключается в том что каждому клиенту выдается по 1 адресу, без виртуальных портов маршрутизатора:
Topology subnet
Маршруты добавляются через .exe — это важно:
route-method exe
Задержка при добавлении маршрута, можно уменьшить до 5:
route-delay 10
Данная опция задает организацию сети. У нас появляется виртуальная сеть 10.8.0.0 /24. Первый адрес из этой сети, то есть 10.8.0.1 выдается серверу, последующие (10.8.0.2, 10.8.0.3 и т.д.) клиентам. DHPC сервер получает адрес 10.8.0.254:
server 10.8.0.0 255.255.255.0
Задаем шлюз в openvpn сеть:
route-gateway 10.8.0.1
Директория, в которой мы должны расположить файл с названием нашего клиента, то есть office1 без расширения, и в нем записать команды, которые будут выполнятся на клиенте:
client-config-dir "C:\\ProgramFiles\\OpenVPN\\ccd"
Далее идут пути до файлов сертификатов и ключей сервера. Заметим, что пути обязательно пишутся с двойной чертой, а именно \\:
сa "C:\\Program Files\\OpenVPN\\keys\\ca.crt" 
cert "C:\\Program Files\\OpenVPN\\keys\\server.crt"
key "C:\\Program Files\\OpenVPN\\keys\\server.key"
dh "C:\\Program Files\\OpenVPN\\keys\\dh1024.pem"
tls-auth "C:\\Program Files\\OpenVPN\\keys\\ta.key"
Задаем серверу ОС маршрут на всю сеть:
route 10.8.0.0 255.255.255.0 
Выбираем метод сжатия:
cipher BF-CBC
Задаем сжатие трафика:
comp-lzo
OpenVPN передает системе регистраций событий программы не критические ошибки сети. На практике это уменьшит содержимое статус-окна, появляющегося при запуске сервера OpenVPN:
verb1
Cервер пингует противоположную сторону с интервалом в 10 секунд и если сторона не отвечает за 60 секунд, то сервер запустит пересоединение:
keepalive 5 60
Далее переходим в директорию ccd и создаем файл, в котором будут лежать команды, посылаемые клиенту от сервера. Назвать его надо так же как мы называли самого клиента, например office1. Файл не будет иметь расширения.
Редактируем его через блокнот. Все параметры, заданные ниже, будут автоматически переданы клиенту:
Задаем ip и маску для нашего клиента office1:
ifconfig-push 10.8.0.2 255.255.255.0
Передаем ему маршрут на всю сеть:
push "route 10.8.0.0 255.255.255.0"
Задаем для него шлюз:
push "route-gateway 10.8.0.1"
Эта команда говорит серверу ОС о том, что за данным клиентом, а именно ОК (office1) находится сеть 192.168.1.0:
iroute 192.168.1.0 255.255.255.0
Таким образом, мы закончили конфигурирование сервера на стороне ОС.
Настройка клиента.
Далее приступим к изменению параметров клиента. Зайдем на машине ОК в папку config. Создадим в ней файл office1.ovpn Приступим к его редактированию, ряд опций повторяет аналогичные на сервере, поэтому мы их пояснять не будем:
dev tun
proto udp
port 1194
Указываем внешний адрес ИШ1:
remote 111.111.111.111
Клиент будет в работать в режиме тлс-клиента:
tls-client 
Эта опция защищает от подмены сервера третьим лицом:
remote-cert-tls server
Эти опции аналогичны серверу:
route-method exe
route-delay 10 
Задаем маршрут к сети 192.168.0.0:
route 192.168.0.0 255.255.255.0
Этой командой разрешаем прием конфигурации клиента с сервера:
pull
Пути к ключам:
ca "C:\\Program Files\\OpenVPN\\keys\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\keys\\office1.crt"
key "C:\\Program Files\\OpenVPN\\keys\\office1.key"
tls-auth "C:\\Program Files\\OpenVPN\\keys\\ta.key"
Остальные опции также аналогичны серверу:
cipher BF-CBC
comp-lzo
verb 1
keepalive 5 60
На этом настройка программы на стороне клиента ОК закончена.
Настройка брандмауэра и маршрутизация.
И так, мы имеем настроенные конфиги на ОК и на ОС. Теперь разберем очень важные моменты. Заранее оговоримся, если вы использует KIS 2011 или подобные антивирусные программы, то в настройках сетевого экрана следует разрешить прохождение ICMP пакетов. Это позволит беспрепятственно пинговать хосты в наших сетях.
Так же стоит добавить наш виртуальный интерфейс программы OpenVPN в список доверенных сетей.
На ИШ1 должны быть проделаны следующие действия:
  • Настроено перенаправление порта 1194 протокола UDP с интерфейса 111.111.111.111 на интерфейс сервер ОС 192.168.0.2
  • В файерволе должна быть разрешена передача по порту 1194 протокола UDP, иначе пинг не будет проходить даже между ОС и ОК.
На ИШ2 надо предпринять аналогичные действия:
  • Настроить перенаправление порта 1194 протокола UDP с интерфейса 222.222.222.222 на интерфейс клиента ОК 192.168.1.2
  • Проверить, открыт ли порт 1194 протокола UDP в файерволе.
В Usergate 5.2, к примеру, настройка форвардинга пакетов по порту 1194 протокола UDP выглядит так:
На этом этапе мы уже пингуем ОК и ОС по их OpenVPN адресам, то есть 10.8.0.1 и 10.8.0.2. Далее нам необходимо обеспечить правильный маршрут пакетов с клиента ОК до удаленной сети 192.168.0.0. Делаем это одним из нескольких способов:
Либо задаем постоянный маршрут до этой сети на самом клиенте ОК:
route -p add 192.168.0.0 mask 255.255.255.0 10.8.0.1
Либо задаем этот маршрут в ccd конфиге клиента на сервер, а именно в файле office1 допишем:
push "route 192.168.0.0 255.255.255.0"
Так же это можно сделать, добавив строку напрямую в конфиг клиента ОК:
route 192.168.0.0 255.255.255.0
Но мы бы не рекомендовали загружать его, а делать все на стороне сервера.
Затем необходимо обеспечить маршрут пакетов с сервера ОС до удаленной сети 192.168.1.0. делается это аналогично варианту выше за несколькими исключениями.
Добавляем команду в конфиг сервера ОС:
route 192.168.1.0 255.255.255.0 10.8.0.2 
или же добавляем команду непосредственно в командной строке:
route -p add 192.168.1.0 mask 255.255.255.0 10.8.0.2
Так же необходимо на сервере ОС и клиенте ОК включить в службах службу Маршрутизации и удаленного доступа, таким образом обеспечив маршрутизацию на внутреннюю сеть (форвардинг). Без этого внутренние адреса в сетях СЦО И СФ клиента ОК и сервера ОС не будут пинговаться.
На этом этапе мы уже свободно можем пинговать внутренние адреса наших ОС и ОК, т.е. набирая на сервере ОС ping 192.168.1.2 и на клиенте ОК ping 192.168.0.2 мы получаем положительный результат в виде:
Таким образом ОК и ОС взаимно пингуются по своим OpenVPN и внутренним СЦО и СФ адресам. Дальше нам надо прописать маршрут в командной строке в сеть 10.8.0.0 на наших ПК1 и ПК2. Делается это следующими командами:
Для ПК1:
route -p add 192.168.1.0 mask 255.255.255.0 192.168.0.2
Для ПК2:
route -p add 192.168.0.0 mask 255.255.255.0 192.168.1.2
В результате расшаренные ресурсы в ПК1 и ПК2 будут доступны по их внутрисетевому адресу:

Дополнительные материалы: