Как настроить OpenVPN-сервер

Данный HOW-TO отражает типичный процесс настройки сервера доступа на базе OpenVPN, обеспечивающего его клиентам доступ в сеть Интернет. В свете последних Российских законопроектов инструкция становится актуальной для массовой российской аудитории сети Интернет - купите себе виртуалку за пределами России, настройте сервер доступа и ходите через него на свои любимые сайты, заблокированные российскими провайдерами.

Инсталляция сервера для Linux

Инсталляция сервера осуществляется практически целиком по официальному HOWTO.
  1. В начале ставим пакет с OpenVPN для нашего дистрибутива:
    • Debian:
      # apt-get install openvpn
    • Centos: пакет с сервером OpenVPN не входит в дистрибутив CentOS, поэтому его придётся "привлекать" со стороны. Заходим на страничку RepoForge, скачиваем и инсталлируем пакет с параметрами этого репозитория для нашей версии CentOS, а затем устанавливаем openvpn:
      # yum install openvpn

Инсталляция клиента для Linux

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

Инсталляция клиента для Windows

Для платформы Windows существует две реализации OpenVPN. Первая доступна на сайте разработчиков, и фактически является сборкой штатного OpenVPN под эту платформу без каких либо переделок или модификаций. Её не ставил никогда. Удобнее воспользоваться второй реализацией, известной под названием OpenVPN GUI (см. http://openvpn.se/). Это та-же самая сборка плюс удобный инсталлятор, плюс интеграция с Internet Explorer, плюс автоматическая инсталляция TUN/TAP драйверов, плюс удобный монитор подключения в системный трей...

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

  1. В состав дистрибутива OpenVPN входят скрипты, облегчающие процедуру создания электронных сертификатов и ключей. Они размещаются в каталоге easy-rsa, однако сам этот каталог находится в различных местах в зависимости от дистрибутива. Найти его можно командой find:
    # find / -name easy-rsa
    В различных дистрибутив он размещается в разных каталогах:
    • Debian: /usr/share/doc/openvpn/examples/easy-rsa/2.0
    • CentOS: /usr/share/doc/openvpn-2.0.9/easy-rsa/2.0
  2. Для подготовки скриптов к использованию необходимо воспользоваться сценарием Makefile для утилиты make, находящимся в каталоге easy-rsa/2.0. При запуске в параметре DESTDIR мы указываем альтернативный каталог для размещения скриптов. Это связано с тем, что в процессе работы со скриптами нам необходимо будет вносить изменения в один из файлов - vars, и рабочая копия не должна пострадать от очередных обновлений, заместивших наш модифицированный файл оригинальным содержимым. Однако, подготовка скриптов для разных дистрибутивов будет осуществляться немного по разному:
    • CentOS:
      # make install DESTDIR=/etc/openvpn/easy-rsa
    • Debian:
      # gzip -d openssl-0.9.6.cnf.gz
      # gzip -d README.gz
      # make install DESTDIR=/etc/openvpn/easy-rsa
      Такое дополнение связано с тем, что в Debian при создании .deb пакетов соответствующий инструментарий автоматически архивирует некоторые файлы, видимо для экономии места на диске. И для нормального исполнения make необходимо их предварительно распаковать.
  3. Рассмотрим файл vars. Он содержит определения следующих переменных, которые могут быть нам интересны:
    1. KEY_DIR=$EASY_RSA/keys
      Она должна указывать на каталог, в котором будут формироваться секретные ключи, поэтому позаботьтесь что бы доступ в этот каталог был бы строго ограничен. В идеале ключи вообще не рекомендуется хранить, а сразу после генерации их необходимо извлечь из каталога и удалить. Я обычно устанавливаю KEY_DIR="/root/openvpn-keys".
    2. KEY_SIZE=1024
      Задает длину генерируемых ключей. По умолчанию установлен в 1024 бита. Обычно этого вполне достаточно. Но если вы собираетесь гонять через туннель транзакции на миллионы долларов - смело увеличивайте до 2048.
    3. CA_EXPIRE=3650
      Задает время жизни корневого сертификата в днях. Ориентировочно 10 лет.
    4. KEY_EXPIRE=3650
      Задает время жизни обычных сертификатов в днях. Ориентировочно 10 лет.
    5. KEY_COUNTRY="US"
      Задает параметр сертификата "Страна". Его меняем однозначно - мы то не в штатах. Ставим "RU". Или "KG" smile
    6. KEY_PROVINCE="CA"
      Задает параметр сертификата "Штат". Тоже меняем. Ставим на аббревиатуру края, области. Или пишем "NA" (Not available)
    7. KEY_CITY="SanFrancisco"
      Задает параметр сертификата "Город". Меняем. Например на "KOMSOMOLSK-ON-AMUR" или "BISHKEK".
    8. KEY_ORG="Fort-Funston"
      Задает параметр сертификата "Организация". Меняем на название нашей организации.
    9. KEY_EMAIL="me@myhost.mydomain"
      Задает параметр сертификата "Адрес электронной почты". Меняем. Указываем электронный адрес администратора организации.
  4. Создаем каталог для размещения сгенерированных ключей и сертификатов:
     # mkdir /root/openvpn-keys
  5. Формируем главный цифровой сертификат хранилища сертификатов. Для этого в каталоге easy-rsa выполняем следующие команды:
    # cd /etc/openvpn/easy-rsa
    # . ./vars
    # ./clean-all
    # ./build-ca
    
    В процессе выполнения будет запрошены ряд параметров, основная часть которых уже инициализирована значениями из vars. Нам останется только их подтвердить. После выполнения команд в каталоге $KEY_DIR создаются файлы:
    ca.crt
    ca.key
    
    Первый из них - ca.crt - корневой сертификат хранилища (Root CA certificate), второй - корневой ключ хранилища (Root CA key). Первый из них передается держателям OpenVPN-сервера и всем их клиентам. Второй является секретным, и должен быть доступен только администратору хранилища. Сейчас копируем оба этих файла в каталог /etc/openvpn:
    # cp /root/openvpn-keys/ca.* /etc/openvpn
    . Сертификат и ключ хранилища будут использоваться при создании любых других ключей.
  6. Генерируем сертификат и ключ для OpenVPN-сервера:
    # ./build-key-server server
    Большинство параметров установлено в значения по умолчанию, задаваемые переменными из vars, параметр "Common Name" устанавливается равным "server". В процессе генерации будет предложено ввести пароль (challenge password) - НЕ ВВОДИТЕ ЕГО! Это пароль на доступ к ключу, если его указать, то при обращении к ключу при старте сервер запросит ввод пароля. Думаю что нам это совсем не требуется. На запросы подписи сертификата (sign certificate) и обработки запроса (commit) отвечайте согласием - y. Вот пример работы:
    # ./build-key-server server
    В результате выполнения в каталоге $KEY_DIR будут сформированы два фала - сертификат и ключ сервера
    server.crt
    server.key
    Эти файлы должны быть переданы администратору OpenVPN-сервера. Файл ключа является секретным! Мы у себя просто перемещаем эти файлы в каталог /etc/openvpn:
    # mv /root/openvpn-keys/server.crt /etc/openvpn
    # mv /root/openvpn-keys/server.key /etc/openvpn
  7. Генерируем параметры Diffle Hellman для OpenVPN-сервера:
    # ./build-dh
    В результате в каталоге $KEY_DIR создаётся файл dh1024.pem или dh2048.pem (в зависимости от значения $KEY_SIZE). Это - файл параметров для OpenVPN-сервера, его необходимо передать администратору OpenVPN-сервера наряду с сертификатом и ключом. Генерация параметров Diffle Hellman - разовая процедура, занимает достаточно длительное время. Мы перемещаем полученный файл в каталог OpenVPN-сервера:
    # mv /root/openvpn-keys/dh1024.pem /etc/openvpn/
  8. Если планируем использовать TLS, то дополнительно необходимо сгенерировать ключ и для него:
    # openvpn --genkey --secret ta.key
  9. Генерируем ключи клиента:
    # ./build-key client1
    В результате в каталоге $KEY_DIR будут созданы файлы
    client1.crt
    client1.key
    Это сертификат и ключ клиента, они должны быть переданы клиенту наряду с сертификатом хранилища ca.crt, сформированного нами ранее. При этом файл ключа является секретным! Рекомендуется для каждого клиента генерировать свою пару сертификат+ключ со своим, уникальным в рамках всего хранилища "Common Name", который мы указывали в качестве параметра скрипту build-key.

Конфигурация сервера для Linux

Создаем конфигурационный файл /etc/openvpn/server.conf. Как именно он будет называться, не важно. Важно что-бы он имел расширение .conf. В процессе загрузки операционной системы стартовый скрипт /etc/init.d/openvpn запустит для каждого .conf файла из каталога /etc/openvpn свой отдельный процесс сервера. В нашем случае получается следующий конфигурационный файл сервера:
server 172.16.0.0 255.255.255.0
proto tcp
dev tun
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh1024.pem
comp-lzo
verb 3
# Эти параметры нужны при использовании TLS
tls-server
tls-auth /etc/openvpn/ta.key 0
tls-timeout 15
hand-window 120
# Эти параметры передаются клиенту
push "dhcp-option DNS 8.8.8.8"
push "redirect-gateway def1"
tcp-nodelay
# end of file
Главный параметр, заслуживающий пристального внимания - server. Он указывает режим работы OpenVPN в качестве сервера, и задает адрес и маску сети, выделяемой в качестве динамического пула адресов для подключающихся клиентов.

Конфигурация клиента для Linux

Создаем конфигурационный файл для клиента /etc/openvpn/client.conf:
client
dev tun
proto tcp
remote 195.38.166.114 1194
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client1.crt
key /etc/openvpn/client1.key
comp-lzo
verb 3
# Эти параметры нужны при использовании TLS
tls-client
tls-auth /etc/openvpn/ta.key 1
Конфигурационный файл клиента практически идентичен конфигурационному файлу сервера, за исключением нескольких параметров:
  • client - задает режим работы OpenVPN в качестве клиента
  • remote - задает IP-адрес и порт подключения OpenVPN-сервера. По умолчанию OpenVPN использует порт 1194.
  • nobind - запрещает принимать входящие подключения со стороны сервера, для подключения используется только исходящие запросы со стороны клиента
  • redirect-gateway - заставляет клиента после установки VPN-подключения использовать OpenVPN-сервер как шлюз по умолчанию. Все пакеты, не адресованные локальным сетям клиента, будут маршрутизироваться через туннель на OpenVPN-сервер.

Конфигурация клиента для Windows

Создаем конфигурационный файл для клиента client.ovpn:
client
dev tun
proto tcp
remote 195.38.166.114 1194
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
comp-lzo
verb 3
Он отличается от аналогичного файла для платформы Linux другим расширением - .ovpn вместо .conf. Именно на такое расширение ориентируется OpenVPN-клиент для Windows с GUI-интерфейсом. В добавок не указаны полные пути до файлов сертификатов и ключа клиента - OpenVPN ищет их в текущем каталоге с конфигурационным файлом.

Конфигурация сетевой подсистемы сервера

Для обеспечения пересылки пакетов между интерфейсами - tun0 и vnet0 - необходимо включить эту функцию ядра. На работающей машине это можно сделать командой
# echo 1 >/proc/sys/net/ipv4/ip_forward
Что-бы эти изменения автоматически применились после перезагрузки, можно пойти двумя путями:
  1. Прописать эту-же команду в конец файла /etc/rc.local
  2. Установить параметр net.ipv4.ip_forward = 1 в файле /etc/sysctl.conf
Второй вариант мне наиболее симпатичен smile После включения форвардинга пакеты, получаемые от клиентов через туннель, и адресованные другим хостам, будут пересылаться на другие сетевые интерфейсы в соответствии с правилами маршрутизации.

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

Однако, пакеты от наших клиентов, проходя через сервер и выходя через внешний интерфейс, будут скорее всего тут-же похоронены на ближайшем внешнем маршрутизаторе. Причина проста - клиентам выдаются IP-адреса из диапазона 172.16.0.0/12, а в соответствии с RFC1918 (http://tools.ietf.org/rfc/rfc1918.txt) эти адреса зарезервированы для использования в частных, закрытых сетях. Т.е. пакеты с такими адресами не будут пропускаться ни одним Интернет-маршрутизатором.

Решение этой проблемы достигается применением технологии маскирования (или трансляции) адресов - NAT (Network Address Translation). Для задействования этого механизма необходимо выполнить следующую команду:

# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o venet0 -j SNAT --to-source 195.38.166.114
Для фиксации изменений в пакетном фильтре и их активизации после перезагрузки необходимо сохранить изменённое состояние командой
# /etc/init.d/iptabes save

Официальные документы

-- VitalyDruzhinin - 2012-09-04
Topic revision: r1 - 2013-08-28, VitalyDruzhinin
 

This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback