URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 90128
[ Назад ]

Исходное сообщение
"Проблема с балансировкой трафика: два провайдера - одна сетевая"

Отправлено AMatvey , 26-Окт-10 17:18 
Господа ГУРУ, помогите разобраться с такой ситуацией:

Есть сервер CentOs 5.5, две сетевые карты: eth0 - локалка; eth1 - Internet.
Требуется: сделать балансировку сессий между двумя провайдерами
Сделал так:
к eth1 привязал ip адрес 1-го провайдера, к eth1:1 ip второго.
Поскаольку в CenOs 5.5 в iptables нет модуля statistic, установил версию 1.4.9.1 из www.netfilter.org как написано в INSTALL, предварительно сделав yum erase iptables:
$ ./configure --prefix=/
$ make
# make install

Далее в /etc/iproute2/rt_tables дописал таблицу: 201  nartel
cat /etc/rc.d/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
t2="nartel"
gw2="192.168.11.29"
gw2="192.168.55.1"
ip1="192.168.11.49"
ip2="192.168.55.50"
net1="192.168.11.0/24"
net2="192.168.55.0/24"
touch /var/lock/subsys/local
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
ip route add $net2 dev eth1 proto kernel scope link src $ip2 table $t2
ip route add $net1 dev eth1 table $t2
ip route add 127.0.0.0/8 dev lo table $t2
ip route add default via $gw2 table $t2
ip rule add prio 51 fwmark 2 table $t2
ip route flush cache

В таком состоянии пакеты ходят и все доступно, но балансировки нет.
Скрипт для балансировки такой:
IPT=/sbin/iptables
IPTS=/sbin/iptables-save
localnet="192.168.7.0/24"

#ip0 - local ip
ip0="192.168.7.100"

#ip1 ip2 - public ip
ip1="192.168.11.49"
ip2="192.168.55.50"

#net_addr
ip1_net="192.168.11.0/24"
ip2_net="192.168.55.0/24"

# На данном этапе разрешено всем все
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t mangle -F
$IPT -t mangle -F NEW_OUT_CONN
$IPT -t mangle -X NEW_OUT_CONN
$IPT -P OUTPUT ACCEPT
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT

# STATE RULES
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#Addition balance rules
$IPT -t mangle -N NEW_OUT_CONN
$IPT -t mangle -A NEW_OUT_CONN -m statistic --mode random --probability 0.40 -j RETURN
$IPT -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 2

$IPT -t mangle -A PREROUTING -d $ip1_net -j RETURN
$IPT -t mangle -A PREROUTING -d $ip2_net -j RETURN
$IPT -t mangle -A PREROUTING -s $ip1_net -m state --state new,related -j NEW_OUT_CONN
$IPT -t mangle -A PREROUTING -s $ip1_net -j CONNMARK --restore-mark
$IPT -t mangle -A PREROUTING -s $ip2_net -m state --state new,related -j NEW_OUT_CONN
$IPT -t mangle -A PREROUTING -s $ip2_net -j CONNMARK --restore-mark

$IPT -t mangle -A OUTPUT -d $ip1_net -j RETURN
$IPT -t mangle -A OUTPUT -d $ip2_net -j RETURN
$IPT -t mangle -A OUTPUT -s $ip1_net -m state --state new,related -j NEW_OUT_CONN
$IPT -t mangle -A OUTPUT -s $ip1_net -j CONNMARK --restore-mark
$IPT -t mangle -A OUTPUT -s $ip2_net -m state --state new,related -j NEW_OUT_CONN
$IPT -t mangle -A OUTPUT -s $ip2_net -j CONNMARK --restore-mark

Судя по статьям с open.net такая конфигурация должна работать с двумя сетевыми картами, направленными на провайдеров. У меня не работает если посылать запросы из eth0.
Если дальше указать $IPT -t nat -A POSTROUTING -o eth1 -j MASQUERADE , то все пакеты уходят на eth1 на шлюз по умолчанию.

Господа ГУРУ, подскажите, где я проврался, уже неделю мучаю гугл - не могу найти рабочего решения.


Содержание

Сообщения в этом обсуждении
"Проблема с балансировкой трафика: два провайдера - одна сетевая"
Отправлено AeXgRey , 29-Окт-10 00:08 
>[оверквотинг удален]
> $IPT -t mangle -A OUTPUT -s $ip2_net -m state --state new,related -j
> NEW_OUT_CONN
> $IPT -t mangle -A OUTPUT -s $ip2_net -j CONNMARK --restore-mark
> Судя по статьям с open.net такая конфигурация должна работать с двумя сетевыми
> картами, направленными на провайдеров. У меня не работает если посылать запросы
> из eth0.
> Если дальше указать $IPT -t nat -A POSTROUTING -o eth1 -j MASQUERADE
> , то все пакеты уходят на eth1 на шлюз по умолчанию.
> Господа ГУРУ, подскажите, где я проврался, уже неделю мучаю гугл - не
> могу найти рабочего решения.

странно...
второй скрипт от первого сильно отличеться... в нем нету комад ip route, ip rule... я бы сказал в нем нету балансировки


"Проблема с балансировкой трафика: два провайдера - одна сетевая"
Отправлено AMatvey , 29-Окт-10 11:32 
Первый скрипт - это rc.local собственно в нем все ip route, а вторая часть - это скрипт запускается в случае работоспособности обоих каналов.
Здесь http://forum.interzet.ru/index.php?s=e398af697907abe9c56c6f2... это сделано в виде одного скрипта, мне же нужно разнести на статическую часть и изменяемую.
Как я понял, сессии разносятся по каналам в цепочке NEW_OUT_CONN, и пакеты с меткой 2 должны отправляться к провайдеру 2, а не помеченные(с меткой 0) на шлюз по умолчанию т.е. к провайдеру 1.

"Проблема с балансировкой трафика: два провайдера - одна сетевая"
Отправлено AeXgRey , 29-Окт-10 13:04 
> Первый скрипт - это rc.local собственно в нем все ip route, а
> вторая часть - это скрипт запускается в случае работоспособности обоих каналов.
> Здесь http://forum.interzet.ru/index.php?s=e398af697907abe9c56c6f2...
> это сделано в виде одного скрипта, мне же нужно разнести на
> статическую часть и изменяемую.
> Как я понял, сессии разносятся по каналам в цепочке NEW_OUT_CONN, и пакеты
> с меткой 2 должны отправляться к провайдеру 2, а не помеченные(с
> меткой 0) на шлюз по умолчанию т.е. к провайдеру 1.

перечитайте ещё раз по ссылке
внимание уделите пункту: "3.3.3. Настраиваем дополнительные таблицы маршрутизиции 101 и 102 и направляем в них пакеты"

у вас правила ip ro/ru только для одного интерфейса..


"Проблема с балансировкой трафика: два провайдера - одна сетевая"
Отправлено AMatvey , 29-Окт-10 13:25 
> у вас правила ip ro/ru только для одного интерфейса..

На сколько я понял:
ip route add $net2 dev eth1 proto kernel scope link src $ip2 table $t2 - меняет отправителя пакета на $ip2
ip route add $net1 dev eth1 table $t2 - не понял зачем...
ip route add 127.0.0.0/8 dev lo table $t2 - пакеты из lo могут приходить в эту таблицу
ip route add default via $gw2 table $t2 - шлюз по умолчанию для пакетов из этой таблицы
ip rule add prio 51 fwmark 2 table $t2 - маркированные 2 пакеты попадают в таблицу $t2

Есть таблица main. в которую попадают пакеты с меткой 0 - там аналогичные правила, но другой шлюз по умолчанию. Для 2-х сетевых карт понятно, нужно прописывать правила, чтоб в качестве отправителя пакета стоял правильный ip и у каждой каты был свой шлюз по умолчанию. Зачем мне вторая таблица?


"Проблема с балансировкой трафика: два провайдера - одна сетевая"
Отправлено AeXgRey , 01-Ноя-10 15:09 
>[оверквотинг удален]
> могут приходить в эту таблицу
> ip route add default via $gw2 table $t2 - шлюз по умолчанию
> для пакетов из этой таблицы
> ip rule add prio 51 fwmark 2 table $t2 - маркированные 2
> пакеты попадают в таблицу $t2
> Есть таблица main. в которую попадают пакеты с меткой 0 - там
> аналогичные правила, но другой шлюз по умолчанию. Для 2-х сетевых карт
> понятно, нужно прописывать правила, чтоб в качестве отправителя пакета стоял правильный
> ip и у каждой каты был свой шлюз по умолчанию. Зачем
> мне вторая таблица?

http://www.sipring.ru/overview/linux/41-iproute-balance.html
думаю после прочтения этой статьи вопросов будет меньше...

была где-то на opennet`е... чё-то не нашёл...


"Проблема с балансировкой трафика: два провайдера - одна сетевая"
Отправлено AMatvey , 01-Ноя-10 17:58 
> http://www.sipring.ru/overview/linux/41-iproute-balance.html
> думаю после прочтения этой статьи вопросов будет меньше...

Эту статью я прочитал ДО того как написал на форум... не помогло...
Там описывается метод балансировки по пакетам, а мне нужен по сессиям.
Я никак не могу понять, зачем в моем случае, когда есть одна сетевая карта, глядящая в интернет иметь две дополнительные таблицы маршрутизации? Разве не достаточно твблицы main и одной дополнительной?


"Проблема с балансировкой трафика: два провайдера - одна сетевая"
Отправлено AeXgRey , 02-Ноя-10 09:10 
> Там описывается метод балансировки по пакетам, а мне нужен по сессиям.

мы одну и туже статью читаем:

    * ip route add default via $ip1-gw table isp1
    * ip route add default via $ip2-gw table isp2

С этого момента мы получаем возможность распределять пакеты по любому признаку (http, www,ftp или промаркировав по своему усмотрению с помощью iptables), и по любому направлению.

> Я никак не могу понять, зачем в моем случае, когда есть одна
> сетевая карта.

у вас написано, что сетевых интерфейсов 2. не важно сколько физически сетевых карт.


> Разве не достаточно твблицы main и одной дополнительной?

main - это такая же таблица.. пользуйся...

думаю проще разобраться в принципах работы на готовых примерах... а дальше можно делать что душе угодно. ИМХО


"Вопрос решился."
Отправлено AMatvey , 11-Ноя-10 14:37 
Нашел решение на http://ru.wikipedia.org/wiki/Iptables раздел 5.4.2 Критерии маркировки

Теперь у меня сервер раскидывает сессии по провайдерам, в том числе и squid.