[Из песочницы] Опыт использования Mikrotik CHR для организации виртуальной маршрутиризации
В статье приведу результат решения задачи по организации маршрутизации между виртуальными машинами на VMware с использованием MikroTik CHR, причем с организацией доступа по VPN до виртуальных машин из внешней сети.
Введение
Определим исходную задачу:
- В наличии сервер с объемом памяти 96 Гб, 24 CPU и 22 TB дискового пространств
- К серверу подключены 2 линии:
- одна служит для менеджмента и управления VMware;
- со второй приходят два VLAN — один для доступа во внутреннюю сеть организации и с выходом в интернет, со второго приходят реальные адреса.
-
Для того, чтобы больше не использовать адресное пространство организации необходимо внутри сервера для ресурса из 3 виртуальных машин определить собственное адресное пространство и закрыть ресурс для доступа других ресурсов из 3 машин.
-
Необходимо блокировать трафик с виртуальных машин, который идет не на прокси организации.
-
Каждый ресурс из трех виртуальных машин предназначен для одного человека, ему также необходимо предоставить доступ для работы из дома.
- На сервере стоит VMware ESXi 6, для маршрутизации будет использоваться MikroTik CHR 6.42
Настройка VMware
Как уже определили на сервер приходят два VLAN, один будет служить для доступа виртуальных машин в сеть организации и доступа в интернет через прокси организации, второй необходим для наличия реального адреса и доступа к виртуальным машинам из вне.
Средствами VMware на виртуальном свитче создадим отдельные интерфейсы:
Каждый созданный интерфейс привязан к виртуальной машине с MikroTik CHR и к 3 виртуальным машинам из пула. К примеру для машин с идентификатором Student#8 назначен виртуальный интерфейс VM Vlan 25.
В итоге получаем следующую настройку для виртуальной машины с MikroTik CHR:
Как видим интерфейс Class8–509 для доступа во внутреннюю сеть и Real_Outside для реального адреса.
Настройка MikroTik CHR
Первоначально определим понятные названия интерфейсов и дадим комментарии для понимания какой интерфейс какому пулу виртуальных машин предназначен.
/interface ethernet
set [ find default-name=ether1 ] comment="VLAN ID 111 Uplink to Company" name=\
Class8_509_VM
set [ find default-name=ether4 ] comment="Interface VM Vlan 12 for Student #1" \
name=Int_VM_Vlan12
set [ find default-name=ether6 ] comment="Interface VM Vlan 14 for Student #3" \
name=Int_VM_Vlan14
set [ find default-name=ether7 ] comment="Interface VM Vlan 15 for Student #4" \
name=Int_VM_Vlan15
set [ find default-name=ether8 ] comment="Interface VM Vlan 16 for Student #5" \
name=Int_VM_Vlan16
set [ find default-name=ether2 ] comment="Interface Vlan 1111 Real_Outside" \
name=Real_Outside
Каждому интерфейсу присвоим IP адрес, в том числе интерфейсу, который будет иметь реальный адрес.
/ip address
add address=*.*.*.*/27 interface=Class8_509_VM network=*.*.*.*
add address=10.0.11.1/29 interface=Int_VM_Vlan11 network=10.0.11.0
add address=10.0.12.1/29 interface=Int_VM_Vlan12 network=10.0.12.0
add address=10.0.13.1/29 interface=Int_VM_Vlan13 network=10.0.13.0
add address=*.*.*.*/27 interface=Real_Outside network=*.*.*.*
Определим набор сетей. В каждом пуле машин на одной виртуальной машине установлен Windows Server 2012 на котором настроен AD и DNS, поэтому для каждой сети IP адрес этой виртуальной машины будет выступать в качестве DNS.
/ip dhcp-server network
add address=10.0.11.0/29 dns-server=10.0.11.4 gateway=10.0.11.1
add address=10.0.12.0/29 dns-server=10.0.12.5 gateway=10.0.12.1
add address=10.0.13.0/29 dns-server=10.0.13.5 gateway=10.0.13.1
Для каждого интерфейса определим пул адресов, который будет выдавать DHCP сервер и активируем Add ARP For Leases. Тем самым препятствуя ручному назначению IP адреса для виртуальной машины.
Add ARP For Leases — Создаёт в таблице ARP записей сопоставление MAC — IP для клиентов получивших аренду у DHCP и позволяет совместно с IP/ARP организовывать MAC фильтрацию на микротик.
Так как необходимо обеспечить доступ к виртуальным машинам из сети Интернет, то сразу подготовим пул адресов для клиентов, когда они будут подключаться через L2TP/IPsec.
/ip pool
add name=dhcp_pool_for_vm_vlan11 ranges=10.0.11.2-10.0.11.6
add name=dhcp_pool_for_vm_vlan12 ranges=10.0.12.2-10.0.12.6
add name=dhcp_pool_for_vm_vlan13 ranges=10.0.13.2-10.0.13.6
#Пул адресов для l2tp
add name=student1_l2tp_pool ranges=10.1.12.2-10.1.12.4
add name=student2_l2tp_pool ranges=10.1.13.2-10.1.13.4
add name=student3_l2tp_pool ranges=10.1.14.2-10.1.14.4
/ip dhcp-server
add add-arp=yes address-pool=dhcp_pool_for_vm_vlan11 disabled=no interface=\
Int_VM_Vlan11 lease-time=1h name=dhcp_for_vm_vlan11
add add-arp=yes address-pool=dhcp_pool_for_vm_vlan12 disabled=no interface=\
Int_VM_Vlan12 lease-time=1h name=dhcp_for_vm_vlan12
add add-arp=yes address-pool=dhcp_pool_for_vm_vlan13 disabled=no interface=\
Int_VM_Vlan13 lease-time=1h name=dhcp_for_vm_vlan13
В новых версиях RouterOS появилась возможность создавать списки, поэтому все локальные интерфейсы объединим в один список для облегчения настроек firewall.
/interface list member
add interface=Int_VM_Vlan11 list=local_vm
add interface=Int_VM_Vlan12 list=local_vm
add interface=Int_VM_Vlan13 list=local_vm
Определим список IP адресов прокси и в правилах firewall укажем, что трафик со всех локальных интерфейсов, если он не идет на адреса прокси, будет блокироваться. Сразу укажем правило для запрета ICMP и заблокируем трафик между локальными интерфейсами.
/ip firewall address-list
add address=192.168.3.3 list=Proxy
add address=192.168.3.1 list=Proxy
add address=192.168.3.5 list=Proxy
add address=192.168.3.7 list=Proxy
/ip firewall filter
add action=drop chain=forward comment="Block If Not Proxy Address" \
dst-address-list=!Proxy in-interface-list=local_vm
add action=drop chain=input comment="Block ping" \
in-interface-list=local_vm protocol=icmp
add action=drop chain=forward comment="Block ping between interface" \
in-interface-list=local_vm out-interface-list=local_vm
Также определим NAT, в котором весь трафик с локальных адресов будет выходить через интерфейс, который смотрит в сеть организации.
Настройка MikroTik CHR: L2TP/IPsec
Для организации доступа из внешней сети активируем L2TP сервер и создадим для каждого пользователя свои учетные данные и собственный интерфейс. Каждый пользователь сможет создавать только одно соединение одновременно. Так как, часть пользователей использует Windows 10, то в настройках безопасности дополнительно активируем 3DES алгоритм шифрования.
В настройках firewall укажем, что каждый пользователь может обращаться только в свою сеть (на конкретный локальный интерфейс) по определенным портам (RPD и SSH) и заблокируем любой другой трафик. Дополнительно разрешим доступ для l2tp с интерфейса, который имеет реальный адрес.
Для облегчения нагрузки на сеть организации для каждого пользователя сделаем ограничение в скорости.
В итоге получаем следующие настройки, приведу часть настроек для одного пользователя.
/interface l2tp-server
add comment="Interface L2TP for Student#1" name=int_l2tp_student1 user=student1
/ppp profile
add change-tcp-mss=yes comment="Student1 Profile for L2TP, Rate Limits 3M/3M" \
local-address=10.1.12.1 name=student1_l2tp_profile only-one=yes rate-limit=\
3M/3M remote-address=student1_l2tp_pool use-compression=yes use-encryption=\
required use-upnp=no
/ip firewall filter
add action=accept chain=input in-interface=Real_Outside port=1701,500,5000 \
protocol=udp
add action=accept chain=input in-interface=Real_Outside protocol=ipsec-esp
#Доступ с l2tp только на определенный локальный интерфейс
add action=accept chain=forward comment="Student #1 L2TP to Vlan 12" \
in-interface=int_l2tp_student1 out-interface=Int_VM_Vlan12 port=3389,22 \
protocol=tcp
add action=accept chain=forward in-interface=Int_VM_Vlan12 out-interface=\
int_l2tp_student1
add action=drop chain=forward in-interface=int_l2tp_student1
/ppp secret
add comment="Student1 Auth Data" name=student1 password=******** profile=
student1_l2tp_profile service=l2tp
Помимо настройки соединения на домашней машине клиента, дополнительно клиент прописывает маршрут до разрешенной ему сети, однако, благодаря правилам firewall, если клиент указал маршрут не до своей сети, то до виртуальных машин указанной сети он доступ получить не сможет.
Маркировка трафика
Так как у нас образуется два интернет соединения нам необходимо входящий трафик правильно отправить обратно через нужный интерфейс. Поэтому используем возможности Mikrotik в маркировке трафика.
/ip firewall mangle
add action=mark-connection chain=input comment="Mangle Real_Outside traffic" \
in-interface=Real_Outside new-connection-mark=realOutMark passthrough=yes
add action=mark-connection chain=input comment="Mangle Class8_509_VM Traffic" \
in-interface=Class8_509_VM new-connection-mark=classVmMark passthrough=yes
add action=mark-routing chain=output comment="Rout out Real_Outside" \
connection-mark=realOutMark new-routing-mark=routReakOut passthrough=no
add action=mark-routing chain=output comment="Rout out Class8-509 VM" \
connection-mark=classVmMark new-routing-mark=routClass8-509VM passthrough=\
no
/ip route
add distance=1 gateway=195.69.204.161 routing-mark=routReakOut
add distance=1 gateway=192.168.145.30 routing-mark=routClass8-509VM
add check-gateway=ping distance=1 gateway=Class8_509_VM
SSH block list
Так как у нашего MikroTik имеется реальный адрес, то возникают попытки подбора пароля со стороны сети Интернет по протоколу SSH, поэтому в firewall добавим ряд правил для блокировки таких IP адресов.
add action=drop chain=input comment="drop ssh brute forcers" dst-port=22 \
protocol=tcp src-address-list=ssh_blacklist
add action=add-src-to-address-list address-list=ssh_blacklist \
address-list-timeout=14w2d chain=input connection-state=new dst-port=22 \
protocol=tcp
add action=add-src-to-address-list address-list=ssh_stage3 \
address-list-timeout=10m chain=input connection-state=new dst-port=22 \
protocol=tcp
add action=add-src-to-address-list address-list=ssh_stage2 \
address-list-timeout=10m chain=input connection-state=new dst-port=22 \
protocol=tcp
add action=add-src-to-address-list address-list=ssh_stage1 \
address-list-timeout=10m chain=input connection-state=new dst-port=22 \
protocol=tcp
add action=drop chain=forward comment="drop ssh brute downstream" dst-port=22 \
protocol=tcp
На момент создания данной статьи в списки блокировок было порядком 400 адресов.
Итого
В итоге получаем на выходе настроенный виртуальный mikrotik, который выполняет маршрутизацию трафика, обеспечивает возможность подключения со стороны Интернет по l2tp/ipsec и обладает настройками firewall для разграничения пользователей и интерфейсов.
UPD
Спасибо gecube. Для MikroTik CHR необходимо приобретать лицензию, иначе каждый интерфейс ограничен скоростью 1 мбит, либо можно активировать trial на 60 дней с полным функционалом. Стоимость и градация лицензий. Безлимитная лицензия ограничивается только скоростью ваших интерфейсов.