This article illustrates the process of OpenVPN (Virtual Private Network) setup on both the server and client, and describes an approach to keep client addresses fixed in a virtual network under a public key security certificate. This technology makes for a quick and cheap setup of local virtual nets, by using the existing physical resources or the Internet.
English version of this page under construction. You can read automatic translation.
В этой заметке подробно описана процедура настройки 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
Отредактируем файл переменных:
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
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 вы можете найти здесь.
Спасибо за пост. В некоторых случаях нужно быстро поднять тунель между двома точками. И самый быстрый способ с минимальной безопасностью, это общий ключ, как пишут, к примеру здесь – http://sysadm.pp.ua/linux/shifrovanie/openvpn-point-to-point.html . Генерацию ключей через OpenSSL никто не подскажет как делать?
Генерация приватного ключа:
openssl genrsa -out ca.key 4096
Генерация годового сертификата для него:
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Вы хоть проверяли, чего пишете? У ifconfig-push второй параметр – это адрес сервера, а не маска сети.
Да, всё проверено, значение параметра зависит от конкретной конфигурации. Конкретно в этой – маска подсети.
https://community.openvpn.net/openvpn/wiki/Topology#Topologysubnet
Информация проверена, вы ошибаетесь.
Как на счет доменного имени для клиента? Чтобы при подключении к VPN серверу я мог обращаться к уже подключенному ранее к нему клиенту по имени, а не адресу?
Могу по теоретизировать…
`ifconfig-push 192.168.10.51 255.255.255.0` в ССD файл
А затем в конфигурации сервера что-то типа `push DNS`?
Можно просто добавить соответствующие строки в
/etc/hosts
:# Clients on the VPN
192.168.10.1 vpn.lan vpn.lan
192.168.10.8 service1.lan service1
192.168.10.6 service2.lan service2