Настройка сервера OpenVPN во FreeBSD

Данная статья посвящена установке и настройке OpenVPN на FreeBSD.

Для начала установим сам OpenVPN из портов:

$ cd /usr/ports/security/openvpn

$ make install clean

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

После установки протестируем криптосистему:

$ openvpn --genkey --secret key

этим мы создаём тестовый ключ

$ openvpn --test-crypto --secret key

а этой командой мы производим тестирование. Если в итоге мы увидим OpenVPN crypto self-test mode SUCCEEDED, то вё в порядке и можно дигаться дальше.

Создадим директорию, где будем хранить настройки:

$ mkdir -p /usr/local/etc/openvpn

Скопируем туда пакет управления ключами RSA.

$ cp -r /usr/local/share/doc/openvpn/easy-rsa /usr/local/etc/openvpn

Теперь присупим непосредственно к созданию сертификатов. Для этого нам необхлимо отредактировать файл vars. Я приведу частично переведённую версию этого файла.

$ edit /usr/local/etc/openvpn/easy-rsa/vars

#easy-rsa настройки

#Эта переменная указывает на верхний каталог easy-rsa

export D=`pwd`

#Эта переменная указывает где лежит openssl.conf используемый вместе с easy-rsaexport

KEY_CONFIG=$D/openssl.cnf

#Отредактируйте данную переменную, она указываем на директорию где будут храниться ключи

#ВНИМАНИЕ: команда clean-all выполняет в этой директории rm -rf , так что будьте внимательны при

#указании директории

export KEY_DIR=$D/keys

#Можно увеличть это значение до 2048, если вы параноик. Это замедлит обмен TLS на столько-же на

#сколько и единовременную генерацию DH. Переенная устанавливает длинну ключа.

export KEY_SIZE=1024

#Ниже приведены значения по умолчанию для полей, кторые будут помещены в сертификат Нельзя оставлять эти поля

#пустыми.

export KEY_COUNTRY=RU

#Страна

export KEY_PROVINCE=NA

#Штат, провинция,область

export KEY_CITY=MOSCOW

#Город

export KEY_ORG="OpenVPN-TEST"

#Организация

export KEY_EMAIL="my@mail.adress"

#E-mail администратора

Теперь создадим ключи

$ . ./vars (для этой команды ваша оболочка должна быть sh или родственная ей)

Создадим папку $KEY_DIR

$ mkdir -p $KEY_DIR

$ ./clean-all

После создания сертификатов и ключей следует зпомнить что файлы с расширением .key должны быть строго конфиденциальни и их никогда не надо переносить за пределы сервера. А файлы .crt и .csr можно передавать и по e-mail'у.

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

$ ./build-ca

этой командой мы создадим наши CA сертификат/ключ, ответы на задаваемые вопросы мы уже внесли в файле vars. Из всех вопросов нам обязательно надо будет вводить только Common Name, т.е. имя сервера или клиента, в зависимости от создаваемого ключа.

$ ./build-dh

этой командой мы создадим Диффи Хельман параметры

$ ./buld-key-server server

этой командой мы создаём сертификат и публичный ключ для сервера. Когда спросит Common Name вводим server. Есть ущё 2 вопроса на которые надо ответить положительно: "Sign the certificate? [y/n]" подписать саертификат? и "1 out of 1 certificate requests certified, commit? [y/n]" Подтвердить подпись 1 из 1 сертификатов?

$ ./build-key client1

$ ./build-key client2

этой командой мы создадим сертификат и ключ client1 и client2 для клиентского соединения в директории $KEY_DIR. Опять-же таки не забываем писать Common Name и не забыть ответить положительно на 2 тех-же вопроста что и в предыдущей команде.

Ниже приведена таблица созданных файлов:

Имя файла Кто использует Назначение Secret

ca.crt сервер + все клиенты Главный сертификат НЕТ

ca.key подпись ключа Главный CA ключ ДА

dh{n}.pem только сервер Diffie Hellman parameters НЕТ

server.crt только сервер Сертификат сервера НЕТ

server.key только сервер Ключ сервера ДА

client1.crt только client1 Client1 сертефикат НЕТ

client1.key только client1 Client1 Ключ ДА

client2.crt только client2 Client2 Сертефикат НЕТ

client2.key только client2 Client2 ключ ДА

Теперь приступим к созданию файлов настроек для сервера и клиентов, лучше всего для этого использовать примеры файлов настроек. Они распологаются в /usr/local/share/doc/openvpn/sample-config-files. Поскольку мы делаем сервер, то нам интересен файл server.conf, его мы и будем редактировать.

Итак, опишу файл server.conf:

#Какой IP будет слушать сервер OpenVPN (необязательно)

;local 1.2.3.4

#какой TCP/UDP порт будет слушать сервер. Если вы хотите использовать несколько отдельных серверов OpenVPN, необходимо

