Установка OpenVPN сервера
В этой статье рассматривается установка и создание ключей и сертификатов для OpenVPN cервера и клиентов под Debian GNU/Linux. Несмотря на то, что статья написана для описания процесса соединения локальных сетей двух офисов, описанное здесь действия универсальны для любых целей использования OpenVPN.
Установка OpenVPN
Убедитесь, что пакет openvpn уже установлен. Если еще нет, то в Debian его можно установить, например так:
apt-get install openvpn
root@router ~ # apt-get install openvpn Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: liblzo2-2 libpkcs11-helper1 The following NEW packages will be installed: liblzo2-2 libpkcs11-helper1 openvpn 0 upgraded, 3 newly installed, 0 to remove and 2 not upgraded. Need to get 613 kB of archives. After this operation, 1,474 kB of additional disk space will be used. Do you want to continue [Y/n]? Get:1 http://ftp.debian.org/debian/ testing/main liblzo2-2 i386 2.06-1 [66.2 kB] Get:2 http://ftp.debian.org/debian/ testing/main libpkcs11-helper1 i386 1.09-1 [49.2 kB] Get:3 http://ftp.debian.org/debian/ testing/main openvpn i386 2.2.1-3 [497 kB] Fetched 613 kB in 0s (3,450 kB/s) Preconfiguring packages ... Selecting previously unselected package liblzo2-2. (Reading database ... 51278 files and directories currently installed.) Unpacking liblzo2-2 (from .../liblzo2-2_2.06-1_i386.deb) ... Selecting previously unselected package libpkcs11-helper1. Unpacking libpkcs11-helper1 (from .../libpkcs11-helper1_1.09-1_i386.deb) ... Selecting previously unselected package openvpn. Unpacking openvpn (from .../openvpn_2.2.1-3_i386.deb) ... Processing triggers for man-db ... Setting up liblzo2-2 (2.06-1) ... Setting up libpkcs11-helper1 (1.09-1) ... Setting up openvpn (2.2.1-3) ... Restarting virtual private network daemon.:. localepurge: Disk space freed in /usr/share/locale: 0 KiB localepurge: Disk space freed in /usr/share/man: 0 KiB Total disk space freed by localepurge: 0 KiB
Создание сертификатов и ключей для OpenVPN
Для функционирования OpenVPN необходим сертификат сервера и сертификаты клиентов, выпущенные одним Центром Сертификации (Certification Authority, CA), то есть требуется инфраструктура открытых ключей (Public Key Infrastructure, PKI). Самый простой способ получить эти сертификаты, это воспользоваться входящим в пакет набором скриптов easy-rsa на OpenVPN сервере, который будет принимать входящие подключения.
Пакет openvpn предоставляет набор скриптов называющихся easy-rsa. По умолчанию, эти скрипты находятся в каталоге /usr/share/easy-rsa/ . Однако, они должны находится в /etc/openvpn чтобы работать без проблем. Скопируем эти файлы:
cp -R /usr/share/easy-rsa/ /etc/openvpn
Теперь необходимые для настройки OpenVPN PKI файлы теперь находятся в каталоге /etc/openvpn/easy-rsa/ . Они понадобятся для создания ключей и сертификатов.
Настройка переменных для OpenVPN PKI
Чтобы меньше набирать в последующих действиях, стоит внести несколько исправлений в файл /etc/openvpn/easy-rsa/vars . В самом конце файла находится несколько строк определяющих содержимое создаваемых сертификатов. Измените это по своему усмотрению:
export KEY_COUNTRY="RU" export KEY_PROVINCE="YourProvince" export KEY_CITY="YourCity" export KEY_ORG="YourCompany" export KEY_EMAIL="mail@example.com" export KEY_CN="CommonName" export KEY_NAME="KeyName" export KEY_OU="OrganisationUnit"
KEY_CN, т.е. Common Name сертификата необходимо будет указывать свое для каждого сертификата, таким образом стоит оставить это полу пустым, или ввести что-то, что будет в любом сертификате.
Cтрочки:
export PKCS11_MODULE_PATH=changeme export PKCS11_PIN=1234
лучше закоментировать, эти переменные определены выше.
Из необязательного, можно увеличить размер ключа до 2048, изменив 1024 на 2048 в строке:
export KEY_SIZE=1024
но следует помнить, что это увеличит накладные расходы.
Следующие две строки определяют срок действия выдаваемых сертификатов в днях:
# Срок действия сертификата Центра Сертификации export CA_EXPIRE=3650 # Срок действия выпускаемых сертификатов export KEY_EXPIRE=3650
где значение по-умолчанию составляет приблизительно 10 лет, что более чем достаточно.
Инициализируем инфраструктуру открытых ключей (PKI) для OpenVPN
Следующие команды инициализируют Центр Сертификации (CA) и PKI:
cd /etc/openvpn/easy-rsa/ source vars ./clean-all ./build-ca
Последняя команда запустит генерацию сертификата Центра Сертификации (CA), задав предварительно несколько вопросов, на большинство из которых было отвечено при внесении изменений в файл /etc/openvpn/easy-rsa/vars . Лишь Common Name сертификата должно быть уникальным.
root@router1 ~ # cd /etc/openvpn/easy-rsa/ root@router1 /etc/openvpn/easy-rsa # source vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys root@router1 /etc/openvpn/easy-rsa # ./clean-all root@router1 /etc/openvpn/easy-rsa # ./build-ca 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) [RU]: State or Province Name (full name) [YourProvince]: Locality Name (eg, city) [YourCity]: Organization Name (eg, company) [YourCompany]: Organizational Unit Name (eg, section) [OrganisationUnit]: Common Name (eg, your name or your server's hostname) [CommonName]:CompanyOpenVPNRCA Name [KeyName]:CompanyOpenVPNRCA Email Address [mail@example.com]:
В результате будет сгенерировано два файла: ca.crt с сертификатом центра сертификации и ca.key с приватным ключом. Важно убедиться, что права на чтение приватного ключа есть только у root. Это ключ центра сертификации, и он не должен быть скомпрометирован, иначе придется перевыпустить все сертификаты, так как злоумышленник завладевший таким сертификатом сможет подключиться к OpenVPN серверу.
Создание сертификата сервера OpenVPN
Выпуск сертификата сервера выполняется при помощи команды:
./build-key-server server
по-умолчанию, Common Name сертификата будет server, что в большинстве случаев очень неудобно, и стоит установить Common Name, например, в FQDN имя OpenVPN сервера. Дополнительно запрашиваемые challenge password и optional company name оставьте пустыми.
root@router1 /etc/openvpn/easy-rsa # ./build-key-server router1.example.com Generating a 1024 bit RSA private key .................++++++ .........++++++ writing new private key to 'router1.example.com.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) [RU]: State or Province Name (full name) [YourProvince]: Locality Name (eg, city) [YourCity]: Organization Name (eg, company) [YourCompany]: Organizational Unit Name (eg, section) [OrganisationUnit]: Common Name (eg, your name or your server's hostname) [router1.example.com]: Name [KeyName]:router1.example.com Email Address [mail@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 /etc/openvpn/easy-rsa/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'RU' stateOrProvinceName :PRINTABLE:'YourProvince' localityName :PRINTABLE:'YourCity' organizationName :PRINTABLE:'YourCompany' organizationalUnitName:PRINTABLE:'OrganisationUnit' commonName :PRINTABLE:'router1.example.com' name :PRINTABLE:'router1.example.com' emailAddress :IA5STRING:'mail@example.com' Certificate is to be certified until Jan 31 21:33:25 2022 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
В результате будет создано три файла router1.example.com.csr c кодом запроса сертификата, router1.example.com.key с приватным ключом сертификата и router1.example.com.crt с выпущенным сертификатом. Также важно убедится, что файл с приватным ключом доступен на чтение только для root. Это ключ и сертификат сервера OpenVPN.
Создание сертификатов клиентов
Сертификаты клиентов выпускаются аналогично:
./build-key client1
вместо client1 укажите уникальный идентификатор клиентского подключения. Каждое клиентское подключение должно иметь свой уникальный ключ с уникальным именем. Вся остальная информация может быть одинаковой. Пользователей можно будет добавить в любое время.
root@router1 /etc/openvpn/easy-rsa # ./build-key user_office2 Generating a 1024 bit RSA private key ...++++++ ...............................++++++ writing new private key to 'user_office2.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) [RU]: State or Province Name (full name) [YourProvince]: Locality Name (eg, city) [YourCity]: Organization Name (eg, company) [YourCompany]: Organizational Unit Name (eg, section) [OrganisationUnit]: Common Name (eg, your name or your server's hostname) [user_office2]: Name [KeyName]:user_office2 Email Address [mail@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 /etc/openvpn/easy-rsa/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'RU' stateOrProvinceName :PRINTABLE:'YourProvince' localityName :PRINTABLE:'YourCity' organizationName :PRINTABLE:'YourCompany' organizationalUnitName:PRINTABLE:'OrganisationUnit' commonName :T61STRING:'user_office2' name :T61STRING:'user_office2' emailAddress :IA5STRING:'mail@example.com' Certificate is to be certified until Jan 31 21:50:09 2022 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
В результате будет создано три файла user_office2.csr c кодом запроса сертификата, user_office2.key с приватным ключом сертификата и user_office2.crt с выпущенным сертификатом. Также важно убедится, что файл с приватным ключом доступен на чтение только для root. Это ключ и сертификат клиента сервера OpenVPN.
Генерация Diffie Hellman параметров
Diffie Hellman параметры определяют метод авторизации и обмена ключами используемый OpenVPN сервером. Следующая команда создает эти параметры:
./build-dh
И да, это может длиться относительно долго.
root@router1 /etc/openvpn/easy-rsa # ./build-dh Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time .........+............+............................................................. ...................+............................................................+... .......................+............................................................ ..............+...............+..................................................... .............+................+.............................................+....... .............................+..................................+................... ........................................................+........................+.. +.................................+....................................+............ .................................................................+.................. .............................................+...+.................................. ...............+.................................................................... .................................................................................... .............................++*++*++*
Перемещение ключей
Все созданные ключи и сертификаты сейчас находятся в каталоге /etc/openvpn/easy-rsa/keys/ . Их необходимо переместить.
Серверу OpenVPN понадобится сертификат центра сертификации, сертификат и ключ сервера а также параметры Diffie Hellman. В случае вышеописанного примера, это файлы:
ca.crt dh1024.pem router1.example.com.crt router1.example.com.key
Эти файлы необходимо скопировать в каталог /etc/openvpn/ на этом же хосте:
cd /etc/openvpn/easy-rsa/keys cp ca.crt dh1024.pem router1.example.com.crt router1.example.com.key /etc/openvpn
На клиентский хост, который будет выполнять подключение к серверу OpenVPN необходимо скопировать приватный ключ и сертификат клиента, а также сертификат центра сертификации. В случае вышеописанного примера, это файлы:
ca.crt user_office2.crt user_office2.key
Обратите внимание, приватный ключ центра сертификации копировать не следует! Мало того, в случае если произойдет утечка приватного ключа центра сертификации, то будет необходимо перевыпустить все сертификаты.
Настройка OpenVPN сервера и клиента
Установка и создание ключей и сертификатов для OpenVPN сервера и клиента описана в предыдущей статье Установка OpenVPN сервера. Теперь сервер и клиент готовы к настройке.
Настройка OpenVPN сервера
Создание ключей и сертификатов для OpenVPN сервера было описано в предыдущей статье об установке OpenVPN сервера. Подготовленные ключи и сертификаты были перенесены в каталог /etc/openvpn .
В пакет openvpn включен пример конфигурационного файла для OpenVPN сервера. Он находится в архиве server.conf.gz в каталоге /usr/share/doc/openvpn/examples/sample-config-files . Распакуем и переместим его в директорию /etc/openvpn :
cd /usr/share/doc/openvpn/examples/sample-config-files gunzip -d server.conf.gz mv server.conf /etc/openvpn/
Изменений в этот конфигурационный файл будет немного. Необходимо указать файл приватного ключа и сертификата OpenVPN сервера созданного по инструкции установки OpenVPN сервера:
cert router1.example.com.crt key router1.example.com.key
Указать виртуальную подсеть (описание структуры сетей для этого примера находится в заглавной статье) :
server 192.168.50.0 255.255.255.0
Сообщить подключающемуся клиенту изменения в его таблицу роутинга:
push "route 192.168.100.0 255.255.255.0"
Эта строчка заставит OpenVPN клиент при подключении к серверу модифицировать свою таблицу роутинга. В логе клиента OpenVPN при подключении появится строка:
Sat Feb 4 13:21:59 2012 /sbin/route add -net 192.168.100.0 netmask 255.255.255.0 gw 192.168.50.5
Поскольку все компьютеры в обеих сетях должны видеть друг-друга, то необходимо внести изменения в таблицу роутинга OpenVPN сервера:
client-config-dir ccd route 192.168.200.0 255.255.255.0
Также нужно создать директорию /etc/openvpn/ccd , в которой создать файл с именем подключающегося клиента. В нашем примере это user_office2. Этот файл будет состоять из единственной строчки:
192.168.200.0="" 255.255.255.0="" iroute="" pre=""
Без этих трех строчек подключивший клиент увидит все компьютеры в сети OpenVPN сервера, но остальные компьютеры в подключающейся сети, подключенную сеть не увидят, как и из сети OpenVPN сервера подключенная сеть останется недоступной.
Также следует выбрать криптографический механизм, раскомментировав одну из строк:
;cipher BF-CBC # Blowfish (default) cipher AES-128-CBC # AES ;cipher DES-EDE3-CBC # Triple-DES
Выбранный механизм шифрования нужно будет прописать всем клиентам подключающимся к этому OpenVPN серверу.
Имеет смысл раскомментировать строчки:
user nobody group nogroup
чтобы уменьшить привилегии OpenVPN сервера после инициализации. Что впрочем добавит сообщения об ошибках в лог OpenVPN сервера. Например, при остановке OpenVPN сервера в логе появятся сообщения об ошибках в духе:
Feb 4 13:37:08 router ovpn-server[6628]: /sbin/route del -net 192.168.50.0 netmask 255.255.255.0 Feb 4 13:37:08 router ovpn-server[6628]: ERROR: Linux route delete command failed: external program exited with error status: 7 Feb 4 13:37:08 router ovpn-server[6628]: /sbin/route del -net 192.168.200.0 netmask 255.255.255.0 Feb 4 13:37:08 router ovpn-server[6628]: ERROR: Linux route delete command failed: external program exited with error status: 7
что логично, ведь с правами nobody:nogroup вносить изменения в таблицу роутинга нельзя. Впрочем таблица роутинга всё же будет подчищена, так как интерфейс tun будет удален.
По умолчанию текущий статус сохраняется в файл /etc/openvpn/openvpn-status.log . Стоит изменить, например на:
status /var/log/openvpn/status_server.log
Каталог для статусного файла должен существовать, автоматически он не создается. Статусный файл перезаписывается раз в минуту. Если в нем нет необходимости, можно просто закомментировать эту строку.
В результате получится конфигурационный файл для OpenVPN сервера:
port 1194 proto udp dev tun ca ca.crt cert router1.example.com.crt key router1.example.com.key dh dh1024.pem server 192.168.50.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 192.168.100.0 255.255.255.0" client-config-dir ccd route 192.168.200.0 255.255.255.0 keepalive 10 120 cipher AES-128-CBC comp-lzo user nobody group nogroup persist-key persist-tun status /var/log/openvpn/status_server.log verb 3
После конфигурирования OpenVPN сервера, его можно запустить. В Debian это делается так:
/etc/init.d/openvpn start
Поскольку путь и имя лог файла не указаны, OpenVPN будет отправлять свой лог в syslog.
Настройка OpenVPN клиента
Создание ключей и сертификатов для OpenVPN клиента было описано в предыдущей статье об установке OpenVPN клиента. Подготовленные ключи и сертификаты были перенесены в каталог /etc/openvpn .
В пакет openvpn включен пример конфигурационного файла для клиента OpenVPN. Он находится в файле client.conf в каталоге /usr/share/doc/openvpn/examples/sample-config-files . Переместим его в директорию /etc/openvpn :
cd /usr/share/doc/openvpn/examples/sample-config-files cp client.conf /etc/openvpn/
Изменений в конфигурационный файл клиента будет очень мало. Указываем адрес OpenVPN сервера:
remote router1.example.com 1194
Файл приватного ключа и сертификата OpenVPN клиента созданного по инструкции установки OpenVPN клиента:
cert user_office2.crt key user_office2.key
Необходимо выбрать тот же механизм шифрования, что и на сервере:
;cipher BF-CBC # Blowfish (default) cipher AES-128-CBC # AES ;cipher DES-EDE3-CBC # Triple-DES
В этом конфигурационном файле клиента OpenVPN отсутствуют директивы указывающие на расположение лог файла и статусного файла. Можно добавить их:
log-append /var/log/openvpn/openvpn_client.log status /var/log/openvpn/status_client.log
На время тестирования, директиву log-append можно закомментировать, тогда при тестовом запуске OpenVPN клиента, вывод лог файла пойдет на stdout.
Каталог для статусного файла должен существовать, автоматически он не создается. Статусный файл перезаписывается раз в минуту. Если в нем нет необходимости, можно просто закомментировать эту строку.
В результате получится конфигурационный файл для OpenVPN клиента:
client dev tun proto udp remote router1.example.com 1194 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ca ca.crt cert user_office2.crt key user_office2.key ns-cert-type server cipher AES-128-CBC comp-lzo verb 3 log-append /var/log/openvpn/openvpn_client.log status /var/log/openvpn/status_client.log
Клиент готов к подключению, это можно сразу проверить:
openvpn client.conf
Если директива log-append не была указана, то вывод лога будет производится на stdout.
Проверка соединения
Проверять соединение двух сетей необходимо не с роутеров, а с любых других машин в локальных сетях. Это связано с тем, что если команды изменения роутинга были заданы неверно или не указаны совсем, то клиент и сервер OpenVPN будут видеть друг-друга, а остальные компьютеры в локальных сетях нет.
Предположим, что в первой сети с OpenVPN сервером есть компьютер с IP адресом 192.168.100.2, а во второй сети, с OpenVPN клиентом есть компьютер с IP адресом 192.168.200.2. В этом случае проверка осуществляется на них, простым пингом.
Из первой сети, с компьютера с адресом 192.168.100.2 пингаем адрес 192.168.200.2:
ping 192.168.200.2
Из второй сети, с компьютера с адресом 192.168.200.2 пингаем адрес 192.168.100.2:
ping 192.168.100.2
Оба компьютера должны быть доступны друг для друга.
NAT для этих сетей не нужен, это лишняя сущность и лишняя нагрузка. Никакой дополнительной конфигурации таблицы роутинга также не требуется. OpenVPN всё сделает сам, на основании своих конфигурационных файлах.
Путь между сетями будет выглядеть приблизительно так:
user@192.168.200.2 ~ # traceroute 192.168.100.2 traceroute to 192.168.100.2 (192.168.100.2), 30 hops max, 60 byte packets 1 192.168.200.1 (192.168.200.1) 0.133 ms 0.122 ms 0.150 ms 2 192.168.50.1 (192.168.50.1) 54.832 ms 56.607 ms 58.321 ms 3 192.168.100.2 (192.168.100.2) 64.376 ms 65.274 ms 65.959 ms
Соединение двух сетей при помощи OpenVPN
Для безопасного соединения компьютерных сетей в двух территориально разделенных офисах можно использовать OpenVPN. В этой серии статей рассматривается частный случай соединения двух сетей при помощи OpenVPN установленного на двух Debian‘ах.
В связи с большим объемом, инструкция по объединению сетей с OpenVPN разделена на несколько частей.
Данные для примера конфигурации
При описании параметров конфигурационных файлов понадобится указывать IP адреса и имена хостов. В качестве примера, будут использованы нижеследующие сведения об объединяемых сетях.
Сервер OpenVPN будет расположен в первой сети, которая имеет реальный IP адрес в Internet. Клиент OpenVPN из территориально удаленной второй сети будет подключаться к серверу OpenVPN в первой сети.
Первая сеть для соединения при помощи OpenVPN
Локальная сеть 192.168.100.0 mask 255.255.255.0 .
OpenVPN сервер будет настроен на компьютере под управлением Debian с адресом 192.168.100.1, имеющем реальный IP адрес в сети Интернет и fqdn имя router1.example.com .
Вторая сеть для соединения при помощи OpenVPN
Локальная сеть 192.168.200.0 mask 255.255.255.0 .
OpenVPN клиент будет настроен на компьютере с адресом 192.168.200.1 .
Виртуальная сеть OpenVPN
Для сети OpenVPN выделяется подсеть 192.168.50.0 mask 255.255.255.0 .
Источник:
https://chmv.allnetic.com/article/ustanovka-openvpn-servera/
https://chmv.allnetic.com/article/nastroyka-openvpn-servera-i-klienta/
https://chmv.allnetic.com/article/soedinenie-dvuh-setey-pri-pomoschi-ope...