Настройка OpenVPN на примере двух RTUx68

Настройка OpenVPN на примере двух RTUx68

← Все разделы FAQ

Разделы FAQ:

Оглавление

Введение

OpenVPN позволяет объединить локальные сети двух удалённых объектов в одну сеть через интернет. В статье рассматривается настройка туннеля между двумя роутерами TELEOFIS RTU1068 с операционной системой OpenWrt: один работает в режиме сервера, второй — в режиме клиента.

Задача — объединить подсети 192.168.89.0/24 (сервер) и 192.168.88.0/24 (клиент) так, чтобы устройства в них видели друг друга.

Обязательное условие: роутер в роли сервера должен иметь статический IP-адрес — внешний или внутренний в закрытой сети APN. Именно этот адрес указывается на клиентах в параметре remote. Клиент может работать и с динамическим адресом.

Схема стенда: слева клиент с динамическим адресом, справа сервер со статическим.

Схема сети: роутер-клиент с динамическим адресом и роутер-сервер со статическим адресом, объединённые туннелем


Подготовка сертификатов и ключей

Сервер и клиент проверяют друг друга по сертификатам, подписанным общим центром сертификации. Процесс выпуска сертификатов описан в отдельной статье: Создание сертификатов OpenVPN с помощью XCA.

Дополнительно понадобятся два файла, которых нет в той инструкции:

  • Параметры Диффи — Хеллмана — генерируются в XCA;
  • Ключ ta.key — для дополнительной TLS-аутентификации, генерируется на роутере.

Генерация параметров Диффи — Хеллмана

В XCA откройте меню Дополнительно → Сгенерировать параметры Диффи — Хеллмана и укажите длину 2048.

Меню генерации параметров Диффи — Хеллмана в XCA

Сохранение файла параметров Диффи — Хеллмана

Генерация ключа ta.key

Подключитесь к роутеру через консоль — порядок описан в статье Как подключиться к роутеру RTUx68?

Установите утилиту openssl-util. Подайте команду opkg update и после вывода Signature check passed — команду opkg install openssl-util:

root@RTU1068_Server:~# opkg install openssl-util
Installing openssl-util (1.1.1t-2) to root...
Downloading https://downloads.openwrt.org/releases/21.02.2/packages/arm_arm926ej-s/base/openssl-util_1.1.1t-2_arm_arm926ej-s.ipk
Installing libopenssl-conf (1.1.1t-2) to root...
Downloading https://downloads.openwrt.org/releases/21.02.2/packages/arm_arm926ej-s/base/libopenssl-conf_1.1.1t-2_arm_arm926ej-s.ipk
Configuring libopenssl-conf.
Configuring openssl-util.
root@RTU1068_Server:~#

Сгенерируйте ключ:

openvpn --genkey secret ta.key

Ключ появится в директории /root/. Выгрузите его с роутера с помощью WinSCP — он понадобится и на сервере, и на клиенте.


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

Настройка OpenVPN

Перейдите в конфигурацию OpenVPN и откройте её на редактирование.

Раздел OpenVPN в веб-интерфейсе роутера

Переход к редактированию конфигурации OpenVPN

Задайте основные параметры:

  • port — 1194;
  • server — подсеть туннеля. В примере используется 10.0.0.0 255.255.255.0: сервер получает первый адрес 10.0.0.1, клиенты — остальные свободные адреса этой сети;
  • dev_type — tun;
  • proto — UDP;
  • ca — импортируйте сертификат центра сертификации;
  • cert — импортируйте сертификат сервера;
  • key — импортируйте закрытый ключ сервера;
  • dh — импортируйте параметры Диффи — Хеллмана;
  • verb — на время отладки туннеля укажите значение от 7 до 9: журналирование станет расширенным, и при проблемах с подключением можно будет разобраться по журналу.

Основные параметры конфигурации OpenVPN на сервере

Перейдите в расширенные настройки.

Кнопка перехода в расширенные настройки OpenVPN

На вкладке VPN добавьте параметр route с маршрутом в подсеть клиента — 192.168.88.0 255.255.255.0 10.0.0.5. Там же добавьте параметр topology со значением subnet. Сохраните изменения.

Параметры route и topology на вкладке VPN

На той же вкладке добавьте ещё два параметра:

  • client_config_dir — директория файлов ccd: /etc/openvpn/ccd/;
  • push — маршрут в подсеть сервера: route 192.168.89.0 255.255.255.0 10.0.0.1.

Параметры client_config_dir и push на вкладке VPN

Сохраните изменения и перейдите на вкладку Криптография. С помощью WinSCP перенесите ta.key в директорию /etc/openvpn/, затем добавьте параметр tls_auth со значением /etc/openvpn/ta.key 0. Цифра 0 после пути означает, что сторона авторизуется как сервер.

Параметр tls_auth на вкладке «Криптография»

Примените изменения.

Файл ccd для клиента

Чтобы сервер знал, какая подсеть находится за клиентом, создайте для него файл ccd. Настройка выполняется через консоль.

Создайте директорию:

mkdir /etc/openvpn/ccd/

Создайте файл. Имя файла должно совпадать со значением commonName в сертификате клиента — в примере это Client1:

nano /etc/openvpn/ccd/Client1

Пропишите параметр iroute, чтобы указать серверу подсеть клиента:

iroute 192.168.88.0 255.255.255.0

В этом же файле можно задать и другие параметры для конкретного клиента. Например, закрепить за ним постоянный адрес в туннеле:

ifconfig-push 10.0.0.5 255.255.255.0

Содержимое файла ccd для клиента Client1

Сохраните файл: Ctrl + X, затем y, затем Enter.

Запустите OpenVPN.

Запуск OpenVPN на сервере

Настройка межсетевого экрана

OpenVPN использует порт 1194, поэтому его нужно открыть. Перейдите в раздел Сеть → Межсетевой экран → Правила для трафика.

Раздел «Правила для трафика» в настройках межсетевого экрана

Создайте новое правило со следующими параметрами.

Создание правила для трафика: первая часть параметров

Создание правила для трафика: вторая часть параметров

Создайте зону для интерфейса tun, в которой разрешён любой входящий трафик.

Создание зоны межсетевого экрана для интерфейса tun

Параметры зоны: разрешение входящего трафика

Теперь создайте интерфейс и добавьте его в созданную зону. Перейдите в Сеть → Интерфейсы → Добавить новый интерфейс.

Раздел «Интерфейсы» в веб-интерфейсе роутера

Создание нового интерфейса: выбор протокола и устройства

Выберите протокол Не управляемый и устройство tun0, затем нажмите Создать интерфейс. После этого снова откройте созданный интерфейс на редактирование и добавьте его в зону.

Редактирование интерфейса tun0

Добавление интерфейса tun0 в зону межсетевого экрана

Сохраните и примените изменения, после чего перезагрузите роутер.


Настройка клиента

Настройка OpenVPN

Откройте конфигурацию OpenVPN на редактирование.

Переход к редактированию конфигурации OpenVPN на клиенте

Задайте параметры:

  • remote — IP-адрес сервера, после ввода нажмите на плюс;
  • port — 1194;
  • dev_type — tun;
  • proto — UDP;
  • ca — импортируйте сертификат центра сертификации, тот же, что и на сервере;
  • cert — импортируйте сертификат клиента;
  • key — импортируйте закрытый ключ клиента;
  • verb — на время отладки укажите значение от 7 до 9.
Примечание: на клиенте в параметрах cert и key указываются именно клиентские сертификат и ключ, а не серверные. Общим для обеих сторон является только сертификат центра сертификации. Параметр dh на клиенте не нужен.

Основные параметры конфигурации OpenVPN на клиенте

Сохраните изменения и перейдите в расширенные настройки. На вкладке VPN добавьте параметр pull и активируйте его — это позволит клиенту получать маршруты и параметры от сервера.

Параметр pull на вкладке VPN у клиента

На вкладке Криптография добавьте параметры:

  • tls_auth — путь к ключу ta.key, предварительно загруженному в /etc/openvpn/, с цифрой 1 после пути: /etc/openvpn/ta.key 1. Цифра 1 означает, что сторона авторизуется как клиент;
  • remote_cert_tls — значение server.

Параметры tls_auth и remote_cert_tls на вкладке «Криптография» у клиента

Сохраните и примените изменения.

Настройка межсетевого экрана

Создайте зону для интерфейса tun, в которой разрешён любой входящий трафик.

Создание зоны межсетевого экрана для интерфейса tun на клиенте

Параметры зоны на клиенте: разрешение входящего трафика

Создайте интерфейс и добавьте его в зону. Перейдите в Сеть → Интерфейсы → Добавить новый интерфейс.

Раздел «Интерфейсы» на клиенте

Создание интерфейса tun0 на клиенте

Выберите протокол Не управляемый и устройство tun0, затем нажмите Создать интерфейс. После этого снова откройте интерфейс на редактирование и добавьте его в зону.

Редактирование интерфейса tun0 на клиенте

Добавление интерфейса tun0 в зону на клиенте

Запустите OpenVPN.

Запуск OpenVPN на клиенте

После установки соединения проверьте полученные адреса командой ip a или ifconfig. Адрес на сервере:

Туннельный адрес, полученный сервером

Адрес на клиенте:

Туннельный адрес, полученный клиентом


Проверка соединения

Проверьте связь командой ping. Должны проходить все шесть проверок: если проходят первые, но не проходят обращения к локальным адресам, значит не отработали маршруты route, push или iroute.

1. С клиента до туннельного адреса сервера

root@RTU1068_Client:~# ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1): 56 data bytes
64 bytes from 10.0.0.1: seq=0 ttl=64 time=159.470 ms
64 bytes from 10.0.0.1: seq=1 ttl=64 time=108.235 ms
64 bytes from 10.0.0.1: seq=2 ttl=64 time=96.507 ms
64 bytes from 10.0.0.1: seq=3 ttl=64 time=110.483 ms

--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 96.507/118.673/159.470 ms
root@RTU1068_Client:~#

2. С клиента до локального адреса сервера

root@RTU1068_Client:~# ping 192.168.89.1
PING 192.168.89.1 (192.168.89.1): 56 data bytes
64 bytes from 192.168.89.1: seq=0 ttl=64 time=76.713 ms
64 bytes from 192.168.89.1: seq=1 ttl=64 time=114.171 ms
64 bytes from 192.168.89.1: seq=2 ttl=64 time=115.399 ms
64 bytes from 192.168.89.1: seq=3 ttl=64 time=100.401 ms

--- 192.168.89.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 76.713/101.671/115.399 ms
root@RTU1068_Client:~#

3. С клиента до устройства в локальной сети сервера

root@RTU1068_Client:~# ping 192.168.89.5
PING 192.168.89.5 (192.168.89.5): 56 data bytes
64 bytes from 192.168.89.5: seq=0 ttl=254 time=122.186 ms
64 bytes from 192.168.89.5: seq=1 ttl=254 time=102.404 ms
64 bytes from 192.168.89.5: seq=2 ttl=254 time=119.894 ms
64 bytes from 192.168.89.5: seq=3 ttl=254 time=95.760 ms

--- 192.168.89.5 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 95.760/110.061/122.186 ms
root@RTU1068_Client:~#

4. С сервера до туннельного адреса клиента

root@RTU1068_Server:~# ping 10.0.0.5
PING 10.0.0.5 (10.0.0.5): 56 data bytes
64 bytes from 10.0.0.5: seq=0 ttl=64 time=165.402 ms
64 bytes from 10.0.0.5: seq=1 ttl=64 time=122.358 ms
64 bytes from 10.0.0.5: seq=2 ttl=64 time=114.323 ms
64 bytes from 10.0.0.5: seq=3 ttl=64 time=105.261 ms

--- 10.0.0.5 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 105.261/126.836/165.402 ms
root@RTU1068_Server:~#

5. С сервера до локального адреса клиента

root@RTU1068_Server:~# ping 192.168.88.1
PING 192.168.88.1 (192.168.88.1): 56 data bytes
64 bytes from 192.168.88.1: seq=0 ttl=64 time=113.996 ms
64 bytes from 192.168.88.1: seq=1 ttl=64 time=99.530 ms
64 bytes from 192.168.88.1: seq=2 ttl=64 time=119.455 ms
64 bytes from 192.168.88.1: seq=3 ttl=64 time=120.586 ms

--- 192.168.88.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 99.530/113.391/120.586 ms
root@RTU1068_Server:~#

6. С сервера до устройства в локальной сети клиента

root@RTU1068_Server:~# ping 192.168.88.25
PING 192.168.88.25 (192.168.88.25): 56 data bytes
64 bytes from 192.168.88.25: seq=0 ttl=254 time=133.484 ms
64 bytes from 192.168.88.25: seq=1 ttl=254 time=89.994 ms
64 bytes from 192.168.88.25: seq=2 ttl=254 time=140.514 ms
64 bytes from 192.168.88.25: seq=3 ttl=254 time=122.252 ms

--- 192.168.88.25 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 89.994/121.561/140.514 ms
root@RTU1068_Server:~#

Заключение

Туннель между двумя роутерами поднят, подсети 192.168.88.0/24 и 192.168.89.0/24 объединены: устройства в каждой из них доступны с противоположной стороны по локальным адресам. Клиенту при этом не нужен статический адрес — достаточно одного статического адреса на стороне сервера.

Чтобы подключить второй и последующие роутеры, выпустите для каждого отдельный сертификат клиента со своим значением commonName и создайте для него отдельный файл ccd с параметрами iroute и ifconfig-push. Конфигурацию сервера при этом менять не нужно.

После того как туннель заработал, верните параметру verb обычное значение — расширенное журналирование заметно увеличивает объём логов.