The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Балансировка трафика в Linux"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Разговоры, обсуждение новостей (Public)
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Балансировка трафика в Linux"  +/
Сообщение от auto_tips (??) on 04-Дек-09, 13:13 
Данная схема отслеживает новые соединения и равномерно распределяет их по каналам.

Допустим есть 4 канала в интернет:
   Linux Router           ISP
  |ppp0 10.0.0.1|-----|10.0.0.2|
  |ppp1 10.0.0.3|-----|10.0.0.3|
  |ppp2 10.0.0.5|-----|10.0.0.4|
  |ppp3 10.0.0.7|-----|10.0.0.5|

Добавляем в файл /etc/iproute2/rt_tables таблицы:

   108   sat2
   109   sat3
   110   sat4


Настраиваем маршруты (раскидываем трафик по таблицам в зависимости от nfmark):

   ip rule add prio 50 fwmark 1 table sat2
   ip rule add prio 51 fwmark 2 table sat3
   ip rule add prio 52 fwmark 3 table sat4

   ip route add default via 10.0.0.2 dev ppp0

   ip rule add prio 210 from 10.0.0.3 table sat2
   ip route add default via 10.0.0.4 dev ppp1 table sat2

   ip rule add prio 211 from 10.0.0.5 table sat3
   ip route add default via 10.0.0.6 dev ppp3 table sat3

   ip rule add prio 212 from 10.0.0.7 table sat4
   ip route add default via 10.0.0.8 dev ppp4 table sat4


Деление по таблицам осуществляется iptables:

   iptables -t mangle -N NEW_OUT_CONN

   # Выбираем новые сессии
   iptables -t mangle -A PREROUTING -s 10.0.0.0/16 -m state --state NEW,RELATED -j NEW_OUT_CONN

   # Восстанавливает значение nfmark из CONNMARK
   iptables -t mangle -A PREROUTING -s 10.0.0.0/16 -j CONNMARK --restore-mark

   iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 0

    # Каждый четвертый пакет
   iptables -t mangle -A NEW_OUT_CONN -m statistic --mode nth --every 4 -j RETURN
   iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 1

   # Каждый третий пакет
   iptables -t mangle -A NEW_OUT_CONN -m statistic --mode nth --every 3 -j RETURN  
   iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 2
  
   # Каждый второй пакет
   iptables -t mangle -A NEW_OUT_CONN -m statistic --mode nth --every 2 -j RETURN
   iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 3


Модуль CONNMARK отслеживает метки для всех пакетов сессии, это значит, что если пометить пакет в сессии, то все пакеты принадлежащие ей будут иметь эту же метку. --restore-mark копирует метку в метку пакета 'nfmark'. По которой пакет попадает в соответствующую таблицу, и подвергается маршрутизации.

-m statistic --mode nth --every N соответствует каждому N-нному пакету.


URL: http://litec.ru/page.php?id=11
Обсуждается: http://www.opennet.dev/tips/info/2236.shtml

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по ответам | RSS]

1. "Балансировка трафика в Linux"  +/
Сообщение от ibat email(??) on 04-Дек-09, 13:13 
Откуда взять CONNMARK ? Его нужно вставть в ядро ?
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Балансировка трафика в Linux"  +/
Сообщение от pavlinux (ok) on 04-Дек-09, 17:55 
>Linux Router           ISP
>
>ppp0 10.0.0.1|-----|10.0.0.2|
>ppp1 10.0.0.3|-----|10.0.0.3| <- че за хрень?
>ppp2 10.0.0.5|-----|10.0.0.4|
>ppp3 10.0.0.7|-----|10.0.0.5|

Какя-то каша тут

> ip route add default via 10.0.0.6 dev ppp3 table sat3
> ip route add default via 10.0.0.8 dev ppp3 table sat4

где живут 10.0.0.6 и 10.0.0.8 ?

Может так ?

Linux Router           ISP

ppp0 10.0.0.1|-----|10.0.0.2|
ppp1 10.0.0.3|-----|10.0.0.4|
ppp2 10.0.0.5|-----|10.0.0.6|
ppp3 10.0.0.7|-----|10.0.0.8|

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Балансировка трафика в Linux"  +/
Сообщение от pavlinux (ok) on 04-Дек-09, 18:06 
>Откуда взять CONNMARK ? Его нужно вставть в ядро ?

modprobe xt_CONNMARK;

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "Балансировка трафика в Linux"  +/
Сообщение от iZEN (ok) on 04-Дек-09, 21:12 
Решение на PF:

lan_net = "192.168.0.0/24"

int_if  = "dc0" # 192.168.0.1

ext_if1 = "fxp0" # 10.0.0.1
ext_if2 = "fxp1" # 10.0.0.3
ext_if3 = "fxp2" # 10.0.0.5
ext_if4 = "fxp3" # 10.0.0.7

ext_gw1 = "10.0.0.2"
ext_gw2 = "10.0.0.4"
ext_gw3 = "10.0.0.6"
ext_gw4 = "10.0.0.8"

set skip on { lo }

scrub in all

block all

pass in on $int_if route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2), ($ext_if3 $ext_gw3), ($ext_if4 $ext_gw4) } round-robin from $lan_net

pass out all

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Балансировка трафика в Linux"  +/
Сообщение от pavlinux email(ok) on 04-Дек-09, 23:10 
Ах да,
>равномерно распределяет

Поясните понятие равномерности!
1. по NEW пакетам?
2. по CONNECT
2. по трафику?
3. по времени?

Есть 800 рабочих соединений, после того как
убились 200 соединений на одном фейсе,
оно без о всяких предпочтений продолжает
по кругу распределять?

Так что предлагаю переименовать тему в "Поочерёдное распределение трафика..."

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "Балансировка трафика в Linux"  +/
Сообщение от Добрый Дохтур on 05-Дек-09, 00:45 
а если каналы неравноценны и каждому каналу надо отдельный вес?

а в случае sip как сделать так, чтобы не пустить rtp через другой канал сверхумным RR?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "Балансировка трафика в Linux"  +/
Сообщение от iZEN (ok) on 05-Дек-09, 07:25 
Это уже частности и... тоже решаются красиво (я надеюсь).
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "Балансировка трафика в Linux"  +/
Сообщение от XoRe (ok) on 05-Дек-09, 18:42 
Балансировка трафика через разных провайдеров - это всегда тонкое дело с кучей ньюансов.
Можно только поблагодарить за рабочие примеры под iptables и под pf.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

9. "Балансировка трафика в Linux"  +/
Сообщение от unixlamaster email on 06-Дек-09, 13:55 
У меня 2 модема, сделал следующее:
    export P1=`ifconfig ppp0|grep P-t-P|awk -F: '{print $3}'|awk '{print $1}'`
    export P2=`ifconfig ppp1|grep P-t-P|awk -F: '{print $3}'|awk '{print $1}'`
    export IP1=`ifconfig ppp0|grep P-t-P|awk -F: '{print $2}'|awk '{print $1}'`
    export IP2=`ifconfig ppp1|grep P-t-P|awk -F: '{print $2}'|awk '{print $1}'`

    ip rule add prio 50 fwmark 1 table mts1

    ip route add default via $P1 dev ppp0

    ip rule add prio 210 from $IP2 table mts2
    ip route add default via $P2 dev ppp1 table mts2

    iptables -t mangle -N NEW_OUT_CONN

   # Выбираем новые сессии
   # 10.200.0.0/24 локальная сеть
   # 172.28.0.0/16 сеть P2P выделяемая оператором
   iptables -t mangle -A PREROUTING -s 10.200.0.0/24 -m state --state NEW,RELATED -j NEW_OUT_CONN

   iptables -t mangle -A PREROUTING -s 172.28.0.0/16 -m state --state NEW,RELATED -j NEW_OUT_CONN

   # Восстанавливает значение nfmark из CONNMARK
   iptables -t mangle -A PREROUTING -s 10.200.0.0/24 -j CONNMARK --restore-mark
   iptables -t mangle -A PREROUTING -s 172.28.0.0/16 -j CONNMARK --restore-mark

   iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 0

   # Каждый второй пакет
   iptables -t mangle -A NEW_OUT_CONN -m statistic --mode nth --every 2 -j RETURN
   iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 1

Так вот, нужно что бы каждый второй пакет шёл через следующий модем, а идёт всё только через ppp0. Что я не так сдела, подскажите пожалуйста?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

10. "Балансировка трафика в Linux"  +/
Сообщение от ро on 08-Дек-09, 01:07 
красиво ,но не гибко
например упал линк, в iptables удаляем 1 коммандой 1 правило(из cron) и дохлый линк не юзается.
а как быть с pf?
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

11. "Балансировка трафика в Linux"  +/
Сообщение от pavlinux (ok) on 08-Дек-09, 17:59 

ip route add default scope global nexthop via $IP1 dev $P1 weight 1 nexthop via $IP2 dev $P2 weight 1


http://lartc.org/lartc.html#LARTC.RPDB.MULTIPLE-LINKS

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

12. "Раздел полезных советов: Балансировка трафика в Linux"  +/
Сообщение от pavlinux (ok) on 08-Дек-09, 18:40 
Кто меньше?

#!/bin/bash

echo -ne "\n101\tT1\n102\tT2\n103\tT3\n" < /etc/iproute2/rt_tables; # "<" - перевернуть :)

#   IF     LOCAL        NET        REMOTE   TABLE
A="eth1 192.168.1.1 192.168.1.0/24 8.8.4.4    T1"
B="eth2 192.168.2.1 192.168.2.0/24 4.4.1.1    T2"
C="eth3 192.168.3.1 192.168.3.0/24 4.4.2.2    T3"

PRIORITY=50;
j=0;

for i in "$A" "$B" "$C"
   do
      $((j++));
      set -- $i;
      echo "ip route add $3 dev $1 src $2 table $5;"
      echo "ip route add default via $4 table $5;"
      echo "ip route add default scope global nexthop via $4 dev $1 weight 1;"
      echo "ip rule add prio $((PRIORITY + j)) fwmark $j table $5"
done
       echo "ip route add default via 192.168.0.1 dev eth0;"

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру