Организация каналов между офисами при помощи OpenVPN на платформе Linux

  • Автор:

OpenVPN-channels-linux-000.pngТак уж получилось, что за все время существования нашего ресурса мы ни разу не обращались к теме OpenVPN на платформе Linux. Несмотря на то, что это кроссплатформенный продукт, наши публикации, а точнее публикации наших авторов затрагивали только Windows платформу, поэтому мы решили устранить этот досадный недостаток и заодно самостоятельно проработать данную тему. Кроме того, данный материал, как и все наши материалы, органично связан с другими публикациями, что позволит легко вписать данный сервис в инфраструктуру созданную на основе наших статей.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Прежде всего несколько слов о том, что такое OpenVPN - это свободная реализация технологии виртуальной частной сети (VPN) с открытым исходным кодом. Что это значит для простого пользователя? Прежде всего независимость от вендора и лицензионную чистоту данного решения, а также способность работать на любой платформе, даже на недорогих роутерах, если они позволяют использовать альтернативные прошивки (OpenWrt и т.п.).

Следует понимать, что OpenVPN не накладывает каких-либо ограничений на платформы для работы сервера и клиентов, вы можете без проблем объединить в единую сеть устройства с разными ОС и аппаратными платформами и все это будет работать.

Отдельного внимания заслуживают богатые сетевые возможности продукта, который может успешно работать даже в сложных сетевых конфигурациях, не допускающих прохождения некоторых видов трафика (например, мобильные операторы), а также возможность автоматической конфигурации узлов сети, в т.ч. настройки маршрутов.

Схема сети и маршрутизация

Мы специально не стали разворачивать для OpenVPN отдельную конфигурацию в наше лаборатории, а воспользовались уже существующими виртуальными машинами. В качестве сервера центрального офиса мы использовали роутер на базе Ubunutu Server 14.04 LTS, за которым находится сеть 192.168.31.0/24, в которой находится рабочая станция под управлением Windows 10. В филиале OpenVPN установлен на сервер с Debian 8, который принадлежит сети 192.168.18.0/24, в которой находится рабочая станция с Windows 8.1 и которая выходит в интернет через простой роутер начального уровня.

OpenVPN-channels-linux-001.png

Таким образом мы реализовали два основных варианта, когда машина с OpenVPN является шлюзом сети и когда она установлена на одном из узлов, что требует разной настройки маршрутизации.

Рассмотрим первый случай. Так как OpenVPN находится на шлюзе сети, то каких-либо дополнительных настроек маршрутизации нам делать не надо, все пакеты, не принадлежащие локальной сети, все равно будут отправлены шлюзу, а задачу их маршрутизации на самом шлюзе мы возложим на OpenVPN. В частности, нам нужно будет отправить пакеты к сети 192.168.18.0/24 на другой конец туннеля.

В случае, когда OpenVPN расположен на одном из узлов сети ситуация несколько иная. Так, например, пакеты к сети 192.168.31.0/24 будут также направлены шлюзу, который их просто отбросит, так как диапазоны частных сетей ("серые" IP) не маршрутизируются. Поэтому нам потребуется явно задать маршрут к OpenVPN, который передаст эти пакеты дальше, согласно собственных настроек маршрутизации, а именно OpenVPN серверу. Это можно сделать, прописав соответствующий маршрут на роутере сети, либо, если роутер не позволяет этого сделать, непосредственно на каждой рабочей станции.

В нашем случае потребуется маршрут (на роутере или на клиентах):

192.168.31.0 mask 255.255.255.0 192.168.18.131

который будет направлять все пакеты к сети 192.168.31.0 узлу с установленным OpenVPN, дальнейшая маршрутизация на другой конец туннеля будет выполняться также силами OpenVPN.

Мы настоятельно рекомендуем прорабатывать данный вопрос перед развертыванием VPN-сети, чтобы у вас уже на этом этапе было полное понимание ее структуры и схемы маршрутизации между ее узлами. Более подробную информацию по данному вопросу можно получить в статье: Организация VPN каналов между офисами. Маршрутизация.

Настройка сервера OpenVPN

Прежде всего установим необходимые пакеты:

apt-get install openvpn easy-rsa

Пакет easy-rsa предназначен для создания и управления сертификатами и по сути представляет собой автономный центр сертификации (CA), поэтом следует принять меры по недопущению доступа сторонних лиц к закрытым ключам CA. В тоже время мы считаем избыточными советы по выносу центра сертификации на отдельный хост, в небольших сетях это может оказаться более небезопасно, чем размещение на роутере, к которому имеет доступ только администратор.

Скопируем рабочую директорию easy-rsa в папку с настройками OpenVPN:

cp -r /usr/share/easy-rsa /etc/openvpn

В своей работе easy-rsa использует библиотеку openssl и содержит конфигурационные файлы для разных версий библиотеки. В современных системах повсеместно используется openssl-1.0.x поэтому сразу делаем символическую ссылку на нужный конфигурационный файл:

ln -s /etc/openvpn/easy-rsa/openssl-1.0.0.cnf  /etc/openvpn/easy-rsa/openssl.cnf

Теперь откроем файл /etc/openvpn/easy-rsa/vars и отредактируем в нем следующие строки, указав собственные учетные данные, например, так:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="BEL"
export KEY_CITY= "Belgorod"
export KEY_ORG="Interface LLC"
export KEY_EMAIL="admin@interface31.lab"
export KEY_OU="Office"

Сохраним файл и перейдем к созданию собственного CA, для этого перейдем в директорию easy-rsa и загрузим переменные:

cd /etc/openvpn/easy-rsa
source ./vars

Затем произведем очистку и инициализацию нашего центра сертификации:

./clean-all
./build-ca

Первая команда произведет полную очистку рабочей директории с ключами и служебными файлами и ее случайное выполнение на работающем CA приведет к его уничтожению. Вторая команда создаст комплект из открытого и закрытого ключей центра сертификации.

OpenVPN-channels-linux-002.pngВ процессе создания ключа вы будете получать вопросы, ответы по умолчанию на которые содержатся в квадратных скобках и основаны на ваших данных из файла vars, поэтому просто подтверждаем их нажатием Enter (или вводим свои значения).

После выполнения данной операции в папке /etc/openvpn/easy-rsa/keys появятся файлы ca.crt и ca.key. Первый является сертификатом с публичным ключом и должен присутствовать на всех узлах OpenVPN сети, а файл с расширением .key - закрытый (приватный) ключ и доступ к нему должен быть ограничен. Файл ca.key нужен исключительно для работы центра сертификации и не должен никуда копироваться или передаваться, особенно по незащищенным каналам.

Закончив с центром сертификации перейдем к формированию ключей и сертификатов сервера. Но сначала создадим файл параметров Диффи-Хеллмана. Данный алгоритм шифрования используется для обеспечения режима прямой секретности, которая сводится к тому, что даже если злоумышленник получит ключи, то он не сможет расшифровать перехваченные ранее данные, так как они зашифрованы с уникальным сеансовым ключом, который нигде не сохраняется.

./build-dh

Результатом выполнения данной команды будет появление в директории с ключами файла dh2048.pem, который нужен только серверу, но в тоже время секретным он не является.

Наконец сформируем ключи собственно для сервера:

./build-key-server server

где server - имя ключа и сертификата сервера, мы рекомендуем давать осмысленные названия, например, по имени узла, чтобы потом не пришлось гадать, для какого именно сервера или клиента предназначен тот или иной сертификат или ключ.

В процессе генерации вам также придется подтвердить параметры из файла vars, либо указать свои, в конце вы получите два вопроса о подписи и выпуске сертификата, на оба отвечаем утвердительно.

OpenVPN-channels-linux-003.pngТеперь перейдем к настройке самого OpenVPN. Прежде всего создадим директорию для хранения ключей, несмотря на то, что можно указать пути к папке с ключами easy-rsa, мы все-таки советуем хранить серверные ключи отдельно.

mkdir /etc/openvpn/keys

Перейдем в папку с ключами easy-rsa и скопируем необходимые ключи и сертификаты:

cd /etc/openvpn/easy-rsa/keys
cp ca.crt dh2048.pem server.crt server.key /etc/openvpn/keys

Затем распакуем и скопируем в /etc/openvpn шаблон файла конфигурации:

gzip -d /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn

Напомним, чтобы не набирать длинные пути можно воспользоваться автодополнением по клавише Tab.

Откроем данный файл (/etc/openvpn/server.conf) и перейдем к его редактированию, если не указано иное, то приведенные ниже опции следует найти и привести к указанному виду, при необходимости раскомментировав. Опции перечислены в порядке их следования в файле.

port 1194
proto udp
dev tun

Данные опции установлены по умолчанию и задают порт, протокол и тип туннеля, менять их не следует, однако на плохих каналах иногда имеет смысл использовать протокол tcp. Ниже добавим опцию, указывающую топологию создаваемой VPN-сети:

