Инструкция описывает процесс установки и настройки серверной и клиентской частей OpenVPN. Решение предназначено для подключения удаленных клиентов к сети предприятия. После подключения у клиента сохраняется собственный шлюз по-молчанию и не блокируется выход в интернет. Решение показало простоту в настройке клиентской части, было опробовано (и используется в настоящее время) на Windows-XP, Windows-7, Andriod 3.x, Archlinux, Ububnu. Есть информация об успешном подключении и iPad.


Установка 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-сервера, которых знает имена ваших локальных хостов.

/usr/local/etc/openvpn/server.conf
 # 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/
 $ 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)


  1. DimaSmirnov
    28.09.2015 12:23
    +8

    а мужики то не знают…


  1. ValdikSS
    28.09.2015 12:48
    +1

    А зачем вы такие проблемы себе с адресами создали? У вас же и так указана директива server и ifconfig-pool-persist, зачем вы создаете client-config для каждого клиента, указывая там его адрес?
    Да и p2p-топологию не рекомендуют разработчики OpenVPN использовать, хоть она и по умолчанию. Используйте topology subnet.


    1. bigov
      28.09.2015 15:34

      Не понял в чем проблема? Решение предназначено для удаленных клиентов, которые

      • должны быть изолированы друг от друга
      • используют различные, в том числе устаревшие ОС
      • после подключения продолжают использовать собственный шлюз по-умолчанию для выхода в интернет.
      • Поэтому самым очевидным решением было использовать для каждого подсеть /30 чтобы разделить их на уровне маршрутизации пакетов.


      1. ValdikSS
        28.09.2015 15:46

        Хм, ну, этого всего можно и с topology subnet добиться, но я вас понял. Однако, не понял, зачем все-таки нужны клиентские конфиги с IP.


        1. 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>


          1. ValdikSS
            28.09.2015 15:59

            Но ifconfig-push-то все-равно лишний, или я что-то упустил?


            1. bigov
              28.09.2015 16:10

              А как же клиенту без ifconfig-push указать адрес в момент открытия соединения? Или я что-то упустил?


              1. ValdikSS
                28.09.2015 16:34

                Он выдаваться будет из диапазона, указанного в server.


                1. bigov
                  28.09.2015 16:45

                  Такой вариант конфига я не тестировал, возможно так будет работать. Но во-первых, это (потенциально) позволит с одним сертификтом открыть несколько сессий — адреса же не будут перескаться. А тут — жесткая блокировка одной сесии по IP адресу. А во вторых, у меня еще биллинг завязан для контроля, который активность клиентов в базу данных пишет. А логин клиента к IP адресу биллинг парсит как раз из этого файлика. Как то так.


                  1. ValdikSS
                    28.09.2015 16:59
                    +1

                    Нет, пока вы не используете опцию duplicate-cn, с одним сертификатом несколько раз подключиться не получится.


  1. Aclz
    28.09.2015 13:09

    Давно не пользуюсь easy-rsa из-за невозможности контролировать параметры генерации ключей и не всегда устраивающими параметрами по-умолчанию (длина ключей 1024 бит и т.п.). OpenSSL напрямую ничем не сложнее, зато всё можно сделать как надо.


    1. ValdikSS
      28.09.2015 15:05

      Попробуйте мой Easy-RSA 3 с патчами.


      1. Aclz
        28.09.2015 15:37

        Дык а в чем смысл в дополнительных костылях, когда всё это обёртки над OpenSSL, имеющий и так простейший синтаксис?


        1. ValdikSS
          28.09.2015 15:42

          Да просто удобно. Но если вы хорошо знаете openssl, то да, пожалуй, для вас бессмысленно.


    1. bigov
      28.09.2015 15:48

      Думаю, это дело личного вкуса админа. Мне тогда показалось easy-rsa вкуснее.


  1. chelaxe
    29.09.2015 07:36

    Перешел на SoftEther. Это просто красота.


    1. bigov
      29.09.2015 08:31
      +1

      Я посмотрел сайт SoftEther и пост ValdikSS. Внешне все круто. Лично для себя (для подключения «на коленке») я с удовольствием буду его использовать и заодно тестить. НО!

      Когда речь идет о срочной организации ( как обычно — надо было вчера ) VPN-сервера для крупного предприятия, а в репозториях Debian, Archlinux, FreeBSD, Ubuntu нет даже упоминаний о нем… Хм. Без длительного тестирования такой софт на север предприятия я не поставлю. Можете называть меня перестраховщиком, но я сисадмин, а не тестировщик или камикадзе.


      1. 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