Установка и настройка OpenVPN на Ubuntu/CentOS

В сегодняшней статье речь пойдет о создании собственного VPN сервера на основе OpenVPN - технологии создающей виртуальные частные сети между сервером и его клиентами. OpenVPN является свободным ПО и доступно для всех желающих.

vpn openvpn linux windowsVPN (Virtual Private Network) - Виртуальная частная сеть, технология позволяющая создавать виртуальные сети поверх сети интернет. Поскольку к сети подключаются только доверенные пользователи, такая сеть называется частной.

В наше время VPN активно используется не только для защиты трафика, но и для обхода блокировок и цензуры в сети интернет.

При использовании VPN обращение к сетевым узлам происходит c ip-адреса VPN-сервера. Объединяя своих клиентов в локальную сеть, VPN-сервер не только связывает пользователей друг с другом, но и играет роль шлюза для выхода во внешнюю сеть. Возвращение ответного трафика происходит в обратном порядке, сначала VPN-сервер, потом конечный клиент.

В данной статье мы рассмотрим установку и настройку OpenVPN сервера на операционных системах CentOS и Ubuntu.

Установка OpenVPN

Для работы OpenVPN требуется поддержка TUN/TAP. Поэтому для OpenVPN подходят не все типы виртуализации VPS/VDS. Hапример, подходит KVM и не подходит OpenVZ. Хотя в OpenVZ и существует возможность включения TUN/TAP устройств, но не все хостинг-провайдеры ее предоставляют. Это лучше уточнить заранее, перед оформлением услуги.

Поддержку TUN проверяют командой ls -l /dev/net/tun, вывод будет примерно такой.

Переходим к установке OpenVPN. Хочу заметить, что из системных репозиториев Ubuntu и CentOS устанавливаются разные версии Openvpn. В Ubuntu устанавливается устаревшая версия 2.3.10, а в CentOS более свежая 2.4.4.

Все действия описаны от root-пользователя.

В Ubuntu

Устанавливаем OpenVPN вместе с центром сертификации easy-rsa.

Копируем каталог easy-rsa в домашний каталог пользователя.

В CentOS

Для установки OpenVPN нужно добавить EPEL - репозиторий.

Устанавливаем OpenVPN вместе с центром сертификации easy-rsa.

Копируем каталог easy-rsa в домашний каталог пользователя.

Удостоверяющий центр, сертификаты и ключи

Переходим в каталог openvpn-ca.

Сначала я редактирую файл vars, подставляя свои переменные. Я делаю это для того, чтобы при создании ключей и сертификатов не заполнять значения вручную.

Нужно изменить эти несколько строк.

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

Во время выполнения будет выдано напоминание, что если следом будет выполнена команда ./clean-all, то каталог keys будет очищен.

Команда ./clean-all выполняется для очищения каталога keys от старых сертификатов и ключей, а также создания серийного и индексного файлов для новых.

Центр сертификации CA

Создадим сертификат и ключ центра сертификации CA. Если переменные были заданы заранее, то прописывать значения не нужно, во всех строках просто нажимаем Enter.

В каталоге keys появятся файлы ca.crt и ca.key.

  • ca.crt - сертификат удостоверяющего центра CA. Должен быть и на сервере, и у клиента.
  • ca.key - приватный ключ CA. Должен храниться только на сервере, секретный.

Сертификат и ключ сервера

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

Во время выполнения нужно подписать и заверить сертификат - ввести "y" и нажать Enter. Challenge password задавать не нужно, просто нажимаем Enter.

В каталоге keys появятся файлы server.crt и server.key.

  • server.crt - сертификат сервера, находится на сервере.
  • server.key - ключ сервера, находится на сервере, секретный.

Ключ Diffie Hellman

Создадим ключ Diffie Hellman’а.

По завершению генерации ключа в каталоге keys появится файл dh2048.pem. Если в команде не задана длина шифрования, то по умолчанию будет создан 2048-битный файл.

  • dh2048.pem - файл параметров Diffie Hellman’а, храниться только на сервере.

Ключ HMAC

Создадим ключ HMAC, для дополнительной TLS-аутентификации и защиты от DoS-атак и флуда.

В каталоге keys появится файл ta.key.

  • ta.key - ключ несущий в себе код аутентификации для проверки подлинности сообщений. Должен быть и на сервере и на клиенте. При использовании ключа в конфигурации сервера указывается вместе со значением 0, в клиентской конфигурации указывается со значением 1.

Сертификаты и ключи клиентов

Создадим сертификат и ключ клиента. Каждому клиенту нужно создавать отдельную пару (сертификат + ключ). Вместо username подставить имя пользователя.

Для примера создадим пару (сертификат + ключ) с именем client.

Подписываем и заверяем сертификат - y + Enter. Challenge password не задаем, просто нажимаем Enter.

В каталоге keys появятся файлы client.crt и client.key.

  • client.crt - сертификат клиента, находится у клиента.
  • client.key - ключ клиента, находится у клиента, секретный.

Если спустя какое-то время нужно будет создать дополнительные клиентские сертификаты, то выполняем без очистки каталога keys.

Для конфигураций сервера и клиента нужны следующие файлы:

  • server.crt - сертификат сервера, только сервер.
  • server.key - ключ сервера, только сервер.
  • dh2048.pem - ключ DH, только сервер.
  • ca.crt - корневой CA-сертификат, сервер + клиент.
  • ta.key - HMAC ключ, сервер + клиент.
  • client.crt - сертификат клиента, только клиент.
  • client.key - ключ клиента, только клиент.

Пять верхних файлов должны быть на сервере, четыре нижних должны быть переданы клиенту.

Создадим каталог server-keys в /etc/openvpn.

Перейдем в каталог keys и скопируем из него нужные файлы.

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

Теперь необходимо создать конфигурационный файл server.conf. Образец файла можно просмотреть в следующих каталогах:

  • /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/server.conf - в CentOS
  • /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz - в Ubuntu

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

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

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

Ключи и сертификаты

Указываем расположение файлов ключей и сертификатов, которые перед этим были скопированы в каталог /etc/openvpn/server-keys.

После ta.key, на сервере добавляем 0, на клиентах добавляем 1.

Порт сервера

Указываем значение порта на котором будет работать сервер. По умолчанию OpenVPN использует 1194 порт, но его можно изменить на любой другой. Я рекомендую использовать 443, хотя бы потому, что его использование не может быть заблокировано.

Если Openvpn установлен на чистый VPS/VDS, то 443 порт не будет занят. Но при установке на машину уже использующуюся, данный порт может быть занят web-сервером.

Узнать какие порты и какой программой используются на текущий момент, можно с помощью утилиты netstat. Вот так выглядит отчет на чистой системе, кроме ssh ничего нет.

Протокол TCP/UDP

Указываем протокол передачи пакетов, по умолчанию udp.

Про различия UDP и TCP можно прочитать на Википедии. Здесь будет достаточно сказать что UDP работает быстрее чем TCP, а TCP надежнее чем UDP. Поскольку в VPN-сетях прежде всего важна скорость передачи данных, то выбор UDP в качестве протокола по умолчанию, очевиден.

TUN/TAP интерфейсы

Зададим тип сетевого интерфейса, TUN или TAP, который будет создаваться при запуске openvpn и использоваться для передачи данных. Про отличия TUN/TAP читаем Википедию, а использовать будем TUN, как задано по умолчанию.

Рабочая подсеть

Зададим подсеть сервера, диапазон которой будет использоваться для выдачи адресов клиентам. По умолчанию в настройках OpenVPN используется подсеть 10.8.0.0/24, которая может быть изменена на любую из частных подсетей.

  • 10.0.0.0
  • 172.16.0.0
  • 192.168.0.0

