Настройка двух и более OpenVPN-серверов на одном сервере

Продолжая рассказ о возможностях OpenVPN рассмотрим ситуацию, когда нам нужно иметь на одном сервере несколько разных серверов OpenVPN с различными настройками. Чаще всего такая необходимость возникает на серверах, предназначенных для удаленного доступа, когда имеются клиенты, требующие особых настроек. В корпоративной среде такая возможность позволит с помощью одного физического сервера обеспечить связь для различных подразделений, которые не должны напрямую взаимодействовать друг с другом. Как это сделать - читайте в нашей статье.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Начнем с постановки задачи. В прошлой статье мы рассказали о настройке OpenVPN сервера в Oracle Cloud для доступа в интернет. Сервер работает, клиенты подключаются, но возникла необходимость подключения к нему роутеров Mikrotik, у которых, как известно, особые требования к настройкам OpenVPN. Как быть? Перенастроить сервер для совместимости с Mikrotik в ущерб остальным клиентам? Или поднять второй экземпляр сервера со своими настройками? Естественно, второй способ выглядит более предпочтительно.

Напомним, что все настройки мы производим на сервере с Ubuntu 18.04 в облаке от Oracle, настройка которого описана в статье по ссылке выше, рекомендуем ознакомиться с ней перед прочтением данного руководства. Однако все описанные ниже действия, с соответствующими поправками, применимы к любому Linux-дистрибутиву.

Настройка второго экземпляра сервера

Прежде всего создадим для нового сервера собственный набор ключей, для этого перейдем в папку нашего центра сертификации и загрузим переменные:

1cd /etc/openvpn/easy-rsa
2source ./vars

После чего создадим новый серверный сертификат:

1./build-key-server server-tcp

Где server-tcp имя нашего экземпляра сервера. Мы советуем давать осмысленные имена, чтобы вам потом было понятно, что делает тот или иной экземпляр.

Скопируем ключ и сертификат в папку с ключами OpenVPN:

1cd /etc/openvpn/easy-rsa/keys
2cp server-tcp.crt server-tcp.key /etc/openvpn/keys

Затем скопируем шаблон конфигурации и назовем его server-tcp.conf:

1cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server-tcp.conf

После чего откроем файл и приступим к его редактированию. Какие важные особенности нам нужно учесть? RouterOS работает с OpenVPN только по протоколу TCP и не использует сжатие, также есть и некоторые иные особенности, которых мы коснемся позже. Все опции указаны в порядке их следования в файле, если опции нет - ее нужно добавить.

1port 1194
2proto tcp
3dev tun

Для того, чтобы несколько серверов OpenVPN могли работать на одном хосте они должны использовать разные порты. Но так как первый экземпляр работает по протоколу UDP, то для второго экземпляра мы также можем использовать порт 1194, но только с протоколом TCP.

Укажем топологию сети:

1topology subnet

И пути к ключам и сертификатам:

1ca keys/ca.crt
2cert keys/server-tcp.crt
3key keys/server-tcp.key
4dh keys/dh2048.pem

Диапазон адресов внутри VPN-сети также должен отличаться от остальных экземпляров, поэтому укажем:

1server 10.89.0.0 255.255.255.0

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

1ifconfig-pool-persist /var/log/openvpn/ipp-tcp.txt

Mikrotik игнорирует опцию настройки шлюза по умолчанию, но мы все-таки советуем добавить данную опцию, так как подключаться к данному серверу могут и иные клиенты.

1push "redirect-gateway def1 bypass-dhcp"

Передадим собственные DNS:

1push "dhcp-option DNS 208.67.222.222"
2push "dhcp-option DNS 208.67.220.220"

Параметры проверки активности:

1keepalive 10 120

Обязательно выключим дополнительную TLS-аутентификацию:

1#tls-auth ta.key 0

И укажем параметры шифра, выключив его согласование, RouterOS поддерживает только AES128/192/256 и Blowfish 128:

1ncp-disable
2cipher AES-128-CBC

Обязательно отключаем все опции сжатия:

1#compress lz4-v2
2#push "compress lz4-v2"
3#comp-lzo

Убеждаемся в наличии опций понижения прав:

1user nobody
2group nogroup

И за сохранение доступа к ключам и адаптерам:

1persist-key
2persist-tun

Укажем свой комплект файлов лога:

1status /var/log/openvpn/openvpn-status-tcp.log
2log /var/log/openvpn/openvpn-tcp.log

и его подробность:

1verb 3

При использовании протокола TCP обязательно закомментируем опцию:

1explicit-exit-notify 1

А также добавим:

1tcp-nodelay

Сохраним файл конфигурации.

Чтобы обеспечить автоматический запуск всех серверных конфигураций OpenVPN откроем в /etc/default/openvpn и раскомментируем в нем строку:

1AUTOSTART="all"

Затем перечитаем конфигурацию юнитов systemd:

1systemctl daemon-reload

Теперь уже можно запустить наш новый экземпляр, но мы пока не будем этого делать, так как нужно перенастроить брандмауэр.

Настройка брандмауэра и маршрутизации

Очевидно, что нам нужно разрешить входящий трафик на порт OpenVPN и транзитный трафик для tun-адаптеров, также потребуется отдельное правило для маскарадинга. В итоге ваш файл /etc/nat должен будет выглядеть следующим образом:

 1#!/bin/sh
 2
 3# Включаем форвардинг пакетов
 4echo 1 > /proc/sys/net/ipv4/ip_forward
 5
 6# Сбрасываем настройки брандмауэра
 7iptables -F
 8iptables -X
 9iptables -t nat -F
10iptables -t nat -X
11
12# Разрешаем инициированные нами подключения извне
13iptables -A INPUT -i ens3 -m state --state ESTABLISHED,RELATED -j ACCEPT
14
15# Разрешаем подключения по SSH
16iptables -A INPUT -i ens3 -p tcp --dport 22 -j ACCEPT
17
18# Разрешаем подключения к OpenVPN
19iptables -A INPUT -i ens3 -p udp --dport 1194 -j ACCEPT
20iptables -A INPUT -i ens3 -p tcp --dport 1194 -j ACCEPT
21
22#Запрещаем входящие извне
23iptables -A INPUT -i ens3 -j DROP
24
25# Разрешаем инициированные нами транзитные подключения извне
26iptables -A FORWARD -i ens3 -o tun+ -m state --state ESTABLISHED,RELATED -j ACCEPT
27
28# Запрещаем транзитный трафик извне
29iptables -A FORWARD -i ens3 -o tun+ -j DROP
30
31# Включаем маскарадинг для локальной сети
32iptables -t nat -A POSTROUTING -o ens3 -s 10.88.0.0/24 -j MASQUERADE
33iptables -t nat -A POSTROUTING -o ens3 -s 10.89.0.0/24 -j MASQUERADE

На что следует обратить внимание? Для каждого сервера нужно разрешающее правило в цепочке INPUT, в нашем случае в секции Разрешаем подключения к OpenVPN добавлено два правила для входящих UDP 1194 и TCP 1194. Аналогично следует создать для каждой VPN-сети свое правило маскарадинга в секции Включаем маскарадинг для локальной сети.

В правилах цепочки FORWARD мы заменили tun0 на tun+, что теперь распространяет действие правил на все туннельные интерфейсы.

Если вы используете Oracle Cloud, то не забудьте создать разрешающее правило для входящих TCP 1194 в настройках вашей виртуальной сети:

Теперь можно перезапустить службу OpenVPN и убедиться, что поднялись два туннельных интерфейса:

1systemctl restart openvpn

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

Если вы будете настраивать в качестве клиента Mikrotik, то вам потребуется только ключевая пара клиента и, опционально, сертификат CA, для проверки подлинности сервера. Для создания ключа клиента перейдите в директорию центра сертификации и загрузите переменные:

1cd /etc/openvpn/easy-rsa
2source ./vars

Затем выпустите сертификат клиента:

1./build-key mikrotik

Полученные файлы и сертификат CA скопируем в домашнюю директорию:

1cd /etc/openvpn/easy-rsa/keys
2cp ca.crt mikrotik.crt mikrotik.key ~

И сменим их владельца на вашего основного пользователя, чтобы он мог спокойно скопировать их через FTP или SFTP (по умолчанию владелец файлов root). В нашем случае это пользователь ubuntu.

1cd ~
2chown ubuntu:ubuntu ca.crt mikrotik.crt mikrotik.key

Если же будет подключаться иной клиент, то ему потребуется клиентский файл конфигурации, можете использовать как образец конфигурацию клиента созданную нами в предыдущей статье. В него потребуется внести следующие изменения: изменить протокол на TCP

1proto tcp

и выключить сжатие:

1#comp-lzo

Теперь что касается производительности. OpenVPN через TCP имеет гораздо более высокие накладные расходы, особенно на плохих каналах. На хороших разница обычно невелика, и вы скорее упретесь в иные ограничения. Мы выполнили два замера для нашего сервера в Oracle Cloud, первый для UDP:

Второй для TCP:

Как видим, в нашем случае разница абсолютно незаметна и можно не особенно переживать за возможные потери пропускной способности. Но не следует забывать, что при тестировании использовались хорошие широкополосные каналы, в иных ситуациях, например, с мобильными клиентами, результаты могут существенно отличаться.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал