Настройка OpenVPN-сервера с туннелированием интернет-трафика на Ubuntu 12.04 / Debian 7

OpenVPN - открытая реализация технологии виртуальных частных сетей (VPN - Virtual Private Network), предназначенной для создания защищенных виртуальных локальных сетей между группой территориально удаленных клиентов поверх публичного канала передачи данных (интернет). Этот инструмент отлично подходит для таких задач, как безопасное сетевое подключение извне к серверу без предоставления публичного интернет-доступа к нему. Безопасность соединения достигается за счет шифрования канала с помощью OpenSSL.

Содержание:

Как работает OpenVPN?

После завершения настройки OpenVPN сервер сможет принимать и перенаправлять внешние защищенные SSL сетевые подключения к созданному при запуске VPN-сервиса виртуальному сетевому удаптеру (tun/tap), не затрагивая правила обработки трафика других интерфейсов (внешний интернет-адаптер и др.) Благодаря этой технологии вы можете обеспечить себе доступ к удаленному серверу и находящейся в его локальной сети группе устройств даже в том случае, если основной интернет-адаптер этого сервера не принимает входящие подключения из публичных сетей и/или не осуществляет их маршрутизацию до необходимых машин, находящихся в его LAN-сети.

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

Требования к системе

Прежде чем приступить к установке OpenVPN, убедитесь что на вашем сервере корректно настроены необходимые базовые параметры, приведенные ниже. (если вы используете виртуальный сервер 1cloud.ru, эти три пункта уже выполнены и их можно пропустить):

  1. Сервер имеет хотя бы один статичный внешний IP-адрес (в качестве альтернативы вы можете воспользоваться DynamicDNS-сервисами, автоматически обновляющими информацию о текущем IP-адресе устройства, например, DynDNS)
  2. Разрешена загрузка пакетов ПО из официальных репозиториев. Чтобы проверить это, откройте на сервере файл /etc/apt/sources.list и убедитесь в том, что сетевые адреса вида "deb http://..." присутствуют и не закомментированы (отсутствует # в начале строки с url репозитория). Так, например, выглядит добавленное в sources.list американское зеркало репозиториев Ubuntu Precise: # See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
    # newer versions of the distribution.
    deb http://us.archive.ubuntu.com/ubuntu/ precise main restricted
    deb-src http://us.archive.ubuntu.com/ubuntu/ precise main restricted
  3. Верно указаны сетевые параметры:hostname, ip-адрес (адреса) вашего сервера и его параметры DNS (последний параметр потребуется для маршрутизации интернет-трафика клиентов). Найти перечисленные сетевые настройки можно в файле /etc/hosts.

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

Установка OpenVPN на сервер

Чтобы установить пакет openvpn на сервер, необходимо последовательно выполнить приведенные ниже команды:

  1. Обновить репозитории пакетов:
    apt-get update
  2. Загрузить доступные обновления для установленных программ:
    apt-get upgrade
  3. Установить пакет openvpn:
    apt-get install openvpn
  4. OpenVPN включает в себя набор средств шифрования easy-rsa. Для нормальной работы демона скрипты easy-rsa следует разместить в директории /etc/openvpn:
    cd /etc/openvpn/ && make-cadir easy-rsa

Подготовка публичных ключей (PKI - Public Key Infrastructure)

На данном этапе нужно сгенерировать и подписать пары пользовательских и серверных ключей. Для заверения созданных пар мы будем использовать центр сертификации (CA - Certificate Authority), находящийся на самом VPN -сервере. Итак, создадим CA:

  1. Перейти в папку /etc/openvpn/easy-rsa: cd /etc/openvpn/easy-rsa
  2. Создать символьную ссылку openssl-1.0.0.cnf -> openssl.cnf: ln -s openssl-1.0.0.cnf openssl.cnf
  3. Инициализировать скрипт vars: source ./vars
  4. В ответ вы получите следующее уведомление: NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
  5. Запустить скрипт clean-all: ./clean-all
  6. Выполнить скрипт build-ca для создания центра сертификации. В ответ на появляющиеся запросы введите необходимую информацию (латинскими символами). Если вы не укажите собственные значения для каких-то из требуемых полей, будет использовано значение по-умолчанию [представленное в квадратных скобках]: ./build-ca
  7. Теперь можно перейти к генерации пары публичного сертификата/секретного ключа VPN-сервера.

Генерация ключа/сертификата сервера

  1. Сгенерируйте ключ: ./build-key-server server Заполните информацию по аналогии с build-ca. Поля "Company Name" и "Challenge Password" могут быть оставлены пустыми.
  2. После успешной генерации ключа появится запрос на его подписание центром сертификации. Введите yes для подтверждения.

Генерация клиентских ключей

  1. Создайте пару ключей для пользователя: ./build-key client1 Примечание: созданный файл ключа client1.key по умолчаню незашифрован. Это позволяет любому пользователю, имеющему доступ к этому файлу, подключиться к вашей виртуальной частной сети. Для устранения этой особенности вы можете использовать команду ./build-key-pass client1 вместо ./build-key client1 . В этом случае ключ будет зашифрован выбранным вами паролем.
  2. Повторите процедуру генерации для каждого из будущих клиентов VPN, заменив client1 на желаемое имя. Внимание: имена ключей должны быть уникальными.
    Вы можете сгенерировать клиентские ключи и позднее. Для этого потребуется повторно инициализировать скрипт vars (команда source ./vars), а затем запустить процедуру генерации необходимого ключа.

Установка параметров протокола Диффи-Хеллмана

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

Сгенерировать .pem файл следует с помощью команды: ./build-dh В ответ будет отображен набор случайных символов, говорящий о том, что идет процесс генерации. После завершения процедуры в директории etc/openvpn/easy-rsa/keys появится файл dh1024.pem.

Перемещение ключей и сертификатов

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

На сервере:

  1. Перейдите в директорию, в которой хранятся созданные ключи: cd /etc/openvpn/easy-rsa/keys
  2. Скопируйте сертификат и ключ центра сертификации (CA), файл параметров DH, ключ и сертификат vpn-сервера в каталог /etc/openvpn: cp ca.crt ca.key dh1024.pem server.crt server.key /etc/openvpn ВАЖНО: Перечисленные выше файлы - основа работоспособности и безопасности VPN. Их компрометация может иметь неблагоприятные последствия. Храните их в надежном хранилище и не передавайте эти файлы по небезопасным каналам.

 

На клиентском устройстве:

Скопируйте файлы ca.crt, client1.crt, client1.key в используемую приложением OpenVPN папку клиентского устройства (например, для Linux это /etc/openvpn)

 

Конфигурация сервера и клиента OpenVPN

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

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

  1. В качестве отправной точки в настройке вы можете использовать образец файла конфигурации OpenVPN-сервера, содержащий список доступных параметров работы программы и подробные пояснения этих параметров. Скопируйте этот документ в директорию /etc/openvpn/ для его редактирования и последующего запуска сервера VPN: gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz >/etc/openvpn/server.conf
  2. Скопированный на предыдущем этапе файл server.conf является вполне работоспособной конфигурацией. Ее достаточно для нормальной работы сервера, если вам не требуется туннелирование всего клиентского интернет-трафика через VPN-сервер или другие специфические опции.
    Единственное, на что обязательно нужно обратить внимание - имена и пути файлов сертификата сервера (.crt) и его ключа (.key), а также сертификата CA (.crt).
    Имена ключей, находящихся в директории /etc/openvpn должны полностью совпадать с именами ключей в конфиге server.conf. Проверить это можно с помощью следующих команд:
    • Узнаем имена файлов ключей (два файла .crt и один .key) в папке /etc/openvpn с помощью команды: ls /etc/openvpn
    • Проверяем, соответствуют ли отобразившимся выше названиям файлов имена ключей в файле /etc/openvpn/server.conf (после блока # SSL/TLS root certificate (ca), certificate (cert), and private key (key)): nano /etc/server.conf В случае, если имена отличаются, внесите соответствующие корректировки в файл конфига (не в имена файлов в папке openvpn) и сохраните его (CTRL+X).
    • Перезапускаем OpenVPN для применения изменений: /etc/init.d/openvpn restart

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

  1. Копируем образец файла конфигурации клиента в любую удобную директорию (в нашем случае домашнюю директорию пользователя (home), от имени которого выполняем команды: gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/client.conf.gz >/home/1cloud
  2. Переходим в папку keys и копируем необходимые файлы ключей (в нашем случае: client1.key, client1.crt, ca.crt) в эту же директорию (/home/1cloud): cd /etc/openvpn/easy-rsa/keys> cp client1.key client1.crt ca.crt /home/1cloud
  3. Открываем конфиг клиента: nano /home/1cloud/client.conf
  4. Находим блок # The hostname/IP and port of the server и вместо example.com указываем IP адрес OpenVPN-сервера: # The hostname/IP and port of the server.
    # You can have multiple remote entries
    # to load balance between the servers.
    remote example.com 1194
  5. В этом же файле находим блок #SSL/TLS parms. и проверяем названия файлов ключей пользователя (аналогично тому, как делали это в конфиге сервера): # SSL/TLS parms.
    # See the server config file for more
    # description. Its best to use
    # a separate .crt/.key file pair
    # for each client. A single ca
    # file can be used for all clients.
    ca ca.crt
    cert client1.crt
    key client1.key
  6. Сохраняем файл конфигурации клиента (CTRL+X).
  7. Теперь необходимо перенести пользовательские файлы client.conf, client1.key, client1.crt, ca.crt на клиентское устройство, с которого вы будете подключаться к VPN-серверу. Сделать это можно через FTP, SCP или просто создав на пользовательском устройстве (через nano на Linux, через блокнот на Windows) файлы с идентичными именами и полностью скопировать в них содержимое исходных документов с удаленного сервера.
    Внимание! Некоторые клиентские приложения OpenVPN (например на Andoid и IOS) работают с расширением файла конфигурации .ovpn, а не .conf. Если вы столкнетесь с этой проблемой - просто переименуйте файл настроек клиента соответствующим образом.
    Размещаем перенесенные файлы в папке, с которой работает используемое вами приложение OpenVPN (см. документацию к программе).
  8. Подключаемся к серверу. После успешного подключения на клиентском устройстве активируется виртуальный сетевой адаптер. Проверить это на Linux можно с помощью команды ifconfig (должен отображаться адаптер TUN), на ОС с графическим интерсейсом проверить корректность подключения можно непосредственно в программе подключения к VPN.

Внимание! Так как мы еще не настроили туннелировние всего интернет-трафика через VPN-сервер, доступ в интернет на клиентском устройстве после подключения его к виртуальной частной сети перестанет функионировать. Инструкция по маршрутизации интернет-трафика пользователей через VPN сервер представлена ниже.Б.

Туннелирование всего трафика клиентов виртуальной частной сети через VPN-сервер

В данной конфигурации мы настроим маршрутизацию всего трафика пользователей VPN через OpenVPN-сервер с сохранением SSL-шифрования от клиента до сервера.

  1. На сервере откройте файл конфигурации OpenVPN server.conf: nano /etc/openvpn/server.conf
  2. Расскоментируйте представленную ниже строку конфига (удалите символ ; в начале строки): push "redirect-gateway def1 bypass-dhcp"
  3. Сохраните и закройте файл (CTRL+X)
  4. Откройте файл /etc/sysctl.conf:
    nano /etc/sysctl.conf
  5. Расскоментируйте или добавьте представленную ниже строку в открытом файле, чтобы убедиться, что переадресация IPv4-трафика разрешена: net.ipv4.ip_forward=1
  6. Сохраните и закройте файл (CTRL+X)
  7. Введите команду для применения изменений в текущей сессии: echo 1 > /proc/sys/net/ipv4/ip_forward
  8. Последовательно введите следующие команды (одна строка=одна команда), для настройки фаерволла iptables на форвардинг трафика через VPN:
    iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
    iptables -A FORWARD -j REJECT
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    iptables -A INPUT -i tun+ -j ACCEPT
    iptables -A FORWARD -i tun+ -j ACCEPT
    iptables -A INPUT -i tap+ -j ACCEPT
    iptables -A FORWARD -i tap+ -j ACCEPT
  9. Добавьте такой же список правил iptables в файл /etc/rc.local , чтобы они применялись при каждом запуске системы: nano /etc/rc.local
    Содержание файла:
    #!/bin/sh -e
    #
    # [...]
    #
    iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
    iptables -A FORWARD -j REJECT
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    iptables -A INPUT -i tun+ -j ACCEPT
    iptables -A FORWARD -i tun+ -j ACCEPT
    iptables -A INPUT -i tap+ -j ACCEPT
    iptables -A FORWARD -i tap+ -j ACCEPT
    exit 0

    Сохраните и закройте документ (CTRL+X)
  10. Приведенные выше параметры активируют переадресацию всего клиентского трафика, кроме DNS-запросов, через VPN-сервер. Для форваринга DNS-запросов вам необходимо установить пакет dnsmasq и внести изменения в файл /etc/openvpn/server.conf
  11. Установим dnsmasq:
    Если вы используете Ubuntu 12.04: apt-get install dnsmasq && dpkg-reconfigure resolvconf Появится мастер настройки. На первом пункте (prepare /etc/resolv.conf for dynamic updates) отвечаем yes, затем no (Append original file to dynamic file?)
    Если вы используете Debian 7: apt-get install dnsmasq resolvconf
  12. Теперь нужно отредактировать dnsmasq: nano /etc/dnsmasq.conf Убедитесь, что указанные ниже параметры раскомментированы или добавлены в файл: listen-address=10.8.0.1
    bind-interfaces
  13. Далее необходимо добавить в файл /etc/network/interfaces информацию об используемых dns-серверах. Возможно, в вашем случае эта информация уже присутствует (как например в случае с серверами, арендованными в 1cloud.ru), если же нет - добавьте ее следующим образом:
    Откройте файл конфигурации интерфейсов: nano /etc/network/interfaces Добавьте строку dns-nameservers с указанием адресов используемых вами DNS-серверов (например одного сервера вашего интернет провайдера и одного публичного сервера google: 8.8.8.8): # The primary network interface
    auto eth0
    iface eth0 inet dhcp
    dns-nameservers 77.88.8.8 8.8.8.8
  14. При стандартных настройках утилита dnsmasq запускается до старта виртуального tun адаптера OpenVPN. Это приводит к ошибкам и завершению dnsmasq. Для устранения этой проблемы, необходимо добавить в файл /etc/rc.local строку с командой, перезапускающей dnsmasq после инициализации OpenVPN. Разместить эту строку в файле следует после параметров iptables, указанных нами ранее: nano /etc/rc.local
    Содержимое файла:
    ...
    iptables -A FORWARD -i tun+ -j ACCEPT
    iptables -A INPUT -i tap+ -j ACCEPT
    iptables -A FORWARD -i tap+ -j ACCEPT
    /etc/init.d/dnsmasq restart
    exit 0
  15. Последнее, что необходимо сделать - расскоментировать строку, разрешающую клиентам OpenVPN использовать DNS серверы, в файле /etc/openvpn/server.conf:
    nano /etc/openvpn/server.conf Содержимое файла: ....
    push "dhcp-option DNS 10.8.0.1"
  16. Перезапускаем сервер для применения всех настроек и проверки их корректности: reboot

Проверка OpenVPN-соединения

На этом настройку OpenVPN сервера на Ubuntu/Debian сервере можно считать завершенной. Для проверки соединения и туннелирования трафика через VPN-сервер вы можете воспользоваться любым интернет-сервисом, отображающим ваш IP-адрес (например, этот) - при корректной настройке на странице будет отображен адрес VPN-сервера.

 

Последнее обновление: 27.12.2021