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

\"OpenVPN\"





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

\"OpenVPN\"

 

Стоит заметить, что компания 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

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

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0

Отредактируем файл переменных:

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=\"[email protected]\"

Следующие команды рекомендуем выполнять под 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/dh1024.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 # активирует использование сжатия

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

sudo /etc/init.d/openvpn restart

Часть 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 # активирует использование сжатия

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

sudo /etc/init.d/openvpn restart

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

Также, вероятно, вам потребуется настроить корректным образом роутинг на вашей клиентской машине. К примеру в 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


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

Приведенные в статье команды без — (двумя знаками дефиса) перед командой должны быть использованы в конфигурационном файле, команды с — в начале используются только из командной строки. Подробности использования команд и их параметры — man openvpn.

remote < host > — определяет удаленный конец туннеля. Могут использоваться записи IP и DNS.

local < host > — определяет локальный ip или имя хоста, на котором будет работать OpenVPN. Актуально, если на локальной машине несколько адресов.

dev < device > — определяет какой использовать тип устройства tun или tap. Например:
dev tun
или
dev tap
При одном из таких указаний будет использован свободный интерфейс tun или tap. Так же можно явно указывать номер виртуального интрефейса, например tun0.

port < port number > — указывает на каком порту будет работать OpenVPN (локально и удаленно). 

proto < proto > — какой протокол будет использоваться. Возможные значения: udp, tcp, tcp-client, tcp-server. С первыми двумя все ясно, а на последних двух остановимся чуть подробнее:
tcp-client — сам пытается установить соединение
tcp-server — только ждет подключений
Примечательно, что с использованием протокола udp VPN будет работать чуть быстрее, чем tcp. Но в плане стабильности работы лучше выбирать tcp (как показывает практика, VPN-соединение более устойчиво)

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

float — позволяет удаленному хосту изменять IP во время работы туннеля. Соединение при этом не разрывается.

ipchange < cmd > — выполняет скрипт или команду указанную в < cmd >, если IP сменился. Пример:
ipchange script-ip.sh

connect-retry < seconds > — пробует переподключиться через указанное время в секундах, если соединение было разорвано.

connect-retry-max < n > — максимальное количество повторов если соединение было разорвано

resolv-retry < seconds > — если OpenVPN не удалось узнать имя удаленного хоста по DNS, то через указанное количество секунд попытаться переподключиться.

lport < port > — указывает на локальный порт для использования OpenVPN

rport < port > — аналогично для удаленного порта. Пример:
rport 8000 — OpenVPN будет пытаться подключится к удаленному порту 8000

nobind — использовать динамический порт для подключения (только для клиента)

shaper < bytes > — указывает скорость передачи данных в байтах для исходящего трафика (только для клиента)

tun-mtu < mtu size > — устанавливает максимальный размер MTU. По умолчанию tun-mtu равен 1500. Использование:
tun-mtu 1200

dev-node < interface name > — устанавливает имя виртуального интерфейса. Например:
dev-node openvpn1

ifconfig — устанавливает локальный IP и маску подсети для туннельного интерфейса. Например:
ifconfig 10.3.0.1 255.255.255.0

server < network > < mask > — автоматически присваивает адреса всем клиентам (DHCP) в указанном диапазоне с маской сети. Данная опция заменяет ifconfig и может работаеть только с TLS-клиентами в режиме TUN, соответственно использование сертификатов обязательно. Например:
server 10.3.0.0 255.255.255.0
Подключившиеся клиенты получат адреса в диапазоне между 10.3.0.1 и 10.3.0.254.

server-bridge < gateway > < mask > < pool > — сервер в режиме моста для TAP устройств. Пример: 
server bridge 10.3.0.1 255.255.255.0 10.3.0.128 10.3.0.254
Клиентам будут выданы адреса в диапазоне 10.3.0.128 — 10.3.0.254, в качестве шлюза будет указан 10.3.0.1. 

mode server — переключает OpenVPN в режим сервера (начиная с 2-й версии)

mode p2p — данная опция идет по умолчанию.


Опции в режиме сервера


push < options > — передача клиенту конфигурационных параметров. Пример:
push \»route 192.168.0.0 255.255.255.0\»