#будет указать разные порты.

port 1194

#Какой протокол будет использовать сервер TCP или UDP

proto udp

#"dev tun" создаст маршрутизируемый IP туннель

#"dev tap" создаст Ethernet(bridge) туннель

#Используте dev tap0 если вам требуется bridging, при этом у вас уже должен быть создан виртуальный интерфейс tap0 в режиме

#моста с вашей сетевой картой. В большинесве случаев VPN не будет функционировать если вы не отключите файрвол на

#tun/tap интерфейсе

dev tun

#главный SSL/TLS сертификат (ca), сертификат (cert), частный ключ (key). каждый клиент и сервер должны иметь свои

#собственные пары сертификат и ключ. Сервер и все его клиенты должны иметь один (ca). Скрипты простой генерации пар

#сертификат/ключ лежат в директории easy-rsa

ca /путь/до/ca.crt

cert /путь/до/server.crt

key /путь/до/server.key

#Diffie Hellman параметры

dh dh1024.pem

#Настройка режима сервера и поддержки подсети VPN, откуда будет бряться адрес клиента Себе сервер возьмёт адрес

#192.0.5.1, оставшийся диапазон будет использоваться для клиентов. Закомментируйте эту линию если будет использоваться

#режим моста

server 192.0.5.0 255.255.255.0

#Данный файл содержит записи ассоциаций клиент - виртуальный IP адрес. Если сервер OpenVPN упадёт или перезапустится,

#пересоеденившиеся vpn клиенты получат тот-же IP адрес что и был до этого.

ifconfig-pool-persist ipp.txt

#Настройка режима сервера для сетевого моста. Сначала вы должны настроить режим моста в операционной системе, между

#TAP устройством и ващей сетевой картой. Послу этого выдолжны вручную настроить IP и сетевую маску на интерфейсе моста.

#После этого необходимно настроить диапазон ip адресов для клиентов(start=10.8.0.50 end=10.8.0.100). Оставьте эту строку

#закоментированной если вам не нужен режим моста.

;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

#Даём клиенту необходимые маршруты к подсетям, которые лежат за сервером. Помните что этим подсетям так-же необходимо

#знать маршрут к подсети vpn клиента.

push "route 192.0.4.0 255.255.255.0"

push "route 10.34.21.0 255.255.255.248"

#Для присвоения особого ip адреса определённому клиенту или если у клиента есть своя особенная подсеть к которой он

#должен так-же иметь доступ используйте поддерикторию "ccd" для файлов настроек специфичных для клиента. Пример:

#Допустим у клиента есть сертификат с регулярным именем (Common name) "ivan" и небольшой локальной подсетью, например

#192.168.40.128 255.255.255.248. Сначала нужно раскоментировать строки

;client-config-dir /путь/к/ccd

;route 192.168.40.128 255.255.255.248

#теперь создадим файл ccd/ivan с такой вот строчкой:

# iroute 192.168.40.128 255.255.255.248

#Это позвалит локальой сети ivan'а получить доступ к VPN. Этот пример будет работать только в режиме маршрутизации а не

#моста, т.е. при использовании директив "dev tun" и "server"

#Пример: Допустим вы хотите дать пользователю ivan статичный ip арес 10.9.0.1 Тогда сначала раскоменитируем строки

;client-config-dir ccd

;route 10.9.0.0 255.255.255.252

#Теперь нужно добавить следующую строку в ccd/ivan

# ifconfig-push 10.9.0.1 10.9.0.2

#Допустим вы хотите что-бы у вас были разные правила файрвола для разчных групп пользователей. Есть 2 способа:

#1. Запустить несколько демонов OpenVPN, по одному на каждую группу, и файрволлы для TUN/TAP интерфейсов на каждую #группу/демона соответсвенно.

#2. (Продвинутый) Создать скрипт для динамического изменения правил файрвола для разных групп клиентов (смотри man для #более детальной информации о learn-script) и разкоментировать строку:

;learn-address ./script

#Если включена, данная директива будет настраивать шлюз по умолчаннию для всех клиентов, что-бы весь их трафик, такой

#как просмотр WEB страниц, запросы DNS и т.д. шли через vpn соединение.(Серверу openVPN может потребоваться NAT на

#TUN/TAP интерфейсах, для обеспечния доступа к internet). Предупреждение: могут возникнуть проблеммы с сетью клиента,

#если пакеты его dhcp сервера будут направлены через тунель. Подсказка: будьте уверены что клиентский локальный DHCP

#сервер доступен не только через маршрут по умолчанию(0.0.0.0/0.0.0.0)

;push "redirect-gateway"

#Клиенту могут быть переданы определённые специфичные для windows настройки сети, такие как адреса DNS и WINS

#серверов

;push "dhcp-option DNS 10.8.0.1"

;push "dhcp-option WINS 10.9.0.1"

#Раскоментируйте данную строчку, что-бы позволить различным клиентам "видеть" друг друга. По умолчанию клиенты видят

#только сервер. Для того что-бы жёстко заставить клиентов видеть только сервер вам так-же возможно придётся настроить

#файрфол на TUN/TAP интерфесах.

;clinet-to-client

#Что-бы разрешить клиентам соединяться с сервером при одинаковых файлах сертификатов/ключей или common names,

#разкоментируйте строку. Это рекомендуется только при тестировании.

;duplicate-cn

#Директива keepalive позволяет похожим на пинг сообщениям посылаться и приниматься через тунель, с целью выявления

#разрыва соединения. Пинговать каждые 10 секунд, и считать что соединение разорвано если нет пинга в течении 120 секунд.

keepalive 10 120

#Для большей безопастности, которую обеспечивает SSL/TLS, создайте "HMAC Firewall" что-бы блокировать DoS и флуд по

#UPD протоколу. Создаётся командой: openvpn --genkey --secret ta.key

#Сервер и все клиенты должны иметь копию этого ключа. Второй параметр долже быить 0 на сервере и 1 на клиенте.

;tls-auth ta.key 0

#Выбирите медод криптографического шифрования. Так-же эта настройка должна содержаться в конфиге клиента

;cipher BF-CBC # Blowfish (По умолчанию)

;cipher AES-128-CBC # AES

;cipher DES-EDE3-CBC # Тройной DES

#Включить сжатие на vpn соединении. Если включено здесь, то должно быть включено и в клиентском конфиге.

comp-lzo

#Максимально допустимое число одновременных соеденений.

;max-clients 10

#Правильное решение - снизить права демона OpenVPN, после инициализацииuser nobodyи group nogroup. Наличие данной

#опции позволит избежать нежелательного доступа к важным данным во вемя перезагрузки, до понижения привилегий

persist-keypersist-tun

#Файл статуса, в который пишутся текущие соединения, обновляется и переписывается каждую минуту

status openvpn-status.log

#по умолчанию сообщения лога передаются syslog'у. Используйте log или log-append для изменения этого. "log" перезаписывать

#лог файл после каждого запуска, а "log-append" просто добавлять в конец лога. Используйте только один из вариантов и

#никогда оба одновременно

;log openvpn.log

;log-append openvpn.log

#Выбирите уровень детализации лога

#0 только фатальные ошибки

#4 в основном и имеет смысл использовать

#5-6 могут помочь при отладке сервера

#9 экстремальная детализация

verb 3

#"Тихое" повторение. Не больше 20 одной категории будет записано в лог

;mute 20

Ну вот и закончили описание файла server.conf, файл client.conf по сути является зеркалом server.conf, ну за исключением некоторых специфичных функций.

Вот пример клиентского конфига:

$ cat client.conf

client # показываем что это именно клиентский конфиг

proto udp # тут должно стоять

dev tun # то-же что и в серверном конфиге

remote xxx.xxx.xxx.xxx 1194 # ip адрес и порт(1194) сервера

nobind # не выделять определённый локальный порт для организации канала

persist-key

persist-tun

ca /путь/к/ca.crt # прописываем пути

cert /путь/к/client.crt # к локальным копиям

key /путь/к/client.key # ключей и сетификатов

cipher BF-CBC # тут должно стоять то-же что и в серверном конфиге

comp-lzo # тут должно стоять то-же что и в серверном конфиге

verb 3

Теперь пихаем всё что наваяли в /usr/local/etc/openvpn. Там можно это красиво рассортировать по папочкам, при этом не забыв отразить всё в конфигах :)

Первый пробный запуск.

Для запуска сервера используем команду:

$ openvpn /usr/local/etc/openvpn/server.conf

Если увидим что-то типа:

Sun Feb 6 20:46:38 2005 OpenVPN 2.0_rc12 FreeBSD 6.1 Stable [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

то значит всё в порядке.

и пробуем соединиться!

Если всё пошло нормально, то можно добавить в автозапуск, для этого в /etc/rc.conf добаляем следующие строки:

openvpn_enable="YES" # Включаем автозагрузку

openvpn_if="tun" # выбираем какой драйвер загружать

#

#openvpn_flags="" # флаги командной строки openvpn

openvpn_configfile="/usr/locale/etc/openvpn/server.conf" # Файл конфига, тут он для сервера

openvpn_dir="/usr/local/etc/openvpn" # Корневая директория для openvpn

И посмотрите файл /usr/local/etc/rc.d/openvpn.sh

Я специально не описал даже примерные настройки файвола, поскольку считаю это дело достаточно интимным, у каждого есть свои любимые настройки. Большинство проблем при конфигурировании легко решается заглядываниями в примеры /usr/share/doc/openvpn, они являются практически исчерпывающими.

PS: при написании использовался http://openvpn.net/howto.tml

Обновлено: 12.03.2015