Подсети могут использоваться с масками /8, /16, /24 или 255.0.0.0, 255.255.0.0, 255.255.255.0, соответственно. Подробнее про частные подсети можно прочитать тут.

С используемыми подсетями не все просто, иногда появляются конфликты адресов.

Представьте что вы используете подсеть с адресом 192.168.0.0/24, в таком случае ваш шлюз будет иметь адрес 192.168.0.1. А теперь представьте что вы находитесь в каком-нибудь месте с публичным Wi-Fi, и пытаетесь подключиться к своей VPN-сети через него. Если Wi-Fi сеть будет использовать такой же диапазон адресов, что и ваша, то возникнет конфликт в маршрутизации. Ваше устройство просто не будет знать кто есть кто, точнее к кому относится шлюз, к Wi-Fi сети или к вашему VPN-серверу.

Этого можно избежать назначив рабочей подсетью сервера что-нибудь более оригинальное чем распространенное 192.168.0.0/24. Например можно использовать 172.16.150.0/24.

Указываем клиентам что в качестве шлюза по умолчанию нужно использовать шлюз VPN-сервера. Если этого не сделать то весь трафик будет ходить во внешнюю сеть с вашего адреса, даже при активном VPN-соединении.

Сжатие трафика

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

В версии OpenVPN ниже чем 2.4.+ (устанавливается в Ubuntu), следует использовать comp-lzo. Опция должна быть указана и на сервере, и на клиенте.

При использовании OpenVPN выше чем 2.4.+ (устанавливается в CentOS), в конфигурации на стороне сервера следует использовать:

А на стороне клиента указывают comp-lzo.

Если сжатие активировано, то следует добавить опцию mssfix, чтобы скрыть VPN fingerprint, но об этом немного позже. Пока просто добавим mssfix и укажем дефолтное значение равное 0.

Ведение логов

Чтобы вести логи сервера создадим каталог openvpn в /var/log.

В конфигурацию сервера добавим следующие строки.

В первом файле ведется учет клиентских подключений к серверу. Те самые логи "отсутствием" которых заманивают пользователей VPN-сервисы. Что впрочем не мешает им выдавать логи клиентов по первому обращению из соответствующих структур. Во втором файле отмечается статус сервера.

Чтобы регулировать подробность логов добавляют опцию verb, значения могут варьироваться от 0 до 9, чем больше значение, тем подробнее запись. По умолчанию достаточно значения 3.

Также можно указать значение mute, которое будет приглушать повтор записи одинаковых сообщений в логи, по умолчанию 20.

Не более 20-и одинаковых сообщений, все последующие в игнор.

Остальные настройки

При перезапуске OpenVPN не изменять tun/tap устройства и не перепроверять файлы ключей.

Опция keepalive отвечает за пинг клиентов и перезапуск туннеля. Например, каждые 10 секунд пинговать клиента, если в течении 120 секунд ответа от клиента не будет, то перезапускать туннель.

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

Запускаем OpenVPN сервер и добавляем его в автозагрузку.

После запуска сервера должен появиться tun интерфейс.

Настройка Файрвола

Осталось включить форвардинг пакетов и настроить iptables. Сначала включим пересылку трафика между интерфейсами.

Для OpenVPN нужно настроить фаервол: разрешить входящие подключения к 443 порту, разрешить прохождение транзитных пакетов, настроить преобразование адресов SNAT.

Разрешаем подключения на 443-ем порту.

Разрешаем прохождение транзитных пакетов из подсети OpenVPN.

Настраиваем SNAT. Локальный ip-адрес пакетов выходящих из подсети OpenVPN будет заменен на внешний ip-адрес вашего сервера.

Естественно это не все правила iptables, а только необходимые для работы OpenVPN. Подробнее про настройку netfilter/iptables можно прочитать здесь.

Про настройку клиента под Windows читаем здесь.