Бесплатные Oracle Cloud серверы и Mikrotik — Site-to-Site VPN
Предоставление бесплатных серверов от малопопулярного облачного провайдера - это не новость. А новость в том, что теперь Oracle, вдобавок к двум едва живым бесплатным x86_64 серверам, открывает доступ к мощностям на ARM64 - для всех, даром, и пусть никто не уйдет обиженным!© Предложение по ARM значительно более производительное, чем на традиционных процессорах. Добавляя к этому остальные бесплатные "плюшки", я задаюсь вопросом: а зачем я до сих пор плачу за VPS и держу собственный серверок в подвале?! Все это можно выкинуть если удастся надежно и безопасно связать дата центр с домашней сетью.
Создание ресурсов
Описывать создание ресурсов (виртуальных машин, сетей и правил) я не буду, все это достаточно подробно описано в статье "Получаем бесплатные сервера в Oracle Cloud Free Tier". Замечу только, что для получения именно ARM64 инстанса нужно сменить Shape при создании Compute Instance на Ampere и выбрать выделяемые ресурсы (для бесплатного использования обещают 1 instance с 4 OCPU и 24 GB RAM или 4 кратно меньших, т.е. 1 OCPU/6 GB).
А что дальше?
После создания кластера из 6 4 виртуальных машин (UPDATE: спасибо @ky0. суммарный бесплатный объем диска 200 ГБ, а минимальный объем загрузочного диска для VM - 47 ГБ, т.е. больше 4 машин на Free Tier создать не получится. Официальное подтверждение тут), нагрузив их самой минимальной полезной нагрузкой стало понятно, что хочется большего. Хочется переложить все домашние сервисы на датацентры oracle, а именно: мелкие базы данных всех мастей, полезные при разработке ПО, сервер автоматизации рутины n8n, локальный gitea для backup'ов github репозиториев, Pi-hole и прочие прелести доморощенного хостинга. Но все это очень не хочется выставлять в интернет, даже с паролями, даже с файерволами, совсем никак.
Мне поможет VPN! Были рассмотрены варианты:
VPN сервер на Mikrotik + VPN клиент в облаке. Этот вариант требует либо настройки VPN на каждом интансе, либо настройки маршрутизации внутри облачной сети через один "главный" инстанс, а уже на нем VPN. Такой вариант мне не понравился тем, что требует настройки каждый раз при пересоздании инстанса, а пересоздавать их иногда хочется.
VPN сервер на одном из инстансов + VPN клиент на Mikrotik. Вариант уже лучше, но все равно, появляется "священная корова" - инстанс с VPN сервером, который нельзя убивать, с ним нужно очень аккуратно экспериментировать, и при пересоздании устанавливать все по новой.
Site-to-Site VPN. Нужно всего-то настроить VPN со стороны Oracle Cloud, настроить VPN на Mikrotik, профит! Проблема была только в одном. В сети нет инструкции как это делать. Будем разбираться... (тут важно отметить, что для реализации этого варианта обязательно наличие белого IP на вашем Mikrotik).
Итак, имея за плечами скромный опыт настройки VPN, понимание компьютерных сетей на университетском уровне и отсутствие опыта работы с облачными провайдерами, я приступил к настройке.
Хочу предостеречь профессионального читателя, в тексте могут быть и будут ляпы, связанные с пониманием предметной области в криптографии и маршрутизации, статья не претендует на энциклопедическую точность, а лишь призвана обобщить и сохранить тот опыт, который автор собрал, наступая на грабли и исследуя различные источники при создании Site-to-Site VPN на Mikrotik.
Настройка Oracle
На панели управления ресурсами есть мастер настройки сети, который проведет пользователя через все нужные шаги в одном месте.
Выбираем VPN:
Если вы создали хотя бы один вычислительный инстанс в инфраструктуре Oracle, у вас должен был автоматически создаться служебный элемент "Virtual Cloud Network", выберите его, если он не выбран в мастере. Если это первая попытка создания VPN, в мастере нужно выбрать создание нового "Dynamic Routing Gateway" (DRG), имя заполнится автоматически. При повторных попытках создания VPN можно выбирать существующий DRG.
Подсети и безопасность. Security List позволяет настроить правила файервола. Можно, конечно, выбрать автоматически создавшийся при создании первого инстанса Default Security List, но я рекомендую все же создать новый, чтобы иметь возможность независимо настраивать внутреннюю безопасность и внешнюю.
Следующий шаг позволяет выбрать настройки маршрутизации. Если читателю знаком протокол динамической маршрутизации BGP, он может быть настроен здесь. В статье же я ограничусь более простым вариантом - это статическая маршрутизация. Если у вас дома стоит Mikrotik, вы наверняка знаете какие подсети используются у вас во внутренней сети. В моем случае это 192.168.6.0/24, именно для нее Oracle будет отправлять трафик через VPN на ваш Mikrotik.
Со стороны Oracle создается два туннеля - это просто дублирование для надежности.
При желании можно настроить мониторинг состояния туннелей, это позволит получать уведомления при разрыве соединения, но я не стал этого делать.
Дальше, ответственный момент - указание IP-адреса вашего маршрутизатора. Проверить его можно на ifconfig.io или в любом другом подобном сервисе, тот же самый IP-адрес должен быть на одном из интерфейсов вашего маршрутизатора.
Проверьте, что все указано правильно.
Дальше запускается облачная магия.
Спустя несколько секунд ваш туннель со стороны Oracle готов, можно просмотреть его настройки.
Нажатие кнопки View VPN покажет нам состояние и адреса двух туннелей со стороны Oracle, не закрывайте страницу, адреса нам еще пригодятся.
Еще нам понадобится Shared Secret для одного (или каждого) туннеля, посмотреть его можно провалившись внутрь по ссылке с названием туннеля, там есть кнопка для отображения ключа.
Настройка Mikrotik
Самая трудоемкая и неудобная часть пройдена, осталось настроить домашний маршрутизатор. Здесь во многом мне помогла статья "AWS Site-to-Site VPN with MikroTik (RouterOS)", спасибо автору. Дополнить ее пришлось параметрами из документации Oracle и экспериментами.
Дальше я приведу необходимые параметры и рабочую очередность их настройки, без объяснения что это и зачем оно нужно, пытливый читатель сможет найти описания и объяснения в документации Oracle или Mikrotik.
# Настройки ipsec proposal должны соответствовать настройкам Phase2
# PFC group 5 = modp1536
/ip ipsec proposal add auth-algorithms=sha256 \
enc-algorithms=aes-256-gcm lifetime=1h name=oracle-proposal-phase2 \
pfs-group=modp1536
# Настройки ipsec profile должны соответствовать настройкам Phase1
/ip ipsec profile add dh-group=ecp384 enc-algorithm=aes-256 \
hash-algorithm=sha384 lifetime=8h name=oracle-profile-phase1
# Здесь нужно вставить IP адрес
/ip ipsec peer add address=<Oracle VPN 1 IP> name=oracle1-peer \
profile=oracle-profile-phase1
# Здесь нужно использовать Shared Secret который мы получили на последнем шаге настройки Oracle
/ip ipsec identity add peer=oracle1-peer \
secret="<Oracle VPN1 Shared Secret>"
# В этот момент должна появиться запись в таблице Active Peers
/ip ipsec active-peers print
# # STATE UPTIME REMOTE-ADDRESS
# 0 established 2m22s <Oracle VPN 1 IP>
# Здесь нужно указать настройки из шага Subnets and Security
# для Oracle подсети и из шага Site-to-Site VPN - Static Routing
# для внутренней сети Mikrotik
/ip ipsec policy add dst-address=<Oracle VCN подсеть> peer=oracle1-peer \
proposal=oracle-proposal-phase2 \
src-address=<Локальная подсеть Mikrotik> tunnel=yes
# В этот момент обновиться состояние policy
/ip ipsec policy print
# Flags: T - TEMPLATE; A - ACTIVE; * - DEFAULT
# Columns: PEER, TUNNEL, SRC-ADDRESS, DST-ADDRESS, PROTOCOL, ACTION, LEVEL, PH2-COUNT
# # PEER TUNNEL SRC-ADDRESS DST-ADDRESS PROTOCOL ACTION LEVEL PH2-COUNT
# 0 T * ::/0 ::/0 all
# 1 A oracle1-peer yes <Локальная подсеть Mikrotik> <Oracle VCN подсеть> all encrypt require 2
# Если вы используете NAT на своем Mikrotik (а вы, наверняка, используете)
# нужно добавить правило обхода NAT для IPSec трафика
/ip firewall nat add action=accept chain=srcnat \
src-address=<Локальная подсеть Mikrotik> \
dst-address=<Oracle VCN подсеть> place-before=0
Внимание! Важно чтобы правило обхода NAT было в списке выше, чем правило NAT c Action "masquerade"!
/ip firewall nat print
# Flags: X - disabled, I - invalid; D - dynamic
# 0 chain=srcnat action=accept src-address=<Локальная подсеть Mikrotik> dst-address=<Oracle VCN подсеть> log=no log-prefix=""
# 1 chain=srcnat action=masquerade ...
# 2 chain=srcnat action=masquerade ...
# 3 X chain=srcnat action=masquerade ...
# 4 X chain=dstnat action=dst-nat ...
# 5 chain=dstnat action=dst-nat ...
# Если это не так используйте команду
/ip firewall nat move numbers=<Номер правила> destination=0
Если все сделано правильно, то между сетями должна появиться связь, пинги и данные начнут ходить в соответствии с настройками выбранного SecurityList из Oracle Cloud.
При желании можно создать второй туннель, но Mikrotik не позволяет создать 2-х Policy с одинаковыми Source Address и Destination Address. Вариантов использования второго туннеля несколько:
Задать для одного policy несколько peer, в таком случае первый будет основным, если он недоступен, используется следующий и так далее.
Разделить вашу подсеть на сегменты, и использовать для них разные peer. Например, имея подсеть 192.168.Х.0/24, поделим ее на 192.168.Х.0/25 и 192.168.Х.128/25, дальше можно создать для каждой из них отдельный policy, тогда трафик будет балансироваться в зависимости от сегмента, в котором находится источник трафика.
Если на вашем Mikrotik не одна сеть, а больше, то можно чередовать пиры для разных подсетей. Этот вариант также поможет балансировать трафик в зависимости от подсети из/в которую направлен трафик.
Прописать дополнительный peer к существующему policy, в этом случае туннель будет активироваться при проблемах с основным peer.
Разделить локальную или удаленную подсеть на 2 части (например 192.168.Х.0/24, можно поделить более мелкие сегменты 192.168.X.0/25 + 192.168.X.128/25) и использовать разные туннели для разных сегментов.
Для тех у кого на Mikrotik настроена более чем одна сеть настроить разные сети через разные туннели.
# Создать Peer используя созданный ранее профиль
/ip ipsec peer add address=<Oracle VPN 2 IP> name=oracle2-peer \
profile=oracle-profile-phase1
# Создать identity указав адрес второго туннеля со стороны Oracle
/ip ipsec identity add peer=oracle2-peer \
secret="<Oracle VPN2 Shared Secret>"
# Вариант 1: добавить peer к существующему policy
# для получения номера правила: /ip ipsec policy print
/ip ipsec policy edit number=<Номер правила> peer
# В редакторе дописываем второго peer, чтобы получилось
# oracle1-peer,oracle2-peer
# Нажимаем Ctrl+O
# Вариант 3: добавить policy для другой подсети
/ip ipsec policy add dst-address=<Oracle VCN подсеть> \
peer=oracle2-peer proposal=oracle-proposal-phase2 \
src-address=<Другая локальная подсеть Mikrotik> tunnel=yes
Собственно, на этом все. Состояние туннелей можно контролировать на портале Oracle Cloud.