Приветствую читатели, в этой статье хотел бы поделиться опытом настройки внутренней сети яндекс облака и маршрутизацией в интернет через RouterOS MikroTik.
Есть VPC
которая администрируется внутренними
сервисами и раздает внешние ip
внутренним ВМ через
шлюз подсети за NAT
ом, что не очень удобно для
централизованного администрирования.
Схема внутренней сети и получения внешнего ip
в
яндекс облаке выглядит следующим образом:
Привязать для всей подсети один внешний постоянный
ip
можно через NAT-instance
или любую ВМ
настроив forward
, но пробрасывать порты в сеть
придётся через изменения конфигурации в самой ВМ и так для каждой
подсети. Нужна была реализация управления сетями/подсетями и
доступом в одном месте (на момент написания статьи группа
безопасности VPC
находилась в стадии Preview).
Если коротко, то хотел реализовать такую схему:
Перейду сразу к описанию процесса настройки.
Для примера берем настройки в облаке такие:
Internal1-a 10.1.0.0/24Internal2-a 10.1.1.0/24Internal1-b 10.1.2.0/24Internal2-b 10.1.3.0/24Internal1-c 10.1.4.0/24Internal2-c 10.1.5.0/24
Это минимум который нам нужен, т. к. в облаке привязанный
внешний ip
роутится через шлюз
По умолчанию в облаке для любой подсети
Gateway X.X.X.1Internal DNS X.X.X.2
Создаем ВМ с образом RouterOS
.
В облаке выбираем Cloud Marketplace -> Сетевая
инфраструктура -> Cloud Hosted Router
и сразу добавляем
внешние ip
адреса к каждому сетевому интерфейсу
RouterOSEther1 10.1.0.254Ether2 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 routeadd 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 filteradd 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 filteradd chain=input action=accept protocol=icmp
Разрешаем проброс вперед
/ip firewall filteradd 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
порты, которые
нужно добавить в конфигурацию firewall mangle
, поэтому
создадим 2 записи в interface list
/interface listadd name="WAN1"add name="WAN2"
Настраиваем firewall mangle
/ip firewall mangleadd chain=input action=mark-connection \new-connection-mark=con-WAN1 passthrough=yes in-interface-list=WAN1add chain=input action=mark-connection \new-connection-mark=con-WAN2 passthrough=yes in-interface-list=WAN2add chain=output action=mark-routing \new-routing-mark=WAN1 passthrough=yes connection-mark=con-WAN1 add chain=output action=mark-routing \new-routing-mark=WAN2 passthrough=yes connection-mark=con-WAN2
Добавляем маршруты
/ip routeadd 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 ruleadd 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
для каждого контура свой шлюз ->
сохраняем.
Осталось последнее действие, нужно замаскировать все подсети под внутренний адрес роутера
/ip firewall natadd 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 natadd 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
, режим сети в фаерволе, настраиваем входящие
соединения.
Минимум по настройки разделения подсетей и направление трафика через конкретный внешний адрес выполнен.
Лицензию для MikroTik RouterOS
необходимо
приобрести, иначе скорость портов будет 100 Мбит/с и ограничения по
функционалу
https://wiki.mikrotik.com/wiki/Manual:License
Спасибо за внимание!
Используемые источники: