Так уж получилось, что за все время существования нашего ресурса мы ни разу не обращались к теме 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 является шлюзом сети и когда она установлена на одном из узлов, что требует разной настройки маршрутизации.
Рассмотрим первый случай. Так как 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 приведет к его уничтожению. Вторая команда создаст комплект из открытого и закрытого ключей центра сертификации.
В процессе создания ключа вы будете получать вопросы, ответы по умолчанию на которые содержатся в квадратных скобках и основаны на ваших данных из файла 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. Прежде всего создадим директорию для хранения ключей, несмотря на то, что можно указать пути к папке с ключами 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
И проверим таблицу маршрутизации:
ip route
Как видим - необходимые маршруты добавлены автоматически.
Настройка клиента 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
Также убеждаемся в том, что туннельный интерфейс создался и необходимые маршруты добавлены:
На скриншоте выше несложно заметить маршрут в сеть 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
После чего без каких-либо проблем смогли получить доступ к компьютерам в сети офиса (добавленный вручную маршрут мы выделили на скриншоте).
А также в обратном направлении.
Обратите внимание, что в этом случае никаких дополнительных маршрутов к сети 192.168.18.0 на клиентском ПК прописывать нет необходимости.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии