Cisco Unequal Load Balancing с двумя провайдерами, NAT и статическими шлюзами

    Тема, возможно, избитая. Но решения задачи при указанных исходных данных не нашёл. Ткните носом, если не прав. Пришлось приложить немного хитрости ;-).

    Постановка задачи


    В одном городе N-ке живёт небольшая сеть с двумя провайдерами подключёнными к маршрутизатору Cisco. IOS 12.2(33). После очередного расширения каналов у "First" провайдера берём 8 Мбит, у "Second" 4 Мбита.

    Динамической маршрутизации с провайдерами нет и не предвидится.
    Пользователи NAT-ятся на провайдеро-зависимые IP адреса.

    Необходимо прогружать максимально оба канала.

    image



    Исходная конфигурация


    interface FastEthernet0/0
      ip address 192.168.1.2 255.255.255.252

    interface FastEthernet1/0
      ip address 192.168.2.2 255.255.255.252

    ip route 0.0.0.0 0.0.0.0 192.168.1.1
    ip route 0.0.0.0 0.0.0.0 192.168.2.1

    route-map FirstNAT permit 10
      match interface FastEthernet0/0
    route-map SecondNAT permit 10
      match interface FastEthernet1/0

    ip nat source route-map FirstNAT interface FastEthernet0/0 overload
    ip nat source route-map SecondNAT interface FastEthernet1/0 overload


    Поиски решения



    Всем, кому не нравиться эта часть, прошу сразу к решению.

    Имея два равноправных шлюза трафик распределяется пополам между провайдерами. При плотном трафике (на Second «полочка» в 4 Мбита) загрузка First выше 5 Мбит не поднимается.

    Прочитав полезные документики с cisco.com:

    — How Does Load Balancing Work?
    — How Does Unequal Cost Path Load Balancing (Variance) Work in IGRP and EIGRP?
    — Troubleshooting Load Balancing Over Parallel Links Using Cisco Express Forwarding

    Находим интересную команду show ip cef {prefix} internal.
    Router# sh ip cef 0.0.0.0 0.0.0.0 internal
    !----cut----
    Load distribution: 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 (refcount 1)

    Hash OK Interface Address Packets
    1 Y FastEthernet1/0 192.168.2.1 0
    2 Y FastEthernet0/0 192.168.1.1 0
    3 Y FastEthernet1/0 192.168.2.1 0
    4 Y FastEthernet0/0 192.168.1.1 0
    5 Y FastEthernet1/0 192.168.2.1 0
    6 Y FastEthernet0/0 192.168.1.1 0
    7 Y FastEthernet1/0 192.168.2.1 0
    8 Y FastEthernet0/0 192.168.1.1 0
    9 Y FastEthernet1/0 192.168.2.1 0
    10 Y FastEthernet0/0 192.168.1.1 0
    11 Y FastEthernet1/0 192.168.2.1 0
    12 Y FastEthernet0/0 192.168.1.1 0
    13 Y FastEthernet1/0 192.168.2.1 0
    14 Y FastEthernet0/0 192.168.1.1 0
    15 Y FastEthernet1/0 192.168.2.1 0
    16 Y FastEthernet0/0 192.168.1.1 0
    !----cut----


    Видно что в CEF существует 16 bucket (мест/слотов/ведер) которые заполняются маршрутами в указанную сеть из таблицы маршрутизации (RIB).

    Вот он инструмент с помощью которого можно управлять пропорцией исходящего трафика. А при использовании NAT на адреса провайдера, и входящего!

    В нашей задаче пропорция трафика должна быть 2:1. Надо чтобы на First провайдера указывало два маршрута, а на Second — один. Необходимо, всего то, прописать фиктивный маршрут на First провайдера.

    Подсказка явилась здесь
    blog.ioshints.info/2007/02/unequal-load-split-with-static-routes.html

    В подсказке провайдеры подключены через Serial интерфейс и один маршрут прописан через IP адрес, второй через интерфейс. В варианте с FastEthernet такой фокус не проходит, сеть не point-to-point и нужен next-hop IP.

    Пробовал обмануть. Прописал default маршрут на несуществующий адрес, плюс добавил маршрут к этому адресу через First провайдера:

    ip route 0.0.0.0 0.0.0.0 172.16.1.1
    ip route 172.16.1.1 255.255.255.255 192.168.1.1


    Фокус не прошёл, cef разобрался по рекурсии, что посылать будет всё равно на 192.168.1.1. Картина не изменилась.

    Решение


    Итак, по одному маршруту в сторону каждого провайдера уже имеется. Необходимо добавить ещё один фиктивный маршрут в сторону First провайдера.

    Для этого настраиваем фиктивную подсеть на интерфейсе First провайдера и фиктивный шлюз:

    interface FastEthernet 0/0
      ip address 172.16.1.2 255.255.255.252 secondary
    ip route 0.0.0.0 0.0.0.0 172.16.1.1

    Маршрут появится, но при этом трафик повалиться в никуда, так как у First провайдера не существует адреса 172.16.1.1.

    Теперь, внимание, житейская хитрость ;-). Смотрим реальный MAC адрес шлюза первого провайдера и прописываем его в статическую запись ARP.

    arp 172.16.1.1 XXXX.XXXX.XXXX arpa


    Всё, фокус закончен. Маршрут фиктивный, но реальный трафик уходит на реального First провайдера.

    Router# sh ip cef 0.0.0.0 0.0.0.0 internal
    !----cut----
    Load distribution: 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 (refcount 1)

    Hash OK Interface Address Packets
    1 Y FastEthernet1/0 192.168.2.1 0
    2 Y FastEthernet0/0 192.168.1.1 0
    3 Y FastEthernet0/0 172.16.1.1 0
    4 Y FastEthernet1/0 192.168.2.1 0
    5 Y FastEthernet0/0 192.168.1.1 0
    6 Y FastEthernet0/0 172.16.1.1 0
    7 Y FastEthernet1/0 192.168.2.1 0
    8 Y FastEthernet0/0 192.168.1.1 0
    9 Y FastEthernet0/0 172.16.1.1 0
    10 Y FastEthernet1/0 192.168.2.1 0
    11 Y FastEthernet0/0 192.168.1.1 0
    12 Y FastEthernet0/0 172.16.1.1 0
    13 Y FastEthernet1/0 192.168.2.1 0
    14 Y FastEthernet0/0 192.168.1.1 0
    15 Y FastEthernet0/0 172.16.1.1 0
    !----cut----

    Тот же смысл, но без хитростей

    Договоритесь с First провайдером о secondary адресах. Тогда остаётся прописать два маршрута на два провайдерских IP адреса.

    Выводы


    Таким образом можно управлять пропорцией входящего/исходящего трафика в самом рядовом варианте подключения к нескольким провайдерам. И не надо BGP, AS, PI адресов.

    Минусы тоже очевидны:
    — вариантов пропрорций немного.
    — невозможно управлять трафиком соединений, устанавливаемых из Интернета.
    — при смене MAC на шлюзе провайдера, получаем blackhole.

    P.S. Уже позже нашёл статейку blog.ronix.net.ua/2008/10/ciso.html с тем же смыслом, но без хитрости с ARP записью.

    UPD

    Хаброюзер Fedia верно подметил, что я ошибся. Этим способом можно управлять количеством сессий (TCP в основном) в сторону каждого провайдера, а не входящим трафиком.

    Fedia:
    А на счёт того, что cef при двух маршрутах будет делить трафик пополам — это не совсем верно. Он будет делить инициализацию сессий (или по пакетам, или по назначению, или по паре «источник-назначени», даже по портам делить может), но не само кол-во трафика. Т.е. может статься (по дефолту он делит НЕ по пакетам), что сессий поровну, а трафика на одном провайдере в 2-3 раза больше.

    Но у меня пользователей много и каждый потребляет мало. Так что пропорция по количеству сессий, в моём случае, практически соответствует пропроции входящего трафика.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 6

      0
      Отлично… я как-раз это решение искал.
      У меня вопрос: fa0/0 и fa1/0 куда физически уходят?
      Меня интересует, будет ли работать эта схема на двух ADSL модемах, поднимающих PPPoE?
        0
        У меня интерфейсы к провайдерам подключены к оптическим медиаконверторам.

        Схема будет работать и на ADSL модемах.

        Циске, вообще, пофигу какой маршрутизатор стоит выше. Собственно можно читать статью как будто First — это первый ADSL модем, а Second второй ADSL модем.
        0
        У меня интерфейсы к провайдерам подключены к оптическим медиаконверторам.

        Схема будет работать и на ADSL модемах.

        Циске, вообще, пофигу какой маршрутизатор стоит выше. Собственно можно читать статью как будто First — это первый ADSL модем, а Second второй ADSL модем.
          0
          Кстати, про фастезернет и невозможность указать интерфейс: вообще то указать можно, но тогда будет работать спецтехнология, при которой циска будет рассылать icmр запрос на наличие такое сети у соседских рутеров броадкастом. И если сосед знает сеть и ему разрешено отвечать — ответит. Из ответа запрашивающий узнает МАС соседа и отправит туда пакет :)
            0
            В этом случае врят ли сработает, т.к. такой connected сети у провайдера нет. К тому же у провайдера может быть не cisco.

            Спасибо, за дополнение.
              0
              Там не важно, коннектед или нет — важно, чтобы была в таблице марщшрутизации.

              Но вы правы: это просто мысли вслух, понты, пальцы и «тоже хочу умное сказать» :) для полноты картины

          Only users with full accounts can post comments. Log in, please.