Приветствую читатели, в этой статье хотел бы поделиться опытом настройки внутренней сети яндекс облака и маршрутизацией в интернет через RouterOS MikroTik.
Есть VPC
которая администрируется внутренними сервисами и раздает внешние ip
внутренним ВМ через шлюз подсети за NAT
’ом, что не очень удобно для централизованного администрирования.
Схема внутренней сети и получения внешнего ip
в яндекс облаке выглядит следующим образом:
Привязать для всей подсети один внешний постоянный ip
можно через NAT-instance
или любую ВМ настроив forward
, но пробрасывать порты в сеть придётся через изменения конфигурации в самой ВМ и так для каждой подсети. Нужна была реализация управления сетями/подсетями и доступом в одном месте (на момент написания статьи группа безопасности VPC
находилась в стадии Preview).
Проблема данного облака в том, что добавляя сетевые интевфейсы к ВМ и привязывая внешние IP
выход в интернет будет только с первого интерфейса первой подсети VPC1
Если коротко, то хотел реализовать такую схему:
Перейду сразу к описанию процесса настройки.
Для примера берем настройки в облаке такие:
Internal1-a – 10.1.0.0/24
Internal2-a – 10.1.1.0/24
Internal1-b – 10.1.2.0/24
Internal2-b – 10.1.3.0/24
Internal1-c – 10.1.4.0/24
Internal2-c – 10.1.5.0/24
Это минимум который нам нужен, т. к. в облаке привязанный внешний ip
роутится через шлюз
По умолчанию в облаке для любой подсети
Gateway – X.X.X.1
Internal DNS – X.X.X.2
Создаем ВМ с образом RouterOS
.
В облаке выбираем Cloud Marketplace -> Сетевая инфраструктура -> Cloud Hosted Router
и сразу добавляем внешние ip
адреса к каждому сетевому интерфейсу
RouterOS
Ether1 – 10.1.0.254
Ether2 – 10.1.1.254
Создаем ВМ и подключаемся к ether1
через консоль или клиентом winbox
. Создаем пользователя с полными правами, отключаем пользователя admin
и добавляем rsa public key
.
Далее настраиваем все через CLI
. Все действия можно сделать и в winbox
, меню соответствует команде, заходим в меню ip
выбираем route
и т.д.
Если посмотрим в таблицу маршрутизации, то увидим маршруты
/ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip,
b - bgp, o - ospf, m - mme, B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 ADS 0.0.0.0/0 10.1.0.1 1
1 ADC 10.1.1.0/24 10.1.1.254 ether2 0
2 ADC 10.1.0.0/24 10.1.0.254 ether1 0
По умолчанию маршрут в интернет идет с порта ether1
через шлюз 10.1.0.1
который за NAT
выкидывает во внешнюю сеть. Если сейчас опросить все внешние ip
адреса, то ответит только первый.
Поскольку у нас 2 внешних адреса находятся за шлюзом внутренних сетей, к которым подключены 2 порта, то нужно прописать дополнительные маршруты указав разные значения distance
и добавить маршруты к дополнительным подсетям.
Добавляем маршруты
/ip route
add dst-address=0.0.0.0/0 gateway=10.1.1.1 distance=2
add dst-address=10.1.2.0/24 gateway=10.1.0.1 distance=1
add dst-address=10.1.3.0/24 gateway=10.1.1.1 distance=1
add dst-address=10.1.5.0/24 gateway=10.1.1.1 distance=1
add dst-address=10.1.4.0/24 gateway=10.1.0.1 distance=1
По умолчанию зоны доступности подсетей b
и c
должны быть доступны через шлюз подсети зоны доступности a
.
Настраиваем firewall
.
Входящие соединения внутренних сетей
/ip firewall filter
add chain=input action=accept src-address=10.1.5.0/24
add chain=input action=accept src-address=10.1.1.0/24
add chain=input action=accept src-address=10.1.3.0/24
add chain=input action=accept src-address=10.1.2.0/24
add chain=input action=accept src-address=10.1.0.0/24
add chain=input action=accept src-address=10.1.4.0/24
Разрешаем ping
/ip firewall filter
add chain=input action=accept protocol=icmp
Разрешаем проброс вперед
/ip firewall filter
add chain=forward action=accept src-address=10.1.5.0/24 dst-address=0.0.0.0/0
add chain=forward action=accept src-address=10.1.1.0/24 dst-address=0.0.0.0/0
add chain=forward action=accept src-address=10.1.3.0/24 dst-address=0.0.0.0/0
add chain=forward action=accept src-address=10.1.2.0/24 dst-address=0.0.0.0/0
add chain=forward action=accept src-address=10.1.0.0/24 dst-address=0.0.0.0/0
add chain=forward action=accept src-address=10.1.4.0/24 dst-address=0.0.0.0/0
Остальные входящие соединения сбрасываем
/ip firewall filter add chain=input action=drop log=no
Меняем очередность правил
/ip firewall filter move numbers="[old rule no]" destination="[new rule no]"
Любуемся результатом
/ip firewall filter print
Реализация выхода в интернет в данном случае через шлюз внутренней сети и у нас нет портов с прямым внешним ip
адресом, поэтому реализуем разделение через MultiWAN
. Очень хорошо этот метод описан в презентации РЕАЛИЗАЦИЯ MULTIWAN
(ссылка на презентацию в конце статьи)
В конфигурации ВМ отсутствуют WAN
порты, которые нужно добавить в конфигурацию route rules
, поэтому создадим 2 записи в interface list
/interface list
add name="WAN1"
add name="WAN2"
/interface list member
add list=WAN1 interface=ether1 dynamic=no
add list=WAN2 interface=ether2 dynamic=no
Добавляем маршруты
/ip route
add dst-address=0.0.0.0/0 gateway=10.1.0.1 distance=1 routing-mark=WAN1
add dst-address=0.0.0.0/0 gateway=10.1.1.1 distance=1 routing-mark=WAN2
Добавляем правила маршрутизации, все что не попадает под правило идет через порт ether1
, добавлять можно как подсети, так и отдельные хосты
Перед принудительным разделением маршрутов необходимо указать маршрут по умолчанию для внутренних подсетей
/ip route rule
add src-address=10.1.0.0/16 dst-address=10.1.0.0/16 action=lookup-only-in-table table=main
add src-address=10.1.3.0/24 action=lookup-only-in-table table=WAN2
add src-address=10.1.5.0/24 action=lookup-only-in-table table=WAN2
На данном этапе все 2 внешних ip
отзываются, но внутренние сети не работают правильно или вообще не работают.
Настроим маршрутизацию для каждого из двух контуров в консоли яндекс облака:
Virtual Private Cloud
-> Облачные сети
-> в каждой Подсети
выключаем NAT в интернет
-> Таблицы маршрутизации
-> Создать
, если создано изменить -> добавляем маршрут Префикс назначения: 0.0.0.0/0, Next hop: 10.1.0.1/10.1.1.1
для каждого контура свой шлюз -> сохраняем.
На момент написания статьи у яндекса была проблема на стороне балансировщиков облака и различные сервисы (такие как api kubernetes
) не видели соседнюю сеть и подсеть офиса соединенную через ipsec
, поэтому пришлось добавить еще 2 маршрута
Префикс назначения: 10.1.0.0/16, Next hop: 10.1.0.1/10.1.1.1
Префикс назначения: <подсеть_офиса>, Next hop: 10.1.0.1/10.1.1.1
Осталось последнее действие, нужно замаскировать все подсети под внутренний адрес роутера и для того чтобы все хосты олицетворяли сами себя, а не прятались за IP
адресами роутера, первым правилом записываем srcnat
на наши подсети. Все masquerade
правила в самый конец списка
/ip firewall nat
add chain=srcnat action=accept src-address=10.1.0.0/16 dst-address=10.1.0.0/16
add chain=srcnat action=masquerade src-address=10.1.0.0/24 dst-address=0.0.0.0/0
add chain=srcnat action=masquerade src-address=10.1.1.0/24 dst-address=0.0.0.0/0
add chain=srcnat action=masquerade src-address=10.1.2.0/24 dst-address=0.0.0.0/0
add chain=srcnat action=masquerade src-address=10.1.3.0/24 dst-address=0.0.0.0/0
add chain=srcnat action=masquerade src-address=10.1.4.0/24 dst-address=0.0.0.0/0
add chain=srcnat action=masquerade src-address=10.1.5.0/24 dst-address=0.0.0.0/0
Теперь каждая ВМ в своей подсети выходит в интернет строго со своим внешним ip
прописанным в таблице маршрутизации. Между собой подсети общаются по дефолтному маршруту.
В итоге реализовали следующую схему:
Можно запускать клиентов/партнеров/внешние сервисы к внутренним ВМ через два внешних ip
адреса:
/ip firewall nat
add chain=dstnat action=netmap to-addresses=10.1.5.20 to-ports=10050 protocol=tcp src-address=7.7.7.1 in-interface-list=WAN2 port=10055
add chain=dstnat action=netmap to-addresses=10.1.0.5 to-ports=3306 protocol=tcp src-address=7.7.7.2 in-interface-list=WAN1 port=11050
где 7.7.7.1/7.7.7.2 внешние ip
клиентов.
Далее настраиваем по своему усмотрению, создаем ipsec
, режим сети в фаерволе, настраиваем входящие соединения.
Вне статьи: краткое описание правил ipsec
Допустим, все ipsec
соединения будем пускать только через второй внешний ip
Добавляем настройки алгоритмов шифрования, точки входа и psk
, т. к. внешний ip
спрятан за NAT
, а настраиваем peer
через внутренний адрес mikrotik
, то нужно добавить в identity
внешний IP
нашего интерфейса
/ip ipsec profile
add name="office" hash-algorithm=sha512 enc-algorithm=des dh-group=modp1536 lifetime=8h proposal-check=obey nat-traversal=no dpd-interval=2m dpd-maximum-failures=5
/ip ipsec peer
add name="peer_office" address=9.9.9.1/32 local-address=10.1.1.0 profile=office exchange-mode=aggressive send-initial-contact=yes
/ip ipsec identity
add peer=peer_office auth-method=pre-shared-key notrack-chain="prerouting" secret="123123123" generate-policy=no policy-template-group=office my-id=address:<cloud_ext_ip_address>
/ip ipsec proposal
add name="office" auth-algorithms=sha256 enc-algorithms=des lifetime=1h pfs-group=modp1536
Создаем политику подключения
/ip ipsec policy
add peer=peer_office tunnel=yes src-address=10.1.0.0/16 src-port=any dst-address=10.7.0.0/16 dst-port=any protocol=all action=encrypt level=require ipsec-protocols=esp sa-src-address=10.1.1.254 sa-dst-address=9.9.9.1 proposal=office
Один момент, подсетей с соединяемой стороной может быть много и чтобы все добавить в наш peer
нужно level
указать unique
, например у клиента подсети 12.1.0.0/24 и 12.10.0.0/24
/ip ipsec policy
add peer=peer_office tunnel=yes src-address=10.1.0.0/16 src-port=any dst-address=12.1.0.0/24 dst-port=any protocol=all action=encrypt level=unique ipsec-protocols=esp sa-src-address=10.1.1.254 sa-dst-address=9.9.9.1 proposal=office
add peer=peer_office tunnel=yes src-address=10.1.0.0/16 src-port=any dst-address=12.10.0.0/24 dst-port=any protocol=all action=encrypt level=unique ipsec-protocols=esp sa-src-address=10.1.1.254 sa-dst-address=9.9.9.1 proposal=office
Создаем правила firewall
— fillter rules
, NAT
, raw
, при этом NAT
правила делаем первыми в списке
/ip firewall filter
add chain=input action=accept src-address=10.7.0.0/16
add chain=input action=accept protocol=ipsec-esp src-address=9.9.9.1
add chain=input action=accept protocol=udp src-address=9.9.9.1 port=500
add chain=forward action=accept src-address=10.7.0.0/16 dst-address=10.1.0.0/16
add chain=forward action=accept src-address=10.1.0.0/16 dst-address=10.7.0.0/16
/ip firewall nat
add chain=srcnat action=accept src-address=10.1.0.0/16 dst-address=10.7.0.0/16
add chain=srcnat action=accept src-address=10.7.0.0/16 dst-address=10.1.0.0/16
/ip firewall raw
add chain=prerouting action=accept src-address=10.1.0.0/16 dst-address=10.7.0.0/16
add chain=prerouting action=accept src-address=10.7.0.0/16 dst-address=10.1.0.0/16
где 10.7.0.0/16
— подсеть офиса, 9.9.9.1
— внешний ip
офиса
Минимум по настройки разделения подсетей и направление трафика через конкретный внешний адрес выполнен.
Лицензию для MikroTik RouterOS
необходимо приобрести, иначе скорость портов будет 1 Гбит/с и ограничения по функционалу
https://wiki.mikrotik.com/wiki/Manual:License
Спасибо за внимание!
Используемые источники:
UPD
По комментариям и замечаниям дополнил статью, добавил описание ipsec
mrzar
Рабочая схема. Я по такой схеме организовываю логику с разными облачными провайдерами, когда нужно быстро развернуть инфраструктуру для небольшого бизнеса с возможностью переезда офиса в любое время и в любое место и которым нужно всего пару серверов. Только, помнится, без лицензии Клод хостед имеет ограничение в 1Mbps на интерфейс, а не 100. Также, иногда, некоторые провайдеры блочат трафик в туннелях, если не шифровать, и иногда приходится просить открыть gre. Не знаю, почему хостеры жёсткие такие бывают. :)
Double_W Автор
Спасибо, поправил ограничение на интерфейсе.