Аналог ip unnumbered в Mikrotik RouterOS

Сразу скажу, что на написание поста меня вдохновила аналогичная статья, опубликованная на Хабре еще в 2009 году. Поэтому я не буду пересказывать ее содержимое и приводить конфигурацию Cisco-девайсов.

Сегодня, когда IPv4-адреса стали еще большим дефицитом, чем автомобиль «Москвич» во времена СССР, выделять клиенту сеть /30 или /31 — это преступление. В Cisco для обхода этих проблем есть режим «ip unnumbered», позволяющий назначить клиенту единственный адрес, не расходуя адреса впустую. Давайте посмотрим как это делается в Mikrotik RouterOS. Представим такую (сильно упрощенную) схему:



Наш шлюз (provider-gw) подключен интерфейсом ether1 к интернету посредством BGP (или другим способом, это не важно) и у нас есть собственная «большая» публичная сеть, например — 123.45.60.0/22. Первый клиент подключен к VLAN-интерфейсу vlan100, который, предположим, заведён в ether2. Второй — к vlan200.

/interface vlan add disabled=no name=vlan100 vlan-id=100 interface=ether2 comment="Client 1"
/interface vlan add disabled=no name=vlan200 vlan-id=200 interface=ether2 comment="Client 2"

Маршрутизатор должен иметь IP-адрес из нашей публичной сети. Допустим, 123.45.60.1 с маской /22. Этот адрес нужно назначить на любой свободный интерфейс или vlan, даже если они потом никак не будут использоваться. Пусть это будет vlan1000:

/interface vlan add disabled=no name=vlan1000 vlan-id=1000 interface=ether2
/ip address add interface=vlan1000 address=123.45.60.1/22

Теперь сделаем настройки на маршрутизаторе для наших клиентов. Для этого выделим им любые свободные IP из диапазона нашей публичной сети, допустим 123.45.60.5 и 123.45.60.6. Добавим статические маршруты для этих адресов, ведущие в соответствующие клиентские VLAN. При этом желательно указать preffered source адрес нашего маршрутизатора.

/ip route add dst-address=123.45.60.5 gateway=vlan100 pref-src=123.45.60.1 comment="Static route to Client 1"
/ip route add dst-address=123.45.60.6 gateway=vlan200 pref-src=123.45.60.1 comment="Static route to Client 2"

Настраиваем клиента №1:
IP: 123.45.60.5
Маска: 255.255.255.252 (или /22; да, тут мы указываем маску нашей «большой» публичной сети)
Шлюз: 123.45.60.1

Настраиваем клиента №2 аналогичным образом. Меняется только IP-адрес.
IP: 123.45.60.6
Маска: 255.255.255.252 (или /22)
Шлюз: 123.45.60.1

Всё. Этого достаточно. После этого IP клиентов будут доступны из интернета, без лишней траты адресов. Остальные клиенты включаются аналогичным образом, каждый — в свой VLAN. Но в данном случае у нас возникает такая ситуация: допустим, клиент №1 хочет передать ip-пакет клиенту №2. Поскольку адрес клиента №2 попадает под маску сети /22, клиент №1 считает что №2 находится с ним в одном широковещательном домене и попытается отправить пакет не через маршрутизатор, а напрямую, для чего попытается выяснить его MAC-адрес посредством протокола ARP. Само собой, у него это не выйдет, поскольку клиенты находятся в разных VLAN и не могут передавать друг другу ARP-запросы.

Если вам нужно изолировать клиентов друг от друга — можно оставить всё как есть, хотя с точки зрения интернета это неправильно (каждый узел должен иметь связь с другим узлом по протоколу IP). Решается такая ситуация включением proxy-arp на клиентских VLAN:

/interface vlan set vlan100 arp=proxy-arp
/interface vlan set vlan200 arp=proxy-arp

Теперь маршрутизатор будет отвечать на arp-запросы клиентов, подставляя свой MAC-адрес в ответе и клиенты смогут обмениваться IP-трафиком, словно находятся в одном сегменте.

Как вы могли догадаться, аналогичным образом можно назначать в один клиентский VLAN несколько IP-адресов или даже подсетей, просто создавая статические маршруты с соответствующим dst-address.

UPD:

Как показала практика, гораздо лучше создавать не статические маршруты в /ip route, а просто добавлять на интерфейс IP-адрес маршрутизатора с указанием в поле network нужного IP-адреса, маршрут будет создан автоматически. Пример:

/ip address add network=123.45.60.5 interface=vlan100 address=123.45.60.1 comment="IPoE Client 1"
/ip address add network=123.45.60.6 interface=vlan100 address=123.45.60.1 comment="IPoE Client 2"
Поделиться публикацией

Похожие публикации

Комментарии 15

    +2
    Это костыль, для работы которого необходимы статические маршруты. Суть ip unnumbered в Cisco в том, что она сама умеет их создавать (например, на основании dhcp обмена) и redistribute-ить дальше.
      0
      Разумеется костыль, но ведь и Mikrotik — не Cisco. Но на счет «сама умеет их создавать» — не вполне уверен, можете объяснить как? В случае с DHCP всё понятно, это и на Mikrotik'е можно сделать. Но если вам в cisco надо чётко указать что такому-то vlan назначается такой-то ip, как это делается, если не статическими маршрутами?
        0
        Нет, на микротике это сделать нельзя.
        Поясню. Я не фанат cisco, потому могу ошибаться в терминологии, но постараюсь донести мысль.
        Возьмем сеть 1.0.0.0/24.
        На loopback вешаем 1.0.0.1/24.
        На пачку vlan-ов вешаем ip unnumbered. Запускаем там же dhcp relay.

        Дальше получается такой процесс:
        1) Клиент пытается получить по dhcp адрес. Cisco пересылает запрос на сервер.
        2) Сервер отвечает на запрос, выдавая, например, адрес 1.0.0.173.
        3) DHCP-ответ улетает клиенту, клиент получает адрес.
        4) Тут включается магия: Cisco всё это время слушала обмен DHCP-пакетами и сама создает маршрут на 1.0.0.173 через нужный VLAN. Этот же маршрут автоматически удаляется из таблицы после окончания времени DHCP lease-ы (и, естественно, продлевается, когда клиент продлевает lease).

        Таким образом отпадает необходимость вручную (статикой) прибивать IP-адреса пользователей к vlan-ам.

        Из аналогом реальным на сегодняшний день есть только accel-ppp под Linux, но он заточен под ISP (я не говорю, что это плохо :) ).
          0
          Да, в этом случае магия Cisco побеждает )
          А есть какие-то особенности применения, если нет DHCP?
            0
            Не знаю, я не пользуюсь Cisco. Я только собирал стенд для ознакомления.
            0
            И все-таки на микротике это сделать можно, правда в виде скрипта, срабатывающего при выдаче DHCP адреса.
        0
        Так же вместо статических маршрутов можно использовать такую конструкцию:
        1.1.1.1 — адрес шлюза
        1.1.1.2 -адрес клиента 1
        1.1.1.3 -адрес клиента 2
        /interface vlan
        add arp=proxy-arp disabled=no interface=ether1 l2mtu=9010 mtu=1500 name=Client1 use-service-tag=no vlan-id=100
        add arp=proxy-arp disabled=no interface=ether1 l2mtu=9010 mtu=1500 name=Client2 use-service-tag=no vlan-id=101
        /ip address
        add address=1.1.1.1/32 disabled=no interface=Client1 network=1.1.1.2
        add address=1.1.1.1/32 disabled=no interface=Client2 network=1.1.1.3
          0
          Не подходит для RouterOS 3.x (хотя сомневаюсь что у кого-то такие динозавры остались). Там нельзя назначить двум разным интерфейсам одинаковый IP адрес. Но, безусловно, решение красивое.
          –1
          Это больше выглядит как заметка во внутренней вики конторы, но никак не статья. Сложно въехать, для чего оно вообще.
            +1
            Это и не статья. Это заметка-рецепт для небольших и небогатых интернет-провайдеров, которые используют Mikrotik и хотят экономить публичные IP-адреса, выделяемые клиентам. Что именно вам не понятно?
            0
            Вместо arp proxy можно делать статический маршрут на другой стороне. Можно даже раздавать этот маршрут по DHCP.

            Одна беда — не все клиенты нормально воспримут ip-адрес в подсети /0.
              0
              Не получится. Вернее получится, но когда клиентов будет, допустим, 50, то и маршрутов столько же. Не подходит. К тому же я специально не затрагивал DHCP, поскольку область применения описанного способа чуть другая, чем там где DHCP нужен.
                0
                В смысле — маршрутов столько же? Они же все, которые от клиента, прекрасно агрегируются в один.
                  0
                  Допустим, есть три клиента. Одному выдали 123.45.60.100, другому 123.45.60.105, третьему 123.45.60.107. Как они смогут сагрегироваться?
                    0
                    123.45.60.0/24

                    Можно даже маршрут по умолчанию дать.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое