В статье приведу результат решения задачи по организации маршрутизации между виртуальными машинами на VMware с использованием MikroTik CHR, причем с организацией доступа по VPN до виртуальных машин из внешней сети.


Введение


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


  1. В наличии сервер с объемом памяти 96 Гб, 24 CPU и 22 TB дискового пространств
  2. К серверу подключены 2 линии:

  • одна служит для менеджмента и управления VMware;
  • со второй приходят два VLAN — один для доступа во внутреннюю сеть организации и с выходом в интернет, со второго приходят реальные адреса.

  1. Для того, чтобы больше не использовать адресное пространство организации необходимо внутри сервера для ресурса из 3 виртуальных машин определить собственное адресное пространство и закрыть ресурс для доступа других ресурсов из 3 машин.


  2. Необходимо блокировать трафик с виртуальных машин, который идет не на прокси организации.


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


  4. На сервере стоит 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 адреса интерфейсов
/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.


DHCP сервер
/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
/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 и заблокируем трафик между локальными интерфейсами.


Firewall rules
/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 с интерфейса, который имеет реальный адрес.
Для облегчения нагрузки на сеть организации для каждого пользователя сделаем ограничение в скорости.
В итоге получаем следующие настройки, приведу часть настроек для одного пользователя.


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 адресов.


SSH block
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 дней с полным функционалом. Стоимость и градация лицензий.. Безлимитная лицензия ограничивается только скоростью ваших интерфейсов.

Комментарии (9)


  1. gecube
    04.05.2018 22:22

    Стоит указать, что chr требует лицензию. И она вполне платная. Иначе полоса 1мбит, что в production неприемлемо. Можно сделать триал и постоянно его обновлять, но это остаётся на совести пользователя chr (админа)


  1. EvgenyT Автор
    05.05.2018 07:43

    Да chr платная, но если настраивать такую систему, то вполне можно и приобрести лицензию, когда такой вариант оказывается работоспособным.


  1. e1t1
    05.05.2018 15:11

    Зачем лишний L2TP, чем просто IPsec не угодил?


    1. EvgenyT Автор
      05.05.2018 15:23
      +1

      L2TP — протокол для поддержки VPN, IPsec — набор протоколов для обеспечения защиты данных, т.е. обеспечивает шифрование данных. L2TP шифрование не обеспечивает. Он только создает vpn подключение.


      1. dineck
        06.05.2018 13:35

        Если Вам не надо Layer 2 в сетях VPN не вижу смысла использовать L2TP.


        1. EvgenyT Автор
          06.05.2018 13:37

          Возможно, но данная связка была выбрана из-за возможности шифрования трафика и данная связка поддерживается всеми операционными системами. И является одной из наиболее защищенной.


          1. gecube
            06.05.2018 20:16

            L2TP действительно поддерживается большинством ОС из коробки, поэтому для подключения клиентов к серверу (или сети) можно считать его стандартом де-факто.


            1. e1t1
              06.05.2018 20:39

              Лучше ValdikSS сказать все равно не получится:
              «До Windows 7 в Windows была поддержка IPsec только в транспортном режиме, только с PSK, и ее нужно было настраивать вручную через правила файрволла. Поэтому и использовали L2TP для аутентификации и установления L2-туннеля, а IPsec — для шифрования L2TP-туннеля.

              В наше время, когда поддержка IKEv2 или хотя бы IKEv1 есть везде, L2TP нужен только в том случае, если вам нужна L2-связность, т.е. нужно, чтобы в сети можно было передавать broadcast, multicast трафик. Обычно нужна только L3-связность, поэтому L2TP использовать нецелесообразно — он повышает накладные расходы на инкапсуляцию, что сказывается на размере пакета и „
              habr.com/post/250859/#comment_9763974


      1. gecube
        06.05.2018 19:32

        IPSec вполне годится для связывания сетей и соединения клиент-сервер, без L2TP/PPTP.