- Установка OpenVPN сервера
- Создание клиентского сертификата OpenVPN
- Инструкция по настройке клиентского подключения OpenVPN
Установка OpenVPN сервера (FreeBSD).
Устанавливаем пакет из портов. Опции можно оставить по умолчанию. Главное, не отключайте 'easy-rsa', так как он потребуется для настройки и генерации сертификатов:
# cd /usr/ports/security/openvpn
# make configure-recursiv install clean
Или:
# make configure-recursiv install clean -С /usr/ports/security/openvpn
Создаем каталоги для конфигов:
# mkdir /usr/local/etc/openvpn/
# mkdir /usr/local/etc/openvpn/ccd
Копируем каталог easy-rsa в каталог конфигов OpenVPN:
# cp -r /usr/local/share/easy-rsa /usr/local/etc/openvpn/
Переходим в скопированный каталог:
# cd /usr/local/etc/openvpn/easy-rsa/
Переходим в оболочку sh:
# sh
Выполняем команду для генерации собственного сертификата:
# . ./vars
# ./clean-all
# ./build-ca
Данные для сертификата заполните в соотвествии с вопросами.
# ./build-key-server vpn0.example.com
'Common name' должно соответствовать DNS имени вашего VPN-сервера, например: 'vpn0.example.com'. На последние вопросы отвечаем 'Y'.
# ./build-dh
Теперь делаем сертификат для клиента с именем 'client'. Тут также на последние вопросы отвечаем 'Y'
# ./build-key client
Выходим из sh оболочки:
# exit
Cоздаем ключ для tls-аутификации:
# /usr/local/sbin/openvpn --genkey --secret /usr/local/etc/openvpn/easy-rsa/keys/ta.key
Создаем файл server.conf (ниже под спойлером). Не забудьте в нем указать адрес внутреннего DNS-сервера, которых знает имена ваших локальных хостов.
# cat /usr/local/etc/openvpn/server.conf
local vpn0.example.com
port 1194
proto udp
dev tun
ca /usr/local/etc/openvpn/easy-rsa/keys/ca.crt
cert /usr/local/etc/openvpn/easy-rsa/keys/vpn0.example.com.crt
key /usr/local/etc/openvpn/easy-rsa/keys/vpn0.example.com.key
dh /usr/local/etc/openvpn/easy-rsa/keys/dh1024.pem
tls-server
tls-auth /usr/local/etc/openvpn/easy-rsa/keys/ta.key 0
server 172.17.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-config-dir ccd
push "route 10.10.210.72 255.255.255.248"
push "route 172.27.102.0 255.255.255.0"
push "route 172.27.103.0 255.255.255.0"
push "route 172.27.105.0 255.255.255.0"
push "dhcp-option DNS 192.168.100.1"
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
Для каждого клиента надо будет создавать на сервере файл-конфиг пользователя, где указывается назначаемый клиенту IP адрес и шлюз. Например, для клиента с именем 'client':
# cat /usr/local/etc/openvpn/ccd/client
ifconfig-push 172.17.0.2 172.17.0.1
Для запуска даймона OpenVPN при загрузке операционной системы добавим в '/etc/rc.conf' строки:
openvpn_enable="YES"
openvpn_if="tun"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"
openvpn_dir="/usr/local/etc/openvpn"
Запуск сервиса:
# /usr/local/etc/rc.d/openvpn start
Starting openvpn.
add net 172.17.0.0: gateway 172.17.0.2
Если стоит задача предоставлять пользователям через OpenVPN Интернет, то потребуется наличие NAT. Можно включить его поддержку через загружаемые модули, для этого в файл '/boot/loader.conf' надо добавить строки:
ipfw_nat_load="YES"
libalias_load="YES"
Пример настройки NAT IPFW:
${ipfw} nat 1 config if re0 reset same_ports
${ipfw} add nat 1 ip from 172.17.0.0/24 to any via $INT_if
${ipfw} add nat 1 ip from any to $EXT_ip
${ipfw} add allow all from any to any
Все, сервер OpenVPN установлен, настроен и запущен. Теперь можно заняться клиентами.
Создание клиентского сертификата OpenVPN
Описание приведено для сервера на операционной системе FreeBSD с установленным и настроеным, как описано выше, сервисом OpenVPN.
Сертификат генерируется из системной консоли сервера с правами суперпользователя из каталога easy-rsa:
$ cd /usr/local/etc/openvpn/easy-rsa/
$ sudo /bin/sh
# . ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/local/etc/openvpn/easy-rsa/keys
# ./build-key ЛОГИН_ПОЛЬЗОВАТЕЛЯ
Generating a 1024 bit RSA private key
......++++++
....++++++
writing new private key to 'ЛОГИН_ПОЛЬЗОВАТЕЛЯ.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 source) [US]:RU
State or Province Name (full name) [CA]:ZC
Locality Name (eg, city) [SanFrancisco]:Zabubensk
Organization Name (eg, company) [Fort-Funston]:JSC Zabuba
Organizational Unit Name (eg, section) [changeme]:ITD
Common Name (eg, your name or your server's hostname) [ЛОГИН_ПОЛЬЗОВАТЕЛЯ]:
!----------------------------------------------------------------------!
! ВНИМАНИЕ ! использовать только латинские буквы. Кирилица не работает !
!----------------------------------------------------------------------!
Name [changeme]:ИМЯ ФАМИЛИЯ
Email Address [mail@host.domain]:ЛОГИН_ПОЛЬЗОВАТЕЛЯ@zabubensk.example.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/local/etc/openvpn/easy-rsa/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'ZC'
localityName :PRINTABLE:'Zabubensk'
organizationName :PRINTABLE:'JSC Zabuba'
organizationalUnitName:PRINTABLE:'ITD'
commonName :PRINTABLE:'ЛОГИН_ПОЛЬЗОВАТЕЛЯ'
name :PRINTABLE:'ИМЯ ФАМИЛИЯ'
emailAddress :IA5STRING:'ЛОГИН_ПОЛЬЗОВАТЕЛЯ@zabubensk.example.com'
Certificate is to be certified until Nov 12 06:24:49 2023 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
#
# exit
В результате будут сгенерированы клиентские файлы сертификатов для подключения. Далее, необходимо создать файл `/usr/local/etc/openvpn/ccd/ЛОГИН_ПОЛЬЗОВАТЕЛЯ` с одной строкой вида:
$ sudo ee /usr/local/etc/openvpn/ccd/ЛОГИН_ПОЛЬЗОВАТЕЛЯ
ifconfig-push 172.17.0.118 172.17.0.117
Каждая пара адресов в ifconfig-push соответствует виртуальным IP-адресам конечных точек (клиента и сервера) — каждому клиенту в момент подключения назначается своя подсеть. Сюда-же можно добавить дополнительные маршруты, если клиенты подключаются к разным подсетям (филиалы, технические специалисты)
$ sudo ee /usr/local/etc/openvpn/ccd/ЛОГИН_ПОЛЬЗОВАТЕЛЯ
ifconfig-push 172.17.0.118 172.17.0.117
push "route 10.12.1.0 255.255.255.0"
push "route 10.12.2.0 255.255.255.0"
push "route 192.168.10.0 255.255.255.0"
Чтобы сохранить совместимость с Windows-клиентами и драйвером TAP-Win32 эти адреса должны быть взяты из следующих друг за другом подсетей с маской /30. Например, для диапазона `172.17.0.1-172.17.0.254` последний октет IP-адреса каждой пары клиент-сервер следует назначать из набора:
[ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]
Для удобства работы я создал текстовый файл «/usr/local/etc/openvpn/not_use_ip.txt» в котором перечислены свободные пары адресов, удаляемые по мере раздачи клиентам. Обратите внимание, что в конфигурационном фале первым задается назначаемый клиенту IP адрес (старший), вторым — адрес сервера (на единицу меньше).
После добавления клиента желательно перезапустить сервис OpenVPN:
$ sudo /usr/local/etc/rc.d/openvpn restart
Stopping openvpn.
Waiting for PIDS: 62293.
Starting openvpn.
add net 172.17.0.0: gateway 172.17.0.2
Клиенту необходимо передать пять файлов (ca.crt, vpn0.crt, vpn0.key, ta.key, vpn0.example.com.ovpn):
- /usr/local/share/doc/openvpn/easy-rsa/keys/ca.crt
- /usr/local/share/doc/openvpn/easy-rsa/keys/ЛОГИН_ПОЛЬЗОВАТЕЛЯ.crt > vpn0.crt
- /usr/local/share/doc/openvpn/easy-rsa/keys/ЛОГИН_ПОЛЬЗОВАТЕЛЯ.key > vpn0.key
- /usr/local/etc/openvpn/easy-rsa/keys/ta.key
- /usr/local/etc/openvpn/vpn0.example.com.ovpn
Перечисленные файлы копируются в отдельную (временную) папку с именем «config», файлы вида «ЛОГИН_ПОЛЬЗОВАТЕЛЯ.*» в ней переименовываются в «vpn0.*», папка упаковывается в архив и высылается пользователю электронной почтой со ссылкой на инструкцию по настройке клиентского подключения OpenVPN (см. ниже).
Инструкция по настройка клиентского подключения OpenVPN
(Для пользователей не имеющих технической подготовки)Для установки и настройки OpenVPN соединения необходимо вначале определить разрядность своей операционной системы. Для 32-разрядных систем установочный файл клиента OpenVPN оканчивается на "-i686.exe". Если же у Вас 64-разрядная MS-Windows, то Вам нужен файл, в названии которого есть "-x86_64.exe". Кроме того, для VPN подключения к сети Вам потребуются клиентские сертификаты и файл настройки, которые можно получить у системного администратора.
Для MS-Windows cкачайте и установите соответствующую клиентскую программу OpenVPN (для Android и iOS есть пакеты в собственных репозиториях market/store). Перейдите в каталог программы OpenVPN (C:Program Files\OpenVPN) и скопируте в него папку
config
со всем содержимым, полученную у системного администратора. В этой папке расположены ваши клиентские сертификаты и настройки подключения к серверу VPN.Названия файлов в папке config у Вас могут незначительно отличаться. Запустите OpenVPN клиент от имени Администратора или измените свойства ярлыка на Рабочем столе (установить галочку “выполнять от имени администратора”).
Подключение к локальной сети предприятия через Интернет производися через контекстное меню или двойным кликом на иконке OpenVPN в системной области панели задач. Подключиться можно только находясь за пределами сети предприятия. Соединения изнутри сети сервер OpenVPN не принимает.
После успешного завершения процедуры подключения иконка OpenVPN в панели задач изменит цвет на зеленый и появится всплывающая подсказка с назначенным VPN-клиенту IP адресом. Адрес «привязыватся» к сертификату, поэтому с одним и тем-же сертификатом одновременно с двух и более рабочих мест работать не получится из-за конфликта адресов.
После подключения Вам станут доступны все сервисы (RDP, FTP, HTTP …) как по IP адресу так и по доменному имени в разрешенном системным администратором сегменте локальной сети, за исключением возможности подключения сетевых дисков, заблокированной по соображениям безопасности.
Документация и дистрибутив:
Комментарии (18)
ValdikSS
28.09.2015 12:48+1А зачем вы такие проблемы себе с адресами создали? У вас же и так указана директива server и ifconfig-pool-persist, зачем вы создаете client-config для каждого клиента, указывая там его адрес?
Да и p2p-топологию не рекомендуют разработчики OpenVPN использовать, хоть она и по умолчанию. Используйте topology subnet.bigov
28.09.2015 15:34Не понял в чем проблема? Решение предназначено для удаленных клиентов, которые
- должны быть изолированы друг от друга
- используют различные, в том числе устаревшие ОС
- после подключения продолжают использовать собственный шлюз по-умолчанию для выхода в интернет.
Поэтому самым очевидным решением было использовать для каждого подсеть /30 чтобы разделить их на уровне маршрутизации пакетов.
ValdikSS
28.09.2015 15:46Хм, ну, этого всего можно и с topology subnet добиться, но я вас понял. Однако, не понял, зачем все-таки нужны клиентские конфиги с IP.
bigov
28.09.2015 15:58Я понял. Это не отмечено в статье, надо будет поправить. Дело в индивидуальном подходе и жестком разграничении доступа — безопасность. Представьте большое предприятие с десятком филилов. У каждого филиала собственная подсеть или несколько. А точка входа одна — корпоративный OpenVPN шлюз. Для разрешения доступа только в те подсети, куда клиенту можно ходить в индивидуальный файл дописываются, например, маршруты в его рабочие сети:
ifconfig-push 172.17.0.6 172.17.0.5 push "route 10.12.0.0 255.255.255.0" push "route 192.168.100.0 255.255.255.0"</souce>
ValdikSS
28.09.2015 15:59Но ifconfig-push-то все-равно лишний, или я что-то упустил?
bigov
28.09.2015 16:10А как же клиенту без ifconfig-push указать адрес в момент открытия соединения? Или я что-то упустил?
ValdikSS
28.09.2015 16:34Он выдаваться будет из диапазона, указанного в server.
bigov
28.09.2015 16:45Такой вариант конфига я не тестировал, возможно так будет работать. Но во-первых, это (потенциально) позволит с одним сертификтом открыть несколько сессий — адреса же не будут перескаться. А тут — жесткая блокировка одной сесии по IP адресу. А во вторых, у меня еще биллинг завязан для контроля, который активность клиентов в базу данных пишет. А логин клиента к IP адресу биллинг парсит как раз из этого файлика. Как то так.
ValdikSS
28.09.2015 16:59+1Нет, пока вы не используете опцию
duplicate-cn
, с одним сертификатом несколько раз подключиться не получится.
Aclz
28.09.2015 13:09Давно не пользуюсь easy-rsa из-за невозможности контролировать параметры генерации ключей и не всегда устраивающими параметрами по-умолчанию (длина ключей 1024 бит и т.п.). OpenSSL напрямую ничем не сложнее, зато всё можно сделать как надо.
chelaxe
29.09.2015 07:36Перешел на SoftEther. Это просто красота.
bigov
29.09.2015 08:31+1Я посмотрел сайт SoftEther и пост ValdikSS. Внешне все круто. Лично для себя (для подключения «на коленке») я с удовольствием буду его использовать и заодно тестить. НО!
Когда речь идет о срочной организации ( как обычно — надо было вчера ) VPN-сервера для крупного предприятия, а в репозториях Debian, Archlinux, FreeBSD, Ubuntu нет даже упоминаний о нем… Хм. Без длительного тестирования такой софт на север предприятия я не поставлю. Можете называть меня перестраховщиком, но я сисадмин, а не тестировщик или камикадзе.chelaxe
29.09.2015 08:46Работает уже год. Собрал сервер под OpenWRT есть и в Ubuntu. Клиентов 20-30. Работает на весьма ответственном участке. Сбои по вине SoftEther не было ни разу.
Управление как из менеджеров через сеть — что крайне удобно, так из консоли непосредственно на сервере. Работают как клиенты SoftEther так и OpenVPN и L2TP в Android устройствах. Есть DDNS встроенный. Можно сервера объединять. У нас так объединены клиенты в общую сеть с нами. Правда пришлось адреса NETMAP`ом разруливать из за одинаковых подсетей.
для OpenWRT
тут все очень подробно расписано:
wordpress.tirlins.com/?p=63
Для Ubuntu.
sudo apt-add-repository ppa:dajhorn/softether
sudo apt-get update
sudo apt-get install softether -y
sudo service softether start
DimaSmirnov
а мужики то не знают…