Аналогично с помощью push клиенту могут передаваться следующие параметры:

route 
route-gateway
route-delay
redirect-gateway 
inactive 
ping, ping-exit, ping-restart
persist-key, persist-tun
comp-lzo 
dhcp-option 
ip-win32 


Последние две опции применимы только для Window-клиентов. Например передадим Windows-клиенту адрес DNS-сервера 11.11.11.11:
push \»dhcp-option DNS 11.11.11.11\»

comp-lzo — параметр сжатия трафика, идущего через виртуальный туннель. Может принимать значения yes, no, adaptive. Последнее используется по умолчанию.
Например:
comp-lzo yes — принудительно включить сжатие
comp-lzo no — принудительно отключить сжатие
comp-lzo adaptive — адаптивный режим.


Команды и параметры при работе с сертификатами x509 и параметрами шифрования


cipher < alg > — указываем алгоритм шифрования. Например:
cipher AES-256-CBC
Рекомендуется использование шифров в режиме CBC (Cipher Block Chaining).

keysize < n > — размер ключа в битах. Например:
keysize 128

auth < alg > — алгоритм хэширования. Пример:
auth SHA1

df < file > — файл с ключем Диффи-Хелмана

ca < file > — файл сертификата для CA

cert < file > — сертификат локальной машины

key < file > — локальный ключ машины

tls-server — явно указывает, что данный хост является tls-server 

tls-client — соответственно tls-client

pkcs12 < file > — указываем файл (PKCS12), который содержит в себе сертификат, ключ и CA в одном файле. Пример:
pkcs12 /file

crl-verify < file > — список отозванных сертификатов, т.е. blacklist.

no-replay — отключает защиту OpenVPN от атаки повторного воспроизведения (replay attack). Крайне не рекомендуется отключать!

no-iv — отключает использование вектора инициализации шифра (IV). Крайне не рекомендуется отключать!

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

secret < file > — включает режим шифрования и аутентификации на статических ключах. В качестве параметра использует заранее сгенерированный, командой —genkey, файл. Например:
secret key.txt

Все доступные алгоритмы шифрования можно просмотреть выполнив из командной строки:
openvpn —show-ciphers

Алгоритмы хэширования:
openvpn —show-digests

Показать все доступные TLS-шифры (TLS используется только для шифрования канала управления)
openvpn —show-tls

Показать все доступные крипто-устройства в системе (если такие имеются):
openvpn —show-engines

Для улучшения безопасности рекомендовано запускать все сервисы с минимальными правами. Следующими двумя командами мы укажем с правами какого пользователя и группы будет работать openvpn:

user nobody
group nogroup

Где, соответственно, nobody и nogroup имена пользователя и группы.


Команды для управления маршрутизацией


Обозначение: VPN-хост — удаленная сторона (удаленный хост)

route < network > — устанавливает указанную маршрутизацию на VPN-хосте, после успешного запуска туннеля. Пример:
route 10.0.10.0 255.255.255.252

route-gateway < IP > — устанавливает шлюз на VPN-хосте. Пример:
route-gateway 192.168.0.22
После успешного запуска виртуального туннеля клиенту будет задан шлюз 192.168.0.22 

route-delay < seconds > — указывает подождать n-секунд перед установкой маршрутов. Пример:
route-delay 5
Т.е. через 5 секунд после установки туннеля будут заданы маршруты.

route-up < cmd > — выполнить скрипт или программу < cmd > после установки маршрутов. Пример:
route-up /script.sh

redirect-gateway — установить шлюзом по умолчанию удаленный сервер. Т.е. когда удаленный пользователь подключается к нашему серверу, то ему будет задан шлюз по умолчанию на наш сервер.


Команды для управления туннелем


ping < seconds > — указывает отсылать ping на удаленный конец тунеля после указанных n-секунд, если по туннелю не передавался никакой трафик. Пример:
ping 10

ping-restart < seconds > — если за указанное время не было получено ни одного пакета с удаленной стороны, то перезапускать туннель. Пример:
ping-restart 60 — если в течении 60 секунд не было получено ни одного пакета, то туннель будет перезапущен.

ping-timer-rem — позволяет перезапускать туннель, только когда указан удаленный адрес. 

persist-tun — данная опция оставляет без изменения устройства tun/tap при перезапуске OpenVPN.

persist-key — указывает не перечитавать файлы ключей при перезапуске туннеля.

resolv-retry < seconds > — устанавливает время в секундах для запроса об удаленном имени хоста. Актуально только если используется DNS-имя удаленного хоста. Пример:
resolv-retry 86400
inactive < seconds > — после n-секунд неактивности устройство TUN/TAP автоматически отключется. Пример:
inactive 120

ping-exit < seconds > — если за указанные n-секунд не было получено ни одного пакета, то отключать OpenVPN. Пример:
ping-exit 120

keepalive < seconds > < seconds > — является совмещением сразу двух команд — ping и ping-restart. Использует сразу два параметра в секундах, перечисленных через пробел. Пример:
keepalive 10 180
Означает следующее: каждые 10 секунд посылать ping на удаленный хост, и, если за 180 секунд не было получено ни одного пакета — то перезапускать туннель. 

persist-local-ip < IP > — оставлять неизменными локальный IP адрес и номер порт, если туннель был перезапущен. 

persist-remote-ip < IP > — оставлять неизменными удаленный IP адрес и номер порт, если туннель был перезапущен. 
persist-remote-ip 192.168.50.1


Методы аутентификации


auth-user-pass-verify < script > < method > — указывается только на серверной стороне.
< script > — путь к скрипту, который будет производить авторизацию. Скрипт должен возвращать 0 если авторизация успешна, и соответственно, 1 если авторизация не успешна.
< method > — метод авторизации, может быть двух типов: via-env и via-file

auth-user-pass < file >— указывается на клиентской стороне. Параметр не обязателен, если он отсутствует то будет предложено ввести пару логин/пароль.
должен содержать имя пользователя и пароль в двух строчках:
username
password

client-cert-not-required — отключает авторизацию по сертификатам.


Работа с прокси


OpenVPN без проблем может работать через http и socks прокси.

http-proxy < server port [auth] > — указываем адрес и порт прокси-сервера. 
http-proxy 192.168.0.12 8080

Если требуется авторизация на прокси-сервере:

http-proxy < server port authfile > — где authfile — файл содержащий две строки (имя пользователя и пароль) или stdin (будет запрошено имя пользователя и пароль).

Так же после authfile требуется указать метод авторизации. Можно оставить auto для автоматического выбора метода авторизации или указать явно через auth-method.
auth-method может быть трех видов \»none\», \»basic\» или \»ntlm\».
Используется в OpenVPN начиная с версии 2.1.

http-proxy-retry — переподключаться, если соединение было разорвано.

http-proxy-timeout < seconds > — считать соеденение с прокси-сервером разорванным после n-секунд неактивности. Например:
http-proxy-timeout 5

socks-proxy < server port > — указываем сокс-прокси сервер. Пример:
socks-proxy 192.168.0.12 8080

socks-proxy-retry — переподключаться, если соединение было разорвано.

auto-proxy — автоматически определять прокси-сервер. Требуется версия OpenVPN 2.1 и выше.


Скриптинг


up < command >— выполнить команду после запуска устройства TUN/TAP. Пример:
up script-up.sh

up-delay < seconds > — подождать n-секунд перед запуском команды указанной в up. Пример:
up-delay 5

down < command > — выполнить команду когда интерфейс TUN/TAP выключится. Пример:
down script-down.sh

down-pre — выполнить команду, указанную в down перед выключением интерфейса TUN/TAP

up-restart < command > — выполнить команду после каждого реконнекта

route-up < command > — выполнить команду после установки сетевых маршрутов. Пример:
route-up script.sh

learn-address < command > — выполнить указанную команду, если ip удаленной стороны изменился.

ipchange < command > — выполнить команду, если ip сервера изменился.

client-connect < command > — выполнить команду, когда клиент подключился.

client-disconnect < command > — выполнить команду, когда клиент отключился.


Команды отладки и поиска неисправностей


verb < verbosity level > — устанавливает уровень информативности отладочных сообщений. Может принимать параметр от 0 до 11. По умолчанию verb равен 1.
При уровне verb 5 и выше в логе будут встречаться подобные записи: RwrW. R (read), W (write) — соответственно чтение и запись. Большая буква обозначает, что пакет был считан (R) или записан (W) на виртуальном устройстве TUN/TAP, а маленькие — считан (r) и записан (w) в туннеле.

mute < number of messages > — если значение установлено в 10, то в лог будет записываться только по 10 сообщений из одной категории.


Логирование


log < file > — указываем лог-файл. Если данный параметр не указан, то весь вывод openvpn будет производиться в stdout.

log-append < file > — дописывать сообщения в лог-файл, а не перезаписывать.

status < file > — указывает путь к статус-файлу, в котором содержится информация о текущих соединениях и информация о интерфейсах TUN/TAP.


В. Чем отличаются виртуальные устройства tun и tap?
О. TUN — туннель, соединение по которому указывается по типу: локальный IP < — > удаленный IP. Например, при явном указании ifconfig:
—ifconfig 10.3.0.2 10.3.0.1
в этом примере 10.3.0.2 — локальный IP, 10.3.0.1 — удаленный IP
TAP — эмулирует виртуальную ethernet карточку, для которой требуется указывать локальный IP и маску подсети. Например:
—ifconfig 10.3.0.2 255.255.255.0


В. Для чего нужны файлы serial и index.txt при генерации ключей с easy-rsa?
О. Эти два файла используются в качестве временной базы данных, используемой при генерации ключей. Должны находиться в том каталоге, где и ключи.

 

 

WINDOWS

Первый шаг конфигурирования OpenVPN 2.0 — установка PKI (public key infrastructure).
PKI состоит из:

  • раздельные сертификаты (публичный ключ — a public key) и приватный ключ (private key) для сервера и каждого клиента
  • главный Certificate Authority (CA) сертификат и ключ, используемый для подписывания каждого сертификата сервера и клиента.

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

И сервер и клиент вначале проверяют, что сертификат поздписан главным CA, а затем тестируют информацию в заголовке сертификата, такую как публичное имя сертификата и его тип (сервер или клиент).

В эту модель безопасности в перспективе будут добавлены несколько желаемых возможностей:

  • Только серверу нужно будет владеть сертификатом/ключом — не нужно знать индивидуальных сертификатов каждого клиента, которые возможно подключатся к серверу.
  • Если приватный ключ скомпроментирован, он может быть запрещен добавлением в CRL (certificate revocation list). CRL содержит скомпроментированные сертификаты для выборочной отбраковки сертификатов без необходимости полного перестроения PKI.
  • Сервер может установить клиентозависимые права доступа, основываясь на встроенных полях сертификата, таких как публичное имя (Common Name).

Последовательность действий

  1. Создание основного Certificate Authority (CA) сертификата и ключа
  2. Создание сертификата и ключа сервера
  3. Создание сертификатов и ключей для 3-х клиентов
  4. Создание параметров Diffie Hellman
  5. Файлы ключей и сертификатов



1.1. Создание основного Certificate Authority (CA) сертификата и ключа


В Windows зайти в командную строку (cmd.exe) и выполнитьcd %Program Files%/OpenVPN/easy-rsa
Выполнить командный файлinit-config. При этом исходными файлами заменятся файлы конфигурации vars.bat и openssl.cnf

Отредактируем vars файл (называется vars.bat) и установим KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, и KEY_EMAIL параметры. Эти параметры заполнять обязательно (нельзя оставлять пустыми!).

Затем инифиализируем PKI:
vars
clean-all
build-ca

Последняя команда (build-ca) создает certificate authority (CA) сертификат и ключ при помощи интерактивной openssl команды

Generating a 1024 bit RSA private key 
............++++++ 
...........++++++ 
writing new private key to \'ca.key\' 
----- 
You are about to be asked to enter information that will be incorporated 
into your certificate request. 
What you are about to enter is what is called a Distinguished Name or a DN. 
There are quite a few fields but you can leave some blank 
For some fields there will be a default value, 
If you enter \'.\', the field will be left blank. 
----- 
Country Name (2 letter code) [KG]: 
State or Province Name (full name) [NA]: 
Locality Name (eg, city) [BISHKEK]: 
Organization Name (eg, company) [OpenVPN-TEST]: 
Organizational Unit Name (eg, section) []: 
Common Name (eg, your name or your server\'s hostname) []:OpenVPN-CA 
Email Address [[email protected]]:

В приведенной выше последовательности многие параметры по умолчанию имеют значения из файла vars.bat. Подробно нужно указать параметр Common Name. В примере используется \»OpenVPN-CA\».



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


build-key-server server

Как и на предыдущем шаге, большинство параметров можно оставить по умолчанию. Когда запроситCommon Nameвведем \»server\». Два других вопроса требуют положительного ответа (Yes): \»Sign the certificate? [y/n]\» и \»1 out of 1 certificate requests certified, commit? [y/n]\».



1.3. Создание сертификатов и ключей для 3-х клиентов


Создание сертификатов клиента похоже на предыдущий шаг:
build-key client1
build-key client2
build-key client3

Если вы хотите защитить паролем ключи клиента, используйте скриптbuild-key-pass.

Помните, что каждому клиенту нужно ввести своеCommon Name, т.е. \»client1\», \»client2\», и \»client3\». Для каждого клиента всегда нужно использовать уникальное имя.



1.4. Создание параметров Diffie Hellman


Diffie Hellman параметры должны быть созданы для OpenVPN сервера.

build-dh

Generating DH parameters, 1024 bit long safe prime, generator 2 
This is going to take a long time 
.................+........................................... 
...................+.............+.................+......... 
......................................



1.5. Файлы ключей и сертификатов


Вновь созданные ключи и сертификаты находятся в подкаталогеkeys

Имя файла Где нужен Назначение Секретный
ca.crt сервер + все клиенты Root CA certificate НЕТ
ca.key ключ подписывающей машины Root CA key ДА
dh{n}.pem только на сервере Diffie Hellman параметры НЕТ
server.crt только на сервере Server сертификат НЕТ
server.key только на сервере Server ключ ДА
client1.crt только на client1 Client1 сертификат НЕТ
client1.key только на client1 Client1 ключ ДА
client2.crt только на client2 Client2 сертификат НЕТ
client2.key только на client2 Client2 ключ ДА
client3.crt только на client3 Client3 сертификат НЕТ
client3.key только на client3 Client3 ключ ДА

Окончательный шаг процесса создания ключей — копирование всех файлов на требуемые машины, при этом секретные файлыжелательнопередавать по защищенному каналу…



2. Создание файлов конфигурации OpenVPN сервера и клиентов
(Creating configuration files for server and clients)


2.1. Пример конфигурационных файлов


Свою конфигурацию лучше базировать на исходных конфигурационных файлах OpenVPN. Их можно найти в меню (Пуск -> Программы -> OpenVPN -> OpenVPN Sample Configuration Files) или на диске (%ProgramFiles%/OpenVPN/sample-config)

В Linux, BSD, или unix-подобных ОС файлы конфигураций называютсяserver.confиclient.conf, а в Windows называютсяserver.ovpnиclient.ovpn.



2.2. Редактирование файла конфигурации сервера


Лучшее начало создания своей конфигурации сервера — воспользоваться примером этого файла из OpenVPN. VPN создается с использованием виртуальногоTUNсетевого интерфейса (для роутинга), с ожиданием подключения клиентов наUDP порт 1194(официальный номер порта OpenVPN), и распределением виртуальных адресов подключаемых клиентов из подсети10.8.0.0/24.

Перед использованием примера файла конфигурации необходимо установить ca, cert, key, и dh параметры на файлы, полученные при создании PKI (читать про создание ключей и сертификатов).

Уже на этом шаге файл конфигурации готов к использованию. Или можно поменять следующие настройки:

  • Если используетеEthernet bridging, необходимо указатьserver-bridgeиdev tapвместоserverиdev tun.
  • Если ваш OpenVPN сервер прослушивает TCP порт вместо UDP порта, используйтеproto tcpвместоproto udp(если необходимо прослушивать и TCP и UDP порты, необходимо запустить две независимые копии OpenVPN).
  • При необходимости использования другого виртаульного IP адресного пространства (вместо10.8.0.0/24), нужно модифицировать директивуserver. Помните, что это адресное пространство не должно использоваться вашей сетью.
  • Раскомментируйте директивуclient-to-client, если хотите, чтобы клиенты могли устанавливать между собой соединения при помощи VPN. По умолчанию клиенты могут подлючаться только к серверу.
  • Если используете Linux, BSD, или Unix-подобную ОС, можно улучшить безопасность, раскомментировав директивыuser nobodyиgroup nobody.

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

  • Используйте разные номера портов (port) для каждой запущенной копии OpenVPN (UDP и TCP протоколы используют разные пространства портов, таким образом можно запустить одну копию OpenVPN с прослушиванием порта UDP-1194, а другую — TCP-1194).
  • В Windows, каждой OpenVPN конфигурации необходим свой TAP-Win32 адаптер. Дополнительные адаптеры можно добавить изПуск -> Программы -> OpenVPN -> Add a new TAP-Win32 virtual ethernet adapter.
  • Если несколько копий OpenVPN запускается в одном каталоге, установите директивы, создающие файлы с данными таким образом, чтобы каждая копия не перезаписывала файлы друг у друга. Это директивыlog,log-append,statusиifconfig-pool-persist.



2.3. Редактирование конфигурационных файлов клиентов


В примере конфигурационного файла клиента (client.confв Linux/BSD/Unix илиclient.ovpnв Windows) директивы по умолчанию отражают значения из примера конфигурацонного файла сервера.

Как и в серверном файле конфигурации, вначале отредактируйте значения параметровca,cert иkey , указав файлы, сгенерированные в PKI (читать про создание ключей и сертификатов). Помните, что каждый клиент должен иметь свою пару сертификат/ключ (cert/key). Толькоca файл один и тот-же на сервере и всех клиентах.

Затем отредактируйтеremote директиву для указания хоста/IP адреса и номера порта OpenVPN сервера (если ваш OpenVPN сервер запущен за файрволом или NAT\’ом, укажите реальный IP адрес шлюза, а также номер порта, который проброшен со шлюза к вашему OpenVPN серверу).

В завершении проверьте, совпадают ли директивы в конфигурационном файле клиента и сервера. Проверьте совпадение директивdev (tun илиtap) иproto (udp илиtcp). Также проверьте, чтобыcomp-lzo иfragment, если используются, присутствовали в конфигурационных файлах сервера и клиента.



3. Запуск VPN и тестирование начального соединения
(Starting up the VPN and testing for initial connectivity)


3.1. Запуск сервера


Вначале убедитесь, что OpenVPN сервер доступен из интернета

  • откройте UDP порт 1194 (или TCP/UDP порт, который вы указали в своей конфигурации)
  • или установите перенаправление UDP порта через файрвол/роутер к машине с запущенным OpenVPN сервером

Затем необходимо отключить файрвол на TAP/TUN интерфейсе

Для упрощения обнаружения неполадок лучше вначале запустить OpenVPN сервер из командной строки (или щелкнуть на .ovpn файле в Windows), чем запускать сервер как демон или сервис:

openvpn [server config file] 

При нормальном запуске можно увидеть это (на разных платформах вывод может немного отличаться):

Sun Feb  6 20:46:38 2005 OpenVPN 2.0_rc12 i686-suse-linux [SSL] [LZO] [EPOLL] built on Feb  5 2005 
Sun Feb  6 20:46:38 2005 Diffie-Hellman initialized with 1024 bit key 
Sun Feb  6 20:46:38 2005 TLS-Auth MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ] 
Sun Feb  6 20:46:38 2005 TUN/TAP device tun1 opened 
Sun Feb  6 20:46:38 2005 /sbin/ifconfig tun1 10.8.0.1 pointopoint 10.8.0.2 mtu 1500 
Sun Feb  6 20:46:38 2005 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2 
Sun Feb  6 20:46:38 2005 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:23 ET:0 EL:0 AF:3/1 ] 
Sun Feb  6 20:46:38 2005 UDPv4 link local (bound): [undef]:1194 
Sun Feb  6 20:46:38 2005 UDPv4 link remote: [undef] 
Sun Feb  6 20:46:38 2005 MULTI: multi_init called, r=256 v=256 
Sun Feb  6 20:46:38 2005 IFCONFIG POOL: base=10.8.0.4 size=62 
Sun Feb  6 20:46:38 2005 IFCONFIG POOL LIST 
Sun Feb  6 20:46:38 2005 Initialization Sequence Completed



3.2. Запуск клиента


Первый раз OpenVPN клиент лучше запускать из командной строки (или щелкнуть на.ovpnфайле в Windows):
openvpn [client config file]

При нормальном запуске в Windows должны увидеть такой-же вывод, как и у сервера (см.выше), а в конце должно быть сообщениеInitialization Sequence Completed.

Теперь попробуем пинг через VPN. Если используется роутинг (т.е.dev tunв файле конфигурации), выполняем:
ping 10.8.0.1

Если используется режим моста (т.е.dev tapв файле конфигурации), пробуем пинг к IP адресу в подсети сервера.

Если пинг проходит, примите поздравления! VPN функционирует.



3.3. Проблемы


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

Сообщение об ошибке: TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity). Эта ошибка означает, что клиент не смог установить соединение с сервером.
Решения проблемы:

  • Проверьте, что клиент использует корректное имя/IP сервера и номер порта. 
  • Если компьютер с OpenVPN сервером находится в защищенной сети, проверьте, чтобы использовалось корректное правило перенаправления порта на брандмауэре/шлюзе сервера. К примеру ваш OpenVPN имеет IP адрес 192.168.4.4 за брандмауэром и ожидает подключение клиентов на UDP порт 1194. NAT шлюза в подсети 192.168.4.x может иметь правило перенаправления порта, звучащее примерно так перенаправить UDP порт 1194 с внешнего IP адреса на 192.168.4.4
  • Разрешить брандмауэру сервера входящие соединения на UDP порт 1194 (или другой TCP/UDP порт, который вы указали в файле конфигурации сервера).

Сообщение об ошибке: Initialization Sequence Completed with errors – такая ошибка может случится в Windows если (a) не запущен DHCP сервис, или (b) используется персональный брандмауэр сторонних производителей на XP SP2.
Решение проблемы: Запустите DHCP сервис и проверьте, что ваш брандмауэр корректно работает с XP SP2.

Получено сообщение Initialization Sequence Completed, но пинг не проходит — это означает, что брандмауэр на сервере или клиенте блокирует VPN сетевой трафик на TUN/TAP интерфейсе.
Решение проблемы: запретите брандмауэру клиента (если есть) фильтрацию TUN/TAP интерфейса клиента. К примеру на Windows XP SP2 зайдите вЦентр обеспечения безопасности -> Брандмауэр Windows -> Дополнительно и снимите галочку напротив TAP-Win32 адаптера (запрещение брандмауэру клиента фильтровать TUN/TAP адаптер в целом приемлемо в перспективе безопасности, так как вы по существу указываете брандмауэру не блокировать заверенный VPN трафик). Также удостоверьтесь, что TUN/TAP интерфейс на сервере не фильтруется брандмауэром (выборочная фильтрация на TUN/TAP интерфейсе со стороны сервера дает определенные выгоды в безопасности. Политики доступа рассмотрены в другом месте).

Соединение установлено при использовании конфигурации proto udp, лог сервера содержит следующую строку:

TLS: Initial packet from x.x.x.x:x, sid=xxxxxxxx xxxxxxxx

однако лог клиента не содержит эквивалентной строки.
Решение проблемы: вы имеете одностороннее соединение от клиента к серверу. Соединение от сервера к клиенту блокируется брандмауэром, как правило со стороны клиента. Или (a) персональным брандмауэром, запущенным у клиента, или (b) NAT\’ом шлюза/роутера клиента. Установите в брандмауэре разрешение на возврат UDP пакетов от сервера к клиентам.

Смотрите FAQ для разрешения других проблем.