topology subnet

Затем найдем и откорректируем пути к ключам и сертификатам:

ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh2048.pem

Синтаксис конфигурационного файла допускает указание относительных путей, в этом случае корневой будет считаться папка /etc/openvpn.

Зададим диапазон OpenVPN сети:

server 10.8.0.0 255.255.255.0

Следующая опция указывает файл для хранения выданных клиентам IP-адресов, так как OpenVPN прекрасно умеет назначать адреса мы не видим смысла делать это вручную:

ifconfig-pool-persist ipp.txt

Укажем путь к директории с конфигурационными файлами, выполняемыми при подключении клиента:

client-config-dir ccd

Затем перейдем к настройкам маршрутизации. Прежде всего укажем шлюз по умолчанию для OpenVPN сети, которым должен являться сервер:

route-gateway 10.8.0.1

Зададим маршрут к клиентской сети, если сетей несколько - то строк тоже должно быть несколько. Данная опция указывает OpenVPN при запуске создать маршруты в системе для указанных подсетей для направления предназначенных им пакетов в туннель.

route 192.168.18.0 255.255.255.0

Передадим всем клиентам аналогичную команду, но для сети за сервером:

push "route 192.168.31.0 255.255.255.0"

Установим параметры проверки активности:

keepalive 10 120

Данная опция устанавливает интервал проверки узла (10 сек) и время после которого, при отсутствии ответа, клиент считается неактивным.

Укажем тип применяемого шифрования, на выбор предлагается три вида шифра, но Triple-DES имеет самые большие накладные расходы, поэтому выбирать следует между Blowfish и AES. Однозначно дать рекомендации здесь трудно, но следует учитывать, что AES де-факто является промышленным стандартом и аппаратно поддерживается в процессорах Intel.

cipher AES-128-CBC

Включим сжатие:

comp-lzo

В целях безопасности понизим права запущенного сервера:

user nobody
group nogroup

При этом обязательно проконтролируйте наличие следующих опций, которые обеспечивают правильную работу с ресурсами после понижения прав:

persist-key
persist-tun

Укажем расположение логов:

status /var/log/openvpn-status.log
log /var/log/openvpn.log

Следующие опции задают подробность лога и количество повторяющихся в логе сообщений:

verb 3 
mute 20

Для отладки проблем с подключением уровень лога следует поднять до 5-6.

На этом настройка сервера закончена, сохраняем файл конфигурации и создаем директорию для конфигураций клиентов, иначе получите ошибку при запуске службы:

mkdir /etc/openvpn/ccd

Теперь можно попробовать запустить сервер:

service openvpn start

Убедимся в наличии сетевого интерфейса туннеля командой

ip a

OpenVPN-channels-linux-004.png

И проверим таблицу маршрутизации:

ip route

OpenVPN-channels-linux-005.png

Как видим - необходимые маршруты добавлены автоматически.

Настройка клиента OpenVPN

Настройка клиента начинается на сервере с генерации ключевой пары. Для этого снова перейдем в директорию easy-rsa и загрузим переменные (если вы создаете клиентские ключи одновременно с серверными, то повторно загружать переменные не нужно).

cd /etc/openvpn/easy-rsa
source ./vars

Выполним генерацию клиентских ключей и сертификатов командой:

./build-key client1

где client1 - имя ключа и сертификата.

На компьютер клиента нам нужно передать ca.crt, client1.crt и client1.key, последний файл является секретным и не должен передаваться в открытом виде по незащищенным каналам.

Также создадим в папке ccd файл с инструкциями для клиента, которые будут выполнены при его подключении. Имя файла должно совпадать с именем сертификата клиента, точнее с полем CN в нем, если вы не меняли это поле при создании ключевой пары оно будет соответствовать имени файла сертификата.

touch /etc/openvpn/ccd/client1

Откроем этот файл и внесем в него строки:

iroute 192.168.18.0 255.255.255.0

Данная команда создает маршрут в OpenVPN сети, направляя пакеты предназначенные сети 192.168.18.0 на внутренний адрес данного клиента. В таблице маршрутов ОС данный маршрут не отображается, но без него маршрутизация в OpenVPN сети правильно работать не будет.

Теперь, взяв с собой необходимые ключи и сертификаты, переместимся на клиентский компьютер. В нашем случае это сервер с установленным Debian 8.

Установим необходимые пакеты:

apt-get install openvpn

Создадим директорию для ключей и разместим в ней ключи и сертификаты:

mkdir /etc/openvpn/keys

Скопируем файл с шаблоном конфигурации клиента:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn

И перейдем к его редактированию:

client
dev tun
proto udp

Данные опции задают режим - клиент, тип туннеля и протокол, последние должны совпадать с указанными на сервере.

Затем укажем адрес и порт нашего сервера:

remote ovpn.example.com 1194

Вместо доменного имени можно указывать IP-адрес, например, так:

remote 111.222.333.444 1194

Следующая опция предписывает бесконечное число попыток разрешить доменное имя сервера OpenVPN, рекомендуется для клиентов с нестабильным подключением к сети.

resolv-retry infinite

Понижаем права службы после запуска (если конфигурационный файл предназначен для Windows-машин данные опции не нужны):

user nobody
group nogroup

Обязательно проверяем наличие:

persist-key
persist-tun

Указываем расположение ключей и сертификатов:

ca keys/ca.crt
cert keys/client1.crt
key keys/client1.key

Следующая опция предотвращает потенциальные атаки класса "человек посередине":

ns-cert-type server

Затем укажем тип шифрования, он должен совпадать с тем, что вы указали на сервере:

cipher AES-128-CBC

Включаем сжатие:

comp-lzo

Задаем расположение логов и их детализацию:

status /var/log/openvpn-status.log
log /var/log/openvpn.log

verb 3
mute 20

Сохраняем файл конфигурации и запускаем службу с явным указанием клиента, в противном случае будет выполнена попытка найти и запустить конфиг сервера:

service openvpn@client start

Также убеждаемся в том, что туннельный интерфейс создался и необходимые маршруты добавлены:

OpenVPN-channels-linux-006.pngНа скриншоте выше несложно заметить маршрут в сеть 192.168.31.0 через туннель, но так как данный компьютер не является шлюзом сети, то нам нужно будет добавить на шлюзе или клиентских ПК маршрут к сети 192.168.31.0 через локальный адрес данного компьютера, о чем мы говорили в начале статьи.

Например, мы добавили такой маршрут на клиентском ПК c Windows 8.1:

route add -p 192.168.31.0 mask 255.255.255.0 192.168.18.131

После чего без каких-либо проблем смогли получить доступ к компьютерам в сети офиса (добавленный вручную маршрут мы выделили на скриншоте).

OpenVPN-channels-linux-007.pngА также в обратном направлении.

OpenVPN-channels-linux-008.pngОбратите внимание, что в этом случае никаких дополнительных маршрутов к сети 192.168.18.0 на клиентском ПК прописывать нет необходимости.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

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


  1. Настраиваем VPN. Часть 1 - Общие вопросы
  2. Настраиваем VPN. Часть 2 - Cтруктура сети
  3. Настраиваем VPN сервер. Часть 3 - PPTP. Платформа Linux
  4. Настраиваем VPN сервер. Часть 4 - PPTP. Платформа Windows
  5. Настраиваем VPN сервер. Часть 5 - L2TP. Платформа Windows
  6. Ubuntu Server. Форвардинг PPTP средствами iptables
  7. Организация VPN каналов между офисами при помощи OpenVPN
  8. Организация каналов между офисами при помощи OpenVPN с дополнительной парольной защитой
  9. Организация VPN каналов между офисами. Маршрутизация
  10. Организация каналов между офисами при помощи OpenVPN на платформе Linux
  11. Настройка OpenVPN-сервера для доступа в интернет
  12. Настройка двух и более OpenVPN-серверов на одном сервере
  13. Почему тормозит OpenVPN? Размер буферов приема и отправки
  14. Как настроить несколько одновременных OpenVPN подключений в Windows
  15. SSH-туннели на службе системного администратора
  16. Создание ключей и сертификатов для OpenVPN при помощи Easy-RSA 3
  17. Настройка OpenVPN-сервера на роутерах Mikrotik
  18. Настройка VPN-подключения в роутерах Mikrotik
  19. OpenVPN объединяем ключи и конфигурацию клиента в один файл
  20. OpenVPN и инфраструктура открытых ключей (PKI)
  21. Настройка OpenVPN-сервера на роутерах Mikrotik
  22. Настраиваем IKEv2 VPN-сервер на роутерах Mikrotik с аутентификацией по сертификатам
  23. Настраиваем PPTP или L2TP VPN-сервер при помощи RRAS в Windows Server
  24. Автоматическое добавление маршрутов для VPN-соединения в Windows

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments