Простая настройка OpenVPN с фиксированными адресами клиентов

  • 64th day of Confusion, in the yold 3176
  • 7 Comments

В этой заметке подробно описана процедура настройки OpenVPN (virtual private network – виртуальная частная сеть), в рамках модели сервер-клиент и способ фиксации адресов клиентов в виртуальной сети, на базе сертификатной аутентификации. Эта технология позволяе+т быстро и экономично поднимать виртуальные локальные сети на базе существующих физических или интернета.

Стоит заметить, что компания OpenVPN предлагает использовать свой продукт OpenVPN Access Server (пакет openvpn-as) – сервер с возможностью настройки и контроля доступа через web-интерфейс, но, к сожалению, количество клиентов для него ограничено лицензией, поэтому опишем процедуру настройки пакета openvpn.

Прежде всего определимся с адресным диапазоном.
Необходим один внешний фиксированный IP адрес для VPN-сервера (в том случае если VPN будет работать через интернет), условно обозначим его 9.9.9.9
Диапазон внутренних адресов виртуальной сети мы предлагаем использовать такой: 192.168.10.2 — 192.168.10.99

Часть I – настройка сервера

Установим пакет из репозиториев, в Debian/Ubuntu это:

sudo apt-get install openvpn

После установки перейдем в папку со скриптами генерации ключей (в различных дистрибутивах путь может различаться: /usr/share/easy-rsa, /usr/share/doc/openvpn/examples/easy-rsa/2.0):

cd /usr/share/easy-rsa

В случае easy-rsa 3.0, скопируйте файл переменных vars из примера:

cp vars.example vars

Откройте его для редактирования:

sudo nano vars

И раскомментирувте и измените следующие значения в нём:

set_var EASYRSA_REQ_COUNTRY "US"
set_var EASYRSA_REQ_PROVINCE "California"
set_var EASYRSA_REQ_CITY "San Francisco"
set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
set_var EASYRSA_REQ_EMAIL "me@example.net"
set_var EASYRSA_REQ_OU "My Organizational Unit"

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

su
mkdir /etc/openvpn/keys
mkdir /etc/openvpn/ccd
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-req client nopass
./easyrsa sign-req client client
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
./easyrsa gen-req client2 nopass
./easyrsa sign-req client client2
openvpn --genkey --secret ta.key
./easyrsa gen-dh
cp ./ta.key /etc/openvpn/keys/
cp pki/ca.crt /etc/openvpn/keys/
cp pki/issued/* /etc/openvpn/keys/
cp pki/private/* /etc/openvpn/keys/
cp pki/dh.pem /etc/openvpn/keys/

Эти команды создают необходимые папки и генерируют сертификаты для сервера и клиентов с данными введенными в файл vars.

В случае easy-rsa 2.0, отредактируйте файл переменных vars:

sudo nano vars

В файле vars измените следующие значения:

export KEY_DIR="/etc/openvpn/keys" # путь к папке где будут лежать ключи
export KEY_COUNTRY="RU" # это и следующие значения изменяйте по-собственному усмотрению
export KEY_PROVINCE="MS"
export KEY_CITY="Moscow"
export KEY_ORG="СompanyName"
export KEY_EMAIL="some@address.ru"

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

su
mkdir /etc/openvpn/keys
mkdir /etc/openvpn/ccd
source ./vars
./clean-all
./build-dh
./pkitool --initca
./pkitool --server server
./pkitool client
./pkitool client1
./pkitool client2
openvpn --genkey --secret ta.key
mv ./ta.key /etc/openvpn/keys/

Эти команды создают необходимые папки и генерируют сертификаты для сервера и клиентов с данными введенными в файл vars.

Создадим файл настроек:

nano /etc/openvpn/openvpn.conf

В него добавьте следующий текст:

mode server # указывает программе работать в режиме сервера
tls-server # активирует работу Transport Layer Security (криптографический протокол) сервера
proto tcp-server # выбираем протокол TCP (если необходим UDP, тогда: proto udp)
dev tap # используемый тип интерфейса - L2 туннель (для L3-туннеля: dev tun)
port 1200 # указываем порт, по которому будет работать OpenVPN
daemon # программа будет работать в режиме демона, если нет в этом необходимости - просто раскомментируйте строку
tls-auth /etc/openvpn/keys/ta.key 0 # активирует дополнительный уровень аутентификации
ca /etc/openvpn/keys/ca.crt # путь к корневому сертификату
cert /etc/openvpn/keys/server.crt # путь к сертификату сервера
key /etc/openvpn/keys/server.key # ключ сервера
dh /etc/openvpn/keys/dh2048.pem # файл алгоритма Diffie-Hellman
client-config-dir /etc/openvpn/ccd # путь к каталогу индивидуальных клиентских конфигураций
ifconfig 192.168.10.1 255.255.255.0 # устанавливает виртуальный адрес сервера
ifconfig-pool 192.168.10.2 192.168.10.99 # устанавливает диапазон виртуальных адресов для клиентов
push "route 192.168.10.0 255.255.255.0 192.168.10.1" # эта команда будет выполняться на клиентских компьютерах, во время инициализации OpenVPN, она будет активировать роутинг так, чтобы клиенты автоматически использовали openvpn-сервер как шлюз для этой подсети
duplicate-cn # включает возможность использования одного ключа несколькими клиентами
verb 3 # указывает уровень отладки
cipher DES-EDE3-CBC # шифрование по алгоритму DES-EDE3-CBC
persist-key # будет загружать ключи в режиме persist, то есть их перезагрузка не потребуется в случае разрыва соединения
log-append /var/log/openvpn.log # путь к файлу лога
persist-tun # активирует работу tun/tap устройств в режиме persist
comp-lzo # активирует использование сжатия

Всё, если процедура прошла без ошибок, то сервер готов. В случае init перезапустите его командой:

sudo /etc/init.d/openvpn restart

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

sudo openvpn --config /etc/openvpn/openvpn.conf

Часть II – настройка клиента

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

sudo apt-get install openvpn
sudo mkdir /etc/openvpn/keys

С сервера надо взять 4 файла:

ca.crt
client.crt
client.key
ta.key

и скопировать их в папку /etc/openvpn/keys клиента.

Создаем файл-настроек клиента:

sudo nano /etc/openvpn/client.conf

Добавляем в него следующий текст:

tls-client # указывает программе работать в режиме клиента
proto tcp-client # активирует протокол TCP
remote 9.9.9.9 # внешний адрес сервера
dev tap # используемый тип интерфейса - L2 туннель
port 1200 # номер openvpn-порта сервера
cd /etc/openvpn # указывает на директорию по-умолчанию
pull # указывает принимать команды от сервера
tls-auth /etc/openvpn/keys/ta.key 1 # активирует дополнительный уровень аутентификации
ca /etc/openvpn/keys/ca.crt # путь к корневому сертификату сервера
cert /etc/openvpn/keys/client.crt # путь к сертификату клиента
key /etc/openvpn/keys/client.key # путь к ключу клиента
cipher DES-EDE3-CBC # шифрование по алгоритму DES-EDE3-CBC
log-append /var/log/openvpn.log # путь к файлу лога
comp-lzo # активирует использование сжатия

Клиент готов, в случае установленного init можно запускать:

sudo /etc/init.d/openvpn restart

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

sudo openvpn --config /etc/openvpn/client.conf

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

Также, вероятно, вам потребуется настроить корректным образом роутинг на вашей клиентской машине. К примеру в linux для добавления маршрута к другой подсети доступной на сервере обычно это делается так:

sudo route add -net 192.168.5.0 netmask 255.255.255.0 gw 192.168.10.1 tap0

Также необходимые подсети вы можете добавить в конфигурационный файл сервера /etc/openvpn/openvpn.conf, добавив строки подобно этой:

push "route 192.168.5.0 255.255.255.0 192.168.10.1"

Это даст возможность не поднимать каждую подсеть вручную.

Часть III – настройка фиксированных адресов

Если есть необходимость в том, чтобы клиентские адреса не выдавались автоматически в пределах диапазона, а были всегда строго фиксированы, то достаточно выполнить следующие инструкции…

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

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0
source ./vars
./pkitool client1
./pkitool client2

Создаем файл для client1:

sudo nano /etc/openvpn/ccd/client1

В него добавляем строку:

ifconfig-push 192.168.10.51 255.255.255.0

Аналогичным образом сделаем и для client2:

sudo nano /etc/openvpn/ccd/client2

Где добавим строку:

ifconfig-push 192.168.10.52 255.255.255.0

Такая настройка сделает адрес client1 – 192.168.10.51, а client2 – 192.168.10.52.
К этому стоит добавить, что эти файлы в папке ccd (параметр – client-config-dir) являются отдельными конфигурационными файлами клиентов, можете добавить в них какие-либо параметры по-своему усмотрению.

Настройка клиента для использования фиксированного адреса производится аналогично тому, как описано выше, единственное отличие в шагах, это то, что вместо client.crt и client.key вам надо скопировать и указать в файле конфигурации client1.crt и client1.key или client2.crt и client2.key соответственно.

О настройке OpenVPN-клиентов в системе Windows читайте здесь. Описание возможных параметров и команд по настройке OpenVPN вы можете найти здесь.

  1. aprog says:

    Спасибо за пост. В некоторых случаях нужно быстро поднять тунель между двома точками. И самый быстрый способ с минимальной безопасностью, это общий ключ, как пишут, к примеру здесь – http://sysadm.pp.ua/linux/shifrovanie/openvpn-point-to-point.html . Генерацию ключей через OpenSSL никто не подскажет как делать?

    • info says:

      Генерация приватного ключа:
      openssl genrsa -out ca.key 4096
      Генерация годового сертификата для него:
      openssl req -new -x509 -days 365 -key ca.key -out ca.crt

  2. Anonymous says:

    Вы хоть проверяли, чего пишете? У ifconfig-push второй параметр – это адрес сервера, а не маска сети.

  3. Serhii B. says:

    Как на счет доменного имени для клиента? Чтобы при подключении к VPN серверу я мог обращаться к уже подключенному ранее к нему клиенту по имени, а не адресу?
    Могу по теоретизировать…
    `ifconfig-push 192.168.10.51 255.255.255.0` в ССD файл
    А затем в конфигурации сервера что-то типа `push DNS`?

Leave a Comment

Your email address will not be published. Required fields are marked *