п.с. В винде в свойствах подключения модема есть галочка "согласовывать подключения между модемами", которая балансирует загрузку каналов...
Вот что нашлось за сегодня
Код: Выделить всё
#!/bin/sh
################### CONFIG ############
FreeNet="/etc/routing/FreeNet.list"
### Home Network
l_eth=eth2
l_ip=192.168.5.1
l_net=192.168.5.0/24
########### Local ISP Network #########
li_net=10.0.0.0/8
########### ISP1 ######################
i1_eth=eth0
i1_ip=89.252.20.173
i1_net=89.252.20.0/24
i1_gw=89.252.20.1
########### ISP2 ######################
i2_eth=eth1
i2_ip=10.1.2.161
i2_net=10.0.0.0/16
i2_gw=10.1.0.1
#########ip route2 tables##############
t1=101
t2=102
#######################################
########### Flushing ##################
iptables -t mangle -F NEW_OUT_CONN
iptables -t mangle -F PREROUTING
iptables -t mangle -F OUTPUT
iptables -t mangle -X NEW_OUT_CONN
ip route flush table $t2
ip rule del table $t2
ip route flush table $t1
ip rule del table $t1
ip route flush cache
#######################################
iptables -t mangle -N NEW_OUT_CONN
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 1
iptables -t mangle -A NEW_OUT_CONN -m statistic --mode random --probability 0.50 -j RETURN
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 2
for file in $FreeNet; do
if [ -f "$file" ]; then
{ cat "$file"; echo; } | while read ip_addr; do
if [ "$ip_addr" != "" ]; then
echo "Статическая маршрутизация для $ip_addr"
iptables -t mangle -A NEW_OUT_CONN -d $ip_addr -j CONNMARK --set-mark 1
fi
done
fi
done
iptables -t mangle -A PREROUTING -d $l_net -j RETURN
iptables -t mangle -A PREROUTING -d $li_net -j RETURN
iptables -t mangle -A PREROUTING -s $l_net -m state --state new,related -j NEW_OUT_CONN
iptables -t mangle -A PREROUTING -s $l_net -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -d $l_net -j RETURN
iptables -t mangle -A OUTPUT -d $li_net -j RETURN
iptables -t mangle -A OUTPUT -s $l_net -m state --state new,related -j NEW_OUT_CONN
iptables -t mangle -A OUTPUT -s $li_net -j CONNMARK --restore-mark
ip route add $l_net dev $l_eth scope link table $t1
ip route add $i2_net dev $i2_eth scope link table $t1
ip route add $i1_net dev $i1_eth scope link src $i1_ip table $t1
ip route add 127.0.0.0/8 dev lo scope link table $t1
ip route add default via $i1_gw table $t1
ip rule add prio 51 fwmark 1 table $t1
ip rule add from $i1_ip table $t1
ip route add $l_net dev $l_eth scope link table $t2
ip route add $i1_net dev $i1_eth scope link table $t2
ip route add $i2_net dev $i2_eth scope link src $i2_ip table $t2
ip route add 127.0.0.0/8 dev lo scope link table $t2
ip route add default via $i2_gw table $t2
ip rule add prio 52 fwmark 2 table $t2
ip rule add from $i2_ip table $t2
ip route flush cache
2 канала по 100 Мбит от разных провайдеров дают 21,3Мб/сек что соответствует почти 200Мбитам.
Это решение исключает кучу проблем связанных с использованием netxhop, а также позволяет иметь статически роуты в случае необходимости.
решение рабочее вприницпе для любой линукс системы с версией iptables 1.3.8 и выше.
иначе придется поработать patch-o-maticи ещё нашлось
Код: Выделить всё
Как раздавать Интернет с двух каналов?
Просто спаять вместе четыре провода - слишком просто, чтобы быть правдой. Вот тут мы и имеем несколько реальных направлений для изысканий.
* Разделить поровну пользователей и использовать два сервера доступа. Но по каким критериям делить пользователей, и где гарантия, что пользователи одного канала не начнут интенсивно что-то скачивать из Интернета, в то время как пользователи второго канала вообще ничего не будут делать? Этот метод меня изначально не устраивал, и соответственно рассмотрен не будет.
* Попытаться собрать оба канала в одном сервере и, хотя бы приблизительно, сбалансировать нагрузку на них. Это, как мне кажеться, как раз то, что доктор прописал. Но и тут есть несколько вариантов решения. Самый простой, с помощью Iproute2, на данную тему в Интернете можно найти несколько вариантов решения. Немного сложнее будет сделать все это через Iptables, рассмотрим этот вариант более подробно.
Подготовка:
Для реализации этого коварного плана нам понадобиться немного поработать.
Нам нужно ядро версии Linux 2.6.14.2 которое можно найти на сайте http://kernel.org , Iptables v.1.3.4 и патчи из набора "patch-o-matic-ng" которые добавляют поддержку ROUTE, nth и random для Iptables. Патчи и iptables вы можете найти здесь http://www.netfilter.org/downloads.html#ftp Описывать процесс наложения патчей и сборки ядра я думаю нет необходимости.
Установки:
Итак начнем самое интерессное, но сначала определимся с тем, что имеем.
В силу сложившихся обстоятельств инетернет поступает на сервер с двух роутеров расстояние между которыми около 1км. Поэтому была выделена маленькая подсеть именно для транспортировки трафика на сервер. Конфигурация компьютера который все это обьединяет вместе.
* eth0 - интерфейс с адресом 192.168.1.1/24 (направленный во внутрь сети).
* eth1 - интерфейс с адресом 192.168.0.1/29 (направленный в транспортную подсеть).
* 192.168.0.2/29 и 192.168.0.3/29 - адреса шлюзов.
* 192.168.1.2/24 - адрес прокси сервера, который раздает инет пользователям.
Настройки Iptables
Создаем новую цепочку правил:
iptables -t mangle -N NEW_OUT_CONN
Загоняем все новые соединения в созданную цепочку:
iptables -t mangle -A FORWARD -i eth0 -o eth1 -m state --state NEW -j NEW_OUT_CONN
Далее указываем каким пакетам через какой шлюз уходить:
iptables -t mangle -A POSTROUTING -o eth1 -m connmark --mark 0 -j ROUTE
--gw 192.168.0.2 --continue
iptables -t mangle -A POSTROUTING -o eth1 -m connmark --mark 1 -j ROUTE
--gw 192.168.0.3 --continue
Ну и самое интерессное, маркировка пакетов с использованием NTH метода:
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 0
iptables -t mangle -A NEW_OUT_CONN -m nth --counter 1 --every 2 --packet 0 -j RETURN
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 1
iptables -t mangle -A NEW_OUT_CONN -m nth --counter 1 --every 2 --packet 1 -j RETURN
В завершении замаскируем уходящие пакеты и перекроем доступ всем кому ходить сюда не положено:
iptables -t nat -A POSTROUTING -s 192.168.1.2 -o eth+ -j SNAT --to-source 192.168.0.1
iptables -t nat -P POSTROUTING DROP
Вот так все работает у меня. Для общего развития приведу пример реализации метода RANDOM:
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 0
iptables -t mangle -A NEW_OUT_CONN -m random --average 50 -j RETURN
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 1
Я не утверждаю, что NTH единственно правильный метод, но меня он устраивает.
В конечном итоге вам решать каким вариантом удобнее пользоваться. Удачи.
Большая часть информации взята мной отсюда: http://tetro.net/misc/multilink.html Это не есть прямое руководство к действию, это только мое мнение и описание того, что работает у меня.
Статья взята с сайта OpenNet