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

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

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


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

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

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

image



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


interface FastEthernet0/0
&nbsp ip address 192.168.1.2 255.255.255.252

interface FastEthernet1/0
&nbsp 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
&nbsp match interface FastEthernet0/0
route-map SecondNAT permit 10
&nbsp 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
&nbsp 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 раза больше.

Но у меня пользователей много и каждый потребляет мало. Так что пропорция по количеству сессий, в моём случае, практически соответствует пропроции входящего трафика.
Tags:CiscoUnequal Load Balancingфиктивный маршрут
Hubs: Lumber room
+13
1.3k 26
Comments 6

Popular right now

Сетевой инженер
to 200,000 ₽Sportmaster LabМосква
Senior Backend Engineer
to 220,000 ₽Zenia-AIRemote job
Старший инженер по нагрузочному тестированию
from 150,000 to 180,000 ₽YotaСанкт-ПетербургRemote job
Android-разработчик
from 130,000 to 160,000 ₽Цифровые решенияRemote job