Оглавление
- Введение
- Подготовка сертификатов и ключей
- Настройка сервера
- Настройка клиента
- Проверка соединения
- Заключение
Введение
OpenVPN позволяет объединить локальные сети двух удалённых объектов в одну сеть через интернет. В статье рассматривается настройка туннеля между двумя роутерами TELEOFIS RTU1068 с операционной системой OpenWrt: один работает в режиме сервера, второй — в режиме клиента.
Задача — объединить подсети 192.168.89.0/24 (сервер) и 192.168.88.0/24 (клиент) так, чтобы устройства в них видели друг друга.
remote. Клиент может работать и с динамическим адресом.
Схема стенда: слева клиент с динамическим адресом, справа сервер со статическим.
Подготовка сертификатов и ключей
Сервер и клиент проверяют друг друга по сертификатам, подписанным общим центром сертификации. Процесс выпуска сертификатов описан в отдельной статье: Создание сертификатов OpenVPN с помощью XCA.
Дополнительно понадобятся два файла, которых нет в той инструкции:
- Параметры Диффи — Хеллмана — генерируются в XCA;
- Ключ
ta.key— для дополнительной TLS-аутентификации, генерируется на роутере.
Генерация параметров Диффи — Хеллмана
В XCA откройте меню Дополнительно → Сгенерировать параметры Диффи — Хеллмана и укажите длину 2048.
Генерация ключа 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 и откройте её на редактирование.
Задайте основные параметры:
- 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: журналирование станет расширенным, и при проблемах с подключением можно будет разобраться по журналу.
Перейдите в расширенные настройки.
На вкладке VPN добавьте параметр route с маршрутом в подсеть клиента — 192.168.88.0 255.255.255.0 10.0.0.5. Там же добавьте параметр topology со значением subnet. Сохраните изменения.
На той же вкладке добавьте ещё два параметра:
- client_config_dir — директория файлов ccd:
/etc/openvpn/ccd/; - push — маршрут в подсеть сервера:
route 192.168.89.0 255.255.255.0 10.0.0.1.
Сохраните изменения и перейдите на вкладку Криптография. С помощью WinSCP перенесите ta.key в директорию /etc/openvpn/, затем добавьте параметр tls_auth со значением /etc/openvpn/ta.key 0. Цифра 0 после пути означает, что сторона авторизуется как сервер.
Примените изменения.
Файл 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
Сохраните файл: Ctrl + X, затем y, затем Enter.
Запустите OpenVPN.
Настройка межсетевого экрана
OpenVPN использует порт 1194, поэтому его нужно открыть. Перейдите в раздел Сеть → Межсетевой экран → Правила для трафика.
Создайте новое правило со следующими параметрами.
Создайте зону для интерфейса tun, в которой разрешён любой входящий трафик.
Теперь создайте интерфейс и добавьте его в созданную зону. Перейдите в Сеть → Интерфейсы → Добавить новый интерфейс.
Выберите протокол Не управляемый и устройство tun0, затем нажмите Создать интерфейс. После этого снова откройте созданный интерфейс на редактирование и добавьте его в зону.
Сохраните и примените изменения, после чего перезагрузите роутер.
Настройка клиента
Настройка OpenVPN
Откройте конфигурацию OpenVPN на редактирование.
Задайте параметры:
- remote — IP-адрес сервера, после ввода нажмите на плюс;
- port —
1194; - dev_type —
tun; - proto —
UDP; - ca — импортируйте сертификат центра сертификации, тот же, что и на сервере;
- cert — импортируйте сертификат клиента;
- key — импортируйте закрытый ключ клиента;
- verb — на время отладки укажите значение от
7до9.
cert и key указываются именно клиентские сертификат и ключ, а не серверные. Общим для обеих сторон является только сертификат центра сертификации. Параметр dh на клиенте не нужен.
Сохраните изменения и перейдите в расширенные настройки. На вкладке VPN добавьте параметр pull и активируйте его — это позволит клиенту получать маршруты и параметры от сервера.
На вкладке Криптография добавьте параметры:
- tls_auth — путь к ключу
ta.key, предварительно загруженному в/etc/openvpn/, с цифрой1после пути:/etc/openvpn/ta.key 1. Цифра1означает, что сторона авторизуется как клиент; - remote_cert_tls — значение
server.
Сохраните и примените изменения.
Настройка межсетевого экрана
Создайте зону для интерфейса tun, в которой разрешён любой входящий трафик.
Создайте интерфейс и добавьте его в зону. Перейдите в Сеть → Интерфейсы → Добавить новый интерфейс.
Выберите протокол Не управляемый и устройство tun0, затем нажмите Создать интерфейс. После этого снова откройте интерфейс на редактирование и добавьте его в зону.
Запустите 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 обычное значение — расширенное журналирование заметно увеличивает объём логов.