Как настроить сеть в OpenVPN?

 

Установка 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...

Вы можете задать вопрос по статье специалисту.

Возможность удаленной диагностики сбоев и консультации по восстановлению работоспособности сети.

Помните, что все действия вы выполняете на свой страх и риск — загрузка неверных данных может повлечь за собой крах системы и потерю информации.
Тестирование в тестовой среде никто не отменяет.
Администрация сайта не несет ответственность за ваши действия.
Вся информация на сайте носит исключительно справочный характер и не является публичной офертой, определяемой в Статье 437 Гражданского кодекса Российской Федерации.