Шейпинг и распределение нагрузки при двух провайдерах (как прописать правила шейпинга и балансировки нагрузки ?)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модератор: SLEDopit

Ответить
Аватара пользователя
dduck
Сообщения: 64
ОС: Debian

Шейпинг и распределение нагрузки при двух провайдерах

Сообщение dduck »

Имеется Debian Lenny amd64. Четыре сетевых карты: две объединены (в br0) и смотрят в локальную сеть, две (eth2, eth3) подключены к двум модемам adsl. При подключении к провайдерам поднимаются интерфейсы ppp0 и ppp1 и выдаются динамические IP адреса. Оба канала в интернет равноценны и скорости у них одинаковые.

Делаю маскарадинг сразу на двух ppp:

Код: Выделить всё

INET="ppp0"
INET="ppp1"
LNET="br0"
NET_NET="192.168.111.0/24"
iptables -t nat -A POSTROUTING -o $INET -s $NET_NET -j MASQUERADE
iptables -t nat -A POSTROUTING -o $INET2 -s $NET_NET -j MASQUERADE
Потом удаляю старый маршрут и устанавливаю новые маршруты по умолчанию

Код: Выделить всё

ip route del default
ip route add default nexthop dev ppp0 weight 1 nexthop dev ppp1 weight 1
Вопрос 1: Таким образом я хотел добился балансировки нагрузки с двух провайдеров. Но почему то интернет то есть то нет, с половины адресов работает с половины нет. Подскажите пожалуйста Что подправить?
Вот вывод # ip ro s

Код: Выделить всё

хх.хх.хх.10 dev ppp1  proto kernel  scope link  src хх.хх.хх.102
хх.хх.хх.255 dev ppp0  proto kernel  scope link  src хх.хх.хх.219
192.168.1.0/24 dev eth3  proto kernel  scope link  src 192.168.1.2
192.168.110.0/24 dev eth2  proto kernel  scope link  src 192.168.110.2
192.168.111.0/24 dev br0  proto kernel  scope link  src 192.168.111.1
default
        nexthop dev ppp0 weight 1
        nexthop dev ppp1 weight 1

И ещё вопрос с шейпингом: когда был один провайдер я делил интернет через дисциплину HTB, вешал её на внешний интерфейс ppp0 и внутренний интерфейс br0. Когда вешается дисциплина HTB она задаёт полосу пропускания на весь интерфейс:
для трафика из интернета

Код: Выделить всё

# определяем сетевые интерфейсы в сокращениях
INET="ppp0"
LNET="br0"
# определяем скорость Download и Upload
RATEMIN=1800
RATEMAX=1800
.....
# добавить корневую дисциплину HTB
tc qdisc add dev $LNET root handle 2: htb default 150
# Первая корневая дисциплина на этом интерфейсе
# с ограничением скорости
tc class add dev $LNET parent 2: classid 2:1 htb rate ${RATEMIN}kbit ceil ${RATEMAX}kbit
.....
для трафика в интернет

Код: Выделить всё

# определяем сетевые интерфейсы в сокращениях
INET="ppp0"
LNET="br0"
# определяем скорость Download и Upload
RATEMIN=1800
RATEMAX=1800
....
# добавить корневую дисциплину HTB
tc qdisc add dev $INET root handle 1: htb default 150
# добавить общее ограничение скорости по классу
tc class add dev $INET parent 1: classid 1:1 htb rate ${RATEMIN}kbit ceil ${RATEMAX}kbit
.....
И всё работало.

Вопрос 2: Как сейчас (когда есть два соединения с интернетом(ppp0, ppp1)) вешать и определять ширину канала на интерфейсах? В частности интересует как описать входящий трафик на интерфейсе br0? Просто тупо увеличить его вдвое?
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: Шейпинг и распределение нагрузки при двух провайдерах

Сообщение Alex2ndr »

dduck писал(а):
29.09.2010 10:22
Вопрос 2: Как сейчас (когда есть два соединения с интернетом(ppp0, ppp1)) вешать и определять ширину канала на интерфейсах?

Используйте один из виртуальных интерфейсов - IMQ или IFB. Направьте в него трафик с ppp0 и ppp1. И шейпер тоже на него вешайте.

dduck писал(а):
29.09.2010 10:22
В частности интересует как описать входящий трафик на интерфейсе br0? Просто тупо увеличить его вдвое?

Теоретически да. На практике же надо проводить испытания, чтобы понять как именно он увеличился. В лучшем случае получите полтора...
Спасибо сказали:
Аватара пользователя
dduck
Сообщения: 64
ОС: Debian

Re: Шейпинг и распределение нагрузки при двух провайдерах

Сообщение dduck »

Если я сделаю пере направление с ppp0 и ppp1 на ifb0.
Маскарадинг с какого интерфеса делать? С ppp0, ppp1 или с IFB ?

Код: Выделить всё

iptables -t nat -A POSTROUTING -o ppp0 -s $NET_NET -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp1 -s $NET_NET -j MASQUERADE
так?

Код: Выделить всё

iptables -t nat -A POSTROUTING -o ifb0 -s $NET_NET -j MASQUERADE
или так?
Спасибо сказали:
Аватара пользователя
dduck
Сообщения: 64
ОС: Debian

Re: Шейпинг и распределение нагрузки при двух провайдерах

Сообщение dduck »

Маскарадинг с интерфеса ifb0 не работает. т.е. надо делать вот так:

Код: Выделить всё

iptables -t nat -A POSTROUTING -o ppp0 -s $NET_NET -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp1 -s $NET_NET -j MASQUERADE


Вопрос в следующем. Как проверить правильно ли у меня идут пакеты? А то что-то ширина канала как была 2Мбит/с так и осталась :unsure:, а должна была возрасти до 4Мбит/с
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: Шейпинг и распределение нагрузки при двух провайдерах

Сообщение Alex2ndr »

dduck писал(а):
30.09.2010 10:39
Маскарадинг с какого интерфеса делать? С ppp0, ppp1 или с IFB ?

Думаю что все-таки с ppp0 и ppp1. Без особой нужды с виртуальными интерфейсами лучше не заигрывать.
Спасибо сказали:
Аватара пользователя
dduck
Сообщения: 64
ОС: Debian

Re: Шейпинг и распределение нагрузки при двух провайдерах

Сообщение dduck »

На такую команду:

Код: Выделить всё

# перенаправлять пакеты с ppp0 в ifb0
tc qdisc add dev ppp0 root handle 3: prio
tc filter add dev ppp0 parent 3: protocol ip \
        u32 match u32 0 0 action mirred egress redirect dev ifb0
выводится такое сообщение:

Код: Выделить всё

Action 4 device ifb0 ifindex 24

Подскажите пожалуйста это нормально?
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: Шейпинг и распределение нагрузки при двух провайдерах

Сообщение Alex2ndr »

У меня эта команда выглядит так:

Код: Выделить всё

modprobe ifb
ip link set dev ifb0 up
tc qdisc add dev ppp0 handle ffff: ingress
tc filter add dev ppp0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

И что-то я сообщений подобных вашему не припомню.
Спасибо сказали:
expdot
Сообщения: 176
ОС: Fedora 13, Win Vista

Re: Шейпинг и распределение нагрузки при двух провайдерах

Сообщение expdot »

на входе из интернета маркируешь пакеты
на выходе в локальную сеть маркированные пакеты перенаправляешь в ifb, на котором установлен шейпер
Спасибо сказали:
Аватара пользователя
dduck
Сообщения: 64
ОС: Debian

Re: Шейпинг и распределение нагрузки при двух провайдерах

Сообщение dduck »

dduck писал(а):
30.09.2010 12:29
выводится такое сообщение:

Код: Выделить всё

Action 4 device ifb0 ifindex 24
Подскажите пожалуйста это нормально?
Уважаемый Alex2ndr провёл испытания. Оказывается это нормально и всё работает.
Спасибо сказали:
Аватара пользователя
dduck
Сообщения: 64
ОС: Debian

Re: Шейпинг и распределение нагрузки при двух провайдерах

Сообщение dduck »

По адресу http://lartc.org/howto/lartc.rpdb.multiple-links.html лежит описание как распределить нагрузку по двум соединениям двух провайдеров.
Совместно с Alex2ndr был написан скрипт автоматизирующий данные действия. Может кому и пригодится.

Код: Выделить всё

#!/bin/sh
exit
echo ""
echo "= BEGIN ROUTING =============================================="

#определяем переменные
IF0="br0"               #локальная сеть
IF1="ppp0"              #провайдер 1
IF2="ppp1"              #провайдер 2

IP0=`ip ro s | grep -e "$IF0 *proto" | awk '{print $9}' | head -1`                  #ip адрес br0
IF0_NET=`echo $IP0 | awk 'BEGIN{FS="."}{print $1"."$2"."$3".0"}'`               #локальная сеть

#проверка присутствия таблиц T1 и T2 в /etc/iproute2/rt_tables
if [ -z "`cat /etc/iproute2/rt_tables | grep T1`" ]; then
    echo "100   T1" >> /etc/iproute2/rt_tables  # создаем T1
fi
if [ -z "`cat /etc/iproute2/rt_tables | grep T2`" ]; then
    echo "101   T2" >> /etc/iproute2/rt_tables  # создаем T2
fi

ip route add 127.0.0.0/8 dev lo table T1
ip route add 127.0.0.0/8 dev lo table T2

Del_default_route(){
    while [ -n "`ip route list | grep default`" ]; do
        ip route del default
    done
}

Del_tables(){
    while [ -n "`ip rule ls | grep T1`" ]; do
        ip rule del table T1
    done
    while [ -n "`ip rule ls | grep T2`" ]; do
        ip rule del table T2
    done
}


init_iface1(){
    IP1=`ip ro s | grep -e "$IF1 *proto" | awk '{print $9}' | head -1`     #ip адрес ppp0
    IP_P1=`ip ro s | grep -e "$IF1 *proto" | awk '{print $1}' | head -1`   #шлюз ppp0
    P1_NET=`echo $IP_P1 | awk 'BEGIN{FS="."}{print $1"."$2"."$3".0"}'` #сеть шлюза ppp0
    ip route add $P1_NET dev $IF1 src $IP1 table T1
    ip route add default via $IP_P1 table T1
    ip route add $P1_NET dev $IF1 src $IP1
    ip rule add from $IP1 table T1
    ip route add $P0_NET dev $IF0 table T1
    ip route add $P1_NET dev $IF1 table T2
}

init_iface2(){
    IP2=`ip ro s | grep -e "$IF2 *proto" | awk '{print $9}' | head -1`      #ip адрес ppp1
    IP_P2=`ip ro s | grep -e "$IF2 *proto" | awk '{print $1}' | head -1`      #шлюз ppp1
    P2_NET=`echo $IP_P2 | awk 'BEGIN{FS="."}{print $1"."$2"."$3".0"}'` #сеть шлюза ppp1
    ip route add $P2_NET dev $IF2 src $IP2 table T2
    ip route add default via $IP_P2 table T2
    ip route add $P2_NET dev $IF2 src $IP2
    ip rule add from $IP2 table T2
    ip route add $P0_NET dev $IF0 table T2
    ip route add $P2_NET dev $IF2 table T1
}

# Если поднят первый интерфейс
if [ -n "`ifconfig | grep $IF1`" ]; then
    # Если поднят и второй интерфейс
    if [ -n "`ifconfig | grep $IF2`" ]; then
        # Удалить старые таблицы
        Del_tables

        # Инициализируем таблицы
        init_iface1
        init_iface2

        # Удаляем старый маршрут
        Del_default_route

        # Балансировка
        #ip route add default scope global nexthop via $IP_P1 dev $IF1 weight 1 \
        # nexthop via $IP_P2 dev $IF2 weight 1
        ip route add default via $IP_P2
        ip rule add fwmark 102 table T1         #все пакеты, которые имеют метку 10 маршрутизировать по таблице T1
        ip rule add fwmark 106 table T1         #все пакеты, которые имеют метку 10 маршрутизировать по таблице T1


    # Если поднят только второй интерфейс
    else
        # Удаляем старый маршрут
        Del_default_route
        # Добавляем новый маршрут
        ip route add default via $IP_P1
    fi

else
    # Если поднят только первый интерфейс
    if [ -n "`ifconfig | grep $IF2`" ]; then
        # Удаляем старый маршрут
        Del_default_route
        # Добавляем новый маршрут
        ip route add default via $IP_P2
    fi
fi

# Сбросим кэш маршрутизации
ip route flush cache


echo "= END ROUTING =============================================="
echo ""

exit 0

# Команды для проверки
# ip rule show
# ip link list
# ip ro s
# tc -s qdisc show dev ifb0
# echo 1 >/proc/sys/net/ipv4/ip_forward
# ip route list table T1
Спасибо сказали:
Ответить