Comments 106
\\ Тоесть через первый канал пойдет в два раза больше трафика, чем через первый.
Ошиблись.
Ошиблись.
У меня еще используются следующие правила (подглядел в каком-то мануале;). На любителя.
# Silently Drop Stealth Scans
# All of the bits are cleared
iptables -A INPUT -p icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
# Silently Drop Stealth Scans
# All of the bits are cleared
iptables -A INPUT -p icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
А зачем старый канал, если уже есть ADSL?
Потому что ADSL у нас для домашних пользователей — до 4 mbps download, а upload всего 512 kbps, а старый добрый беспроводный канал — симметричный, честные 2 mbps. К тому же постоянный реальный IP, чем я пользуюсь, чтобы хостить у себя на сервере пару страничек.
Как резервный.
АДСЛ «одного известного на Украине провайдера» имеет (при куче положительных моментов в виде цен, доступности почти в любой деревне и относительной стабильности) пару отрицательных моментов в духе «если уж упало в пятницу — до понедельника работать не будет», «если коннектишься вечером в час пик — можно по полчаса ждать выделения IP-адреса, потому как их не хватает» и т.д. Так что пусть будет.
В точку! :-)
Как всё запушено…
Ниразу не в точку )
Я уже год абонент этого провайдера и проблем с коннектом нет. Бывают моменты, когда что-то не работает… Не без этого!
Но чтобы все выходные не было инета или чтобы пол дня коннектиться — такого не было ниразу.
///
А по поводу поста — для домашнего пользователя доступна скорость до 8 мбит/с, а отдача — 1 мбит/с.
Я уже год абонент этого провайдера и проблем с коннектом нет. Бывают моменты, когда что-то не работает… Не без этого!
Но чтобы все выходные не было инета или чтобы пол дня коннектиться — такого не было ниразу.
///
А по поводу поста — для домашнего пользователя доступна скорость до 8 мбит/с, а отдача — 1 мбит/с.
Да, сорри, неучел недавнего изменения тарифных планов…
у нас, как минимум, два больших adsl провайдеров. вы про какой?
у меня в городе сельского типа как раз так и работает. При чем будешь звонить в понедельник ругаться типа все выходные небыло инета — они: щас работает? я: да. Они: так в чем проблема. Вот и все. После таких разговоров хочется побить им окна.
неделю линию поднять не могли. подняли. проработала 2,5 дня. сегодня опять упала. Трубку не берут(прячутся наверное).
Меня скоро с работы уволят
Меня скоро с работы уволят
У нас на Кавказе то же самое. Один раз они даже на Новый год нас без проводной связи оставили 10 дней. Общие проблемы… Как у классика — дураки и коммуникационные линии.
Он видимо шире
Резерв, да и видимо он тоже анлимитный — чтобы скорость была побыстрее чем на одном.
А теперь все тоже самое, но для Вендузятников. Кто поможет?
Можно поставить аппаратный девайс, из «подешевле» DLink выпускает. А можно поставить Linux-маршрутизатор на самом убитом железе перед Windows машиной для объединения каналов. У меня все это крутится на Celeron 300 MHz, 256 MB RAM
А если подключена витая пара, которую свич делит на три канала ( 13 + 2х5 мегабит, 3 статики внешних) оно работать будет?
Думаю нет, объеденить три канала свичем не получится, желательно иметь три сетевых карты, куда это все будет воткнуто. Хотя… может какими извращениями может удастся и с одной сетевухой.
Неуправляемый свич не умеет маршрутизировать, соотв. ничего «делить» он не будет :)
Нужен маршрутизатор либо управляемый коммутатор (с VLAN-ами и load balancing-ом).
Нужен маршрутизатор либо управляемый коммутатор (с VLAN-ами и load balancing-ом).
имеете виду Вланы? Тогда работать будет как описано в статье.
Пользовался ASUS RX3042H для этих целей. Балансировка, failover все работает отлично. Стоит 4000р
Kerio WinRoute Firewall не ниже 6.5
Правильный ответ был третий — BGP
чем поможет BGP без создания AS?
Private AS?
а подробнее?
Private AS они ж для роутинга в рамках одного провайдера. Интернет о них ничо не знает
Private AS они ж для роутинга в рамках одного провайдера. Интернет о них ничо не знает
можно использовать провайдеров чисто как транспорт до хоста в инете, можно попросить провайдеров согласовать эту AS, можно попросить провайдера одолжить реальную AS, можно самому приобрести AS, можно еще кучу возможностей изыскать, было бы желание.
Как это может произойти?
Мне кажется что мало внедрения BGP у клиентов с двумя каналами, т.к. это как правило не требуется малому и среднему бизнесам, а не по каким-то иным техническим причинам. Как правило все ISP идут навстречу.
Мне кажется что мало внедрения BGP у клиентов с двумя каналами, т.к. это как правило не требуется малому и среднему бизнесам, а не по каким-то иным техническим причинам. Как правило все ISP идут навстречу.
Вы еще сперва с провайдерами договоритесь. Которые априори предоставляют услуги для физических лиц, подразумевая при этом традиционный home use. По крайней мере у нас так.
>> Тоесть через первый канал пойдет в два раза больше трафика,
в два раза больше tcp-сессий
в два раза больше tcp-сессий
для балансировки честно скажу — жутко кривое решение с огромной кучей невразумительных последствий. И сессии в http — далеко не единственная проблема. btw wtf with UDP?
Предложите более кошерное, будет интересно послушать. Да, варианты «купить...» или «зарегистрировать..» и пр. прошу не предлогать — рассматривается домашняя сеть.
Да, та часть с одновременной работой двух каналов нежизнеспособна. Проверено и не раз.
Пинг до шлюза — то еще приближение.
А про UDP — просто, один влево, два вправа, и не «важно», что у них src будет разный. %)
Пинг до шлюза — то еще приближение.
А про UDP — просто, один влево, два вправа, и не «важно», что у них src будет разный. %)
угу, а это большинство voip как минимум
игрушки еще там всякие
эм… я тут посмотрел еще раз — соединения(tcp) не отслеживаются, мне кажется будет следующее:
>> SYN (src A)
<< SYN+ACK (dst A)
>> ACK (src B)
<< RST (dst A)
т.е. в пределах сессии пакеты будут отпускаться с разных источников.
>> SYN (src A)
<< SYN+ACK (dst A)
>> ACK (src B)
<< RST (dst A)
т.е. в пределах сессии пакеты будут отпускаться с разных источников.
решение о том, через какой канал пойдет пакет принимается на уровне маршрутизации. и без разницы, какой протокол — TCP или UDP — все пакеты к одному хосту пойдут через тот же канал
какое дело маршрутизации в данном случае до TCP? У маршрутизации есть пакет, который нужно взять с одного(в данном случае) интерфейса и поставить на другой, причем вы абсолютно однозначно ставите веса, что определяет какой пакет(по факту прибытия) куда пойдет.
для объединения каналов тут используется multipath routing — тоесть пакет к серверу A пойдет через один интерфейс, а к серверу B через другой. Через какой интерфейс пойдет пакет к серверу определяется случайно, с учетом весов, и маршрут кешируется, тоесть все последющие пакеты к серверу А идут через тот же интерфейс
да, теперь понятно, по сути просто ip route weight. но тогда какой смысл в такой балансировке, просто некая автоматическая случайная разброска путей маршрутизации. Это же нельзя назвать балансировкой.
маршрут скешируется и для двух интерфейсов, так ведь?
там короче так, приходит ip пакет, роутер смотри на dst, не находит в кеш-таблице такой, и с условием веса кидает на тот или иной интерфейс и отправляет, а dst записывает в кеш, и поэтому все последующие пакеты с 1 белым хостом будут роутится через один gw, пока запись в кеше не протухнет.
Т.е. вся процедура проходит не выше сетевого уровня.
Т.е. вся процедура проходит не выше сетевого уровня.
Надо в очередной раз затестить, посмотреть. Оно работало, но с маркированием пакетов.
не, тут другое, пакеты не маркируются.
роутер просто помнит что куда отправлял
роутер просто помнит что куда отправлял
вот тут патчи автора для ip route weight
www.ssi.bg/~ja/#routes
www.ssi.bg/~ja/#routes
С статье скорее всего это «опущено», по дефолту в iptables стоит пропускать established, просто забыли об этом упомянуть :)
Есть еще готовая сборка — Endian Firewall, позволяет это сделать. И многое другое. Очень хорошая штука, мы в студии ее используем.
А как такое на винде провернуть?
актуальный вопрос для тех не очень близко знаком с изнанкой TCP/IP
Kerio WinRoute Firewall не ниже 6.5 — выше было
дешево(бесплатно) но сердито — 3proxy ( 3proxy.ru/howtor.asp#ROUNDROBIN )
Большое спасибо. Не сколько за решение, сколько за идею. У нас несколько иная специфика, но ход мысли уловил.
Немного не в тему, но:
Есть ли возможность для win машины, объеденить два wifi соединения в один? (скорость хочется увеличить, в квартире два wifi роутера, с разными провайдерами)
Есть ли возможность для win машины, объеденить два wifi соединения в один? (скорость хочется увеличить, в квартире два wifi роутера, с разными провайдерами)
Маршрутизатор — дорого, но можно заменить на OpenBSD + OpenBGPD.
AS — public-as вам не дадут в RIPE. Сейчас зарегистрировать систему и получить адресное пространство не просто, а для сетей с планируемым числом адресов менее 512 на практике — практически не возможно.
Пиринг с вами ни один серьезный оператор не подпишет, зачем ему это? Телекомы ничего не делают просто так.
AS — public-as вам не дадут в RIPE. Сейчас зарегистрировать систему и получить адресное пространство не просто, а для сетей с планируемым числом адресов менее 512 на практике — практически не возможно.
Пиринг с вами ни один серьезный оператор не подпишет, зачем ему это? Телекомы ничего не делают просто так.
>>по обеим каналам
по обоим каналам
по обоим каналам
спасибо, добавил в мемориз=)
Уважаемый, а не подскажите как сделать подобную, но чуть другую вещь.
Есть серевер под Linux с двумя белыми IP-адресами. Один — основной для этой машины
К нему через VPN цепляется машина, которая получает серый адрес (или как вариант второй белый адрес).
Далее необходимо все запросы в инет от этой машины NAT-ить на айпишник сервера, но в то же время, все запросы, пришедшие на второй айпишник натить на эту, подключенную через VPN машинку, и чтобы на коннекты, установленные со второго белого айпишника к ней, она отвечала через него же, а не через NAT.
Сижу и думаю… в ядре вроде все есть… conntrack, чтобы отслеживать коннекты, множественные таблицы маршрутизации чтобы гибко рулить коннектами… а вот какими командами заставить сервер делать то, что мне нужно — не знаю.
Есть серевер под Linux с двумя белыми IP-адресами. Один — основной для этой машины
К нему через VPN цепляется машина, которая получает серый адрес (или как вариант второй белый адрес).
Далее необходимо все запросы в инет от этой машины NAT-ить на айпишник сервера, но в то же время, все запросы, пришедшие на второй айпишник натить на эту, подключенную через VPN машинку, и чтобы на коннекты, установленные со второго белого айпишника к ней, она отвечала через него же, а не через NAT.
Сижу и думаю… в ядре вроде все есть… conntrack, чтобы отслеживать коннекты, множественные таблицы маршрутизации чтобы гибко рулить коннектами… а вот какими командами заставить сервер делать то, что мне нужно — не знаю.
метить пакеты fwmark, и на основе меток в iproute 2 пускать на разные таблицы
У меня когда возникла необходимость на одном из iface's делать нат один в один нескольких адресов iptables перестал пускать пакеты по правилам
iptables -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A bad_tcp_packets -p tcp! --syn -m state --state NEW -j DROP
Оказалось, что conntrack в данном случае не совсем корректно работал :)
В случае попытки установить соединение с 80.93.57.207 получал следующее:
tcp 6 119 SYN_SENT src=80.93.57.207 dst=10.9.8.203 sport=80 dport=2088 [UNREPLIED] src=10.9.8.203 dst=80.93.57.207 sport=2088 dport=80 use=1
tcp 6 119 SYN_SENT src=192.168.168.203 dst=80.93.57.207 sport=2088 dport=80 [UNREPLIED] src=80.93.57.207 dst=192.168.168.203 sport=80 dport=2088 use=1
С тех пор недоверие есть к iproute2 ;)
Но статья таки полезна :)
iptables -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A bad_tcp_packets -p tcp! --syn -m state --state NEW -j DROP
Оказалось, что conntrack в данном случае не совсем корректно работал :)
В случае попытки установить соединение с 80.93.57.207 получал следующее:
tcp 6 119 SYN_SENT src=80.93.57.207 dst=10.9.8.203 sport=80 dport=2088 [UNREPLIED] src=10.9.8.203 dst=80.93.57.207 sport=2088 dport=80 use=1
tcp 6 119 SYN_SENT src=192.168.168.203 dst=80.93.57.207 sport=2088 dport=80 [UNREPLIED] src=80.93.57.207 dst=192.168.168.203 sport=80 dport=2088 use=1
С тех пор недоверие есть к iproute2 ;)
Но статья таки полезна :)
Только мне кажется что никаого объединения двух каналов тут не нарисовано
я понимаю что железный вариан решения не спортивен — но может кому нить пригодится? 8))
DI-LB604 Маршрутизатор Express EtherNetwork 4-х портовый c функцией распределения нагрузки — Цена: 3532.29 руб.
зы — если гуглить на «распределение нагрузки» можно найти и за 50 баксов железку
я понимаю что железный вариан решения не спортивен — но может кому нить пригодится? 8))
DI-LB604 Маршрутизатор Express EtherNetwork 4-х портовый c функцией распределения нагрузки — Цена: 3532.29 руб.
зы — если гуглить на «распределение нагрузки» можно найти и за 50 баксов железку
Понятно, что можно заплатить N баксов и купить железку для чего угодно…
Для тех, кто не верит — вот картинка

Вверху два объединяемях канала (2 и 1 mbps), внизу — график загрузки общего совместного канала (с разбивкой по классам HTB). Как видно загрузка достигает почти 3 mbps
Для тех, кто не верит — вот картинка

Вверху два объединяемях канала (2 и 1 mbps), внизу — график загрузки общего совместного канала (с разбивкой по классам HTB). Как видно загрузка достигает почти 3 mbps
я не о том работают ли оба канала — 8)
запустите на скачивание по http файл побольше — уроните один канал — потом поднимите — уроните второй
если всё «без разрывов» вы в шоколаде
8)
запустите на скачивание по http файл побольше — уроните один канал — потом поднимите — уроните второй
если всё «без разрывов» вы в шоколаде
8)
мм а что за плагин ггенерировал нижный график… хотелось бы его у себя тоже поднять
Плагин собственной разработки, визуализирует разбиений трафика на классы шейпера, про него, а так же про шейпинг в линукс планирую в скором времени статью тоже написать
а пока этот плагин можно скачать с сайта munin
а пока этот плагин можно скачать с сайта munin
Спасибо. У нас в офисе adsl падал постоянно, точнее само ppp соединение, приходилось ifdown; ifup делать, скорее всего из-за китайского модема. Я давно хотел написать скрипт, который сам бы поднимал канал при падении, но всё руки не доходили, да и bash я не так хорошо знаю. В общем спасибо вам за скрипт check.sh.
Поделюсь своим скриптом. Проверка каналов, на 3 прова. Писалось оч. давно, для тех-же целей.
Основная мысль — пинг 3-х популярных сайтов через шлюзы прова. если потери больше % — канал мертв,- запускаем скрипт переключения.
(сам скрипт есть, но стыдно показывать)
Выкладываю, чтоб умные люди взяли полезные куски и довели до ума )
Если кому интересно — пишите.
#!/bin/sh
PATH="/bin:/sbin:/usr/bin"
# Говорить вместо делать
DEBUG=«0»
# Отчитываться о действиях
REPORT=«0»
# какие хосты пинговать
HOSTS_UP='www.ukr.net www.ya.ru google.ua'
# параметр вызова скрипта переключения, если все ок.
NORM_PROV=multiway
# наш адресс, наш шлюз, хост прова за шлюзом (DNS например) и имя прова (параметр для вызова скрипта)
IP1=«192.168.0.2»
GW1=«192.168.0.1»
H1=«192.168.1.1»
ISP1_name=LOCALNET
DEV1=eth2
#IP2=""
#GW2=""
#H2=""
#ISP2_name=comcom
#DEV2=eth3
#IP3=""
#GW3=""
#H3=""
#ISP3_name=spacegate
#DEV3=pentanet0
# Пингуем 10 раз, если больше 3 потери — плохой канал
PING_COUNT=10
PING_MAX_LOSS=3
PING_OPT="-c$PING_COUNT -s5 -W5 -i1 "
LOGTO="/var/log/switch.log"
dt=`date +"%h %d %X "`
norm=0
prov=`ip rule show | grep «30000» | awk '{print $5}'`
[ $DEBUG = «1» ] && echo «Prov now — $prov»
if [ ${prov} = ${NORM_PROV} ]; then
ISP1_route=0
ISP2_route=0
ISP3_route=0
[ $DEBUG = «1» ] && echo «Route string — `ip route show table $NORM_PROV | grep „dev“ | awk '{print $3}'`»
for def_r in `ip route show table $NORM_PROV | grep «dev» | awk '{print $3}'`; do
[ $DEBUG = «1» ] && echo «Route — $def_r»
if [ ${def_r} = ${GW1} ]; then
ISP1_route=1
[ $DEBUG = «1» ] && echo «Route via curently $ISP1_name on»
fi
if [ ${def_r} = ${GW2} ]; then
ISP2_route=1
[ $DEBUG = «1» ] && echo «Route via curently $ISP2_name on»
fi
if [ ${def_r} = ${GW3} ]; then
ISP3_route=1
[ $DEBUG = «1» ] && echo «Route via curently $ISP3_name on»
fi
done
route_now="${ISP1_route}-${ISP2_route}-${ISP3_route}"
[ $DEBUG = «1» ] && echo «Routes ON $ISP1_name=$ISP1_route; $ISP2_name=$ISP2_route; $ISP3_name=$ISP3_route;»
fi
ISP1_stat=0
ISP2_stat=0
ISP3_stat=0
### Ping ISP1
for HOST_UP in $HOSTS_UP; do
[ $DEBUG = «1» ] && echo «Executing: ping $PING_OPT -I $IP1 $HOST_UP»
status1=`ping $PING_OPT -I $IP1 $HOST_UP | grep «packet loss»| awk '{print $1-$4}'`
if [ $status1 -lt $PING_MAX_LOSS ]; then
# ISP1 works
ISP1_stat=1
[ $DEBUG = «1» ] && echo "$ISP1_name ok, PacketLoss = $status1"
else
# ISP1_stat=0
if [ ${LOGTO} != 0 ]; then
echo ${dt} "${H1} via ${GW1} — ${status1} packet lost of ${PING_COUNT}" >> ${LOGTO}
fi
[ $DEBUG = «1» ] && echo "$ISP1_name NOT ok, PacketLoss = $status1 of ${PING_COUNT}"
fi
### Ping ISP2
[ $DEBUG = «1» ] && echo «Executing: ping $PING_OPT -I $IP2 $HOST_UP»
status2=`ping $PING_OPT -I $IP2 $HOST_UP | grep «packet loss»| awk '{print $1-$4}'`
if [ $status2 -lt $PING_MAX_LOSS ]; then
# ISP2 works
ISP2_stat=1
[ $DEBUG = «1» ] && echo "$ISP2_name ok, PacketLoss = $status2"
else
# ISP2_stat=0
if [ ${LOGTO} != 0 ]; then
echo ${dt} "${H2} via ${GW2} — ${status2} packet lost of ${PING_COUNT}" >> ${LOGTO}
fi
[ $DEBUG = «1» ] && echo "$ISP2_name NOT ok, PacketLoss = $status2 of ${PING_COUNT}"
fi
### Ping ISP3
[ $DEBUG = «1» ] && echo «Executing: ping $PING_OPT -I $IP3 $HOST_UP»
status3=`ping $PING_OPT -I $IP3 $HOST_UP | grep «packet loss»| awk '{print $1-$4}'`
if [ $status3 -lt $PING_MAX_LOSS ]; then
# ISP3 works
ISP3_stat=1
[ $DEBUG = «1» ] && echo "$ISP3_name ok, PacketLoss = $status3"
else
ISP3_stat=0
if [ ${LOGTO} != 0 ]; then
echo ${dt} "${H3} via ${GW3} — ${status3} packet lost of ${PING_COUNT}" >> ${LOGTO}
fi
[ $DEBUG = «1» ] && echo "$ISP3_name NOT ok, PacketLoss = $status3 of ${PING_COUNT}"
fi
done
#########
[ $DEBUG = «1» ] && echo «stat1 ${ISP1_stat}; stat2 ${ISP2_stat}; stat3 ${ISP3_stat}»
[ $DEBUG = «1» ] && echo «route1 $ISP1_route; route2 $ISP2_route; route3 $ISP3_route;»
########### Now, make decision for routing.
case "${ISP1_stat}" in
1)
[ $DEBUG = «1» ] && echo «1»
if [[ ${route_now} != «1-0-0» ]]; then
[ $REPORT = «1» ] && echo "$dt ALL became ALIVE..."
[ $DEBUG = «1» ] || /wrk/route.sh norm
# [ $DEBUG = «1» ] || ip ro flush cache
# [ $DEBUG = «1» ] || /wrk/sat softrestart
[ $DEBUG = «1» ] && echo «Default NORM»
else
[ $DEBUG = «1» ] && echo «Already OK»
fi;
;;
0)
[ $DEBUG = «1» ] && echo «0»
if [[ ${route_now} != «0-0-1» ]]; then
[ $REPORT = «1» ] && echo "$dt $ISP1_name died, turning off."
[ $DEBUG = «1» ] || /wrk/route.sh itl
[ $DEBUG = «1» ] || ip ro flush cache
# [ $DEBUG = «1» ] || /wrk/sat softrestart
[ $DEBUG = «1» ] && echo «Default via $ISP2_name & $ISP3_name»
else
[ $DEBUG = «1» ] && echo «Already default route via $ISP2_name & $ISP3_name. Nothing changes.»
fi;
;;
*)
[ $REPORT = «1» ] && echo «Route Restart.»
[ $DEBUG = «1» ] || /wrk/route.sh restart &
exit 1
esac
#if [ ${ISP1_stat} -eq 1 -a ${ISP2_stat} -eq 0 ]; then
#if [ ${ISP3_stat} -eq 1 ]; then
# echo "$ISP3_name suck"
# /wrk/sat restart
#fi
exit 0
Основная мысль — пинг 3-х популярных сайтов через шлюзы прова. если потери больше % — канал мертв,- запускаем скрипт переключения.
(сам скрипт есть, но стыдно показывать)
Выкладываю, чтоб умные люди взяли полезные куски и довели до ума )
Если кому интересно — пишите.
#!/bin/sh
PATH="/bin:/sbin:/usr/bin"
# Говорить вместо делать
DEBUG=«0»
# Отчитываться о действиях
REPORT=«0»
# какие хосты пинговать
HOSTS_UP='www.ukr.net www.ya.ru google.ua'
# параметр вызова скрипта переключения, если все ок.
NORM_PROV=multiway
# наш адресс, наш шлюз, хост прова за шлюзом (DNS например) и имя прова (параметр для вызова скрипта)
IP1=«192.168.0.2»
GW1=«192.168.0.1»
H1=«192.168.1.1»
ISP1_name=LOCALNET
DEV1=eth2
#IP2=""
#GW2=""
#H2=""
#ISP2_name=comcom
#DEV2=eth3
#IP3=""
#GW3=""
#H3=""
#ISP3_name=spacegate
#DEV3=pentanet0
# Пингуем 10 раз, если больше 3 потери — плохой канал
PING_COUNT=10
PING_MAX_LOSS=3
PING_OPT="-c$PING_COUNT -s5 -W5 -i1 "
LOGTO="/var/log/switch.log"
dt=`date +"%h %d %X "`
norm=0
prov=`ip rule show | grep «30000» | awk '{print $5}'`
[ $DEBUG = «1» ] && echo «Prov now — $prov»
if [ ${prov} = ${NORM_PROV} ]; then
ISP1_route=0
ISP2_route=0
ISP3_route=0
[ $DEBUG = «1» ] && echo «Route string — `ip route show table $NORM_PROV | grep „dev“ | awk '{print $3}'`»
for def_r in `ip route show table $NORM_PROV | grep «dev» | awk '{print $3}'`; do
[ $DEBUG = «1» ] && echo «Route — $def_r»
if [ ${def_r} = ${GW1} ]; then
ISP1_route=1
[ $DEBUG = «1» ] && echo «Route via curently $ISP1_name on»
fi
if [ ${def_r} = ${GW2} ]; then
ISP2_route=1
[ $DEBUG = «1» ] && echo «Route via curently $ISP2_name on»
fi
if [ ${def_r} = ${GW3} ]; then
ISP3_route=1
[ $DEBUG = «1» ] && echo «Route via curently $ISP3_name on»
fi
done
route_now="${ISP1_route}-${ISP2_route}-${ISP3_route}"
[ $DEBUG = «1» ] && echo «Routes ON $ISP1_name=$ISP1_route; $ISP2_name=$ISP2_route; $ISP3_name=$ISP3_route;»
fi
ISP1_stat=0
ISP2_stat=0
ISP3_stat=0
### Ping ISP1
for HOST_UP in $HOSTS_UP; do
[ $DEBUG = «1» ] && echo «Executing: ping $PING_OPT -I $IP1 $HOST_UP»
status1=`ping $PING_OPT -I $IP1 $HOST_UP | grep «packet loss»| awk '{print $1-$4}'`
if [ $status1 -lt $PING_MAX_LOSS ]; then
# ISP1 works
ISP1_stat=1
[ $DEBUG = «1» ] && echo "$ISP1_name ok, PacketLoss = $status1"
else
# ISP1_stat=0
if [ ${LOGTO} != 0 ]; then
echo ${dt} "${H1} via ${GW1} — ${status1} packet lost of ${PING_COUNT}" >> ${LOGTO}
fi
[ $DEBUG = «1» ] && echo "$ISP1_name NOT ok, PacketLoss = $status1 of ${PING_COUNT}"
fi
### Ping ISP2
[ $DEBUG = «1» ] && echo «Executing: ping $PING_OPT -I $IP2 $HOST_UP»
status2=`ping $PING_OPT -I $IP2 $HOST_UP | grep «packet loss»| awk '{print $1-$4}'`
if [ $status2 -lt $PING_MAX_LOSS ]; then
# ISP2 works
ISP2_stat=1
[ $DEBUG = «1» ] && echo "$ISP2_name ok, PacketLoss = $status2"
else
# ISP2_stat=0
if [ ${LOGTO} != 0 ]; then
echo ${dt} "${H2} via ${GW2} — ${status2} packet lost of ${PING_COUNT}" >> ${LOGTO}
fi
[ $DEBUG = «1» ] && echo "$ISP2_name NOT ok, PacketLoss = $status2 of ${PING_COUNT}"
fi
### Ping ISP3
[ $DEBUG = «1» ] && echo «Executing: ping $PING_OPT -I $IP3 $HOST_UP»
status3=`ping $PING_OPT -I $IP3 $HOST_UP | grep «packet loss»| awk '{print $1-$4}'`
if [ $status3 -lt $PING_MAX_LOSS ]; then
# ISP3 works
ISP3_stat=1
[ $DEBUG = «1» ] && echo "$ISP3_name ok, PacketLoss = $status3"
else
ISP3_stat=0
if [ ${LOGTO} != 0 ]; then
echo ${dt} "${H3} via ${GW3} — ${status3} packet lost of ${PING_COUNT}" >> ${LOGTO}
fi
[ $DEBUG = «1» ] && echo "$ISP3_name NOT ok, PacketLoss = $status3 of ${PING_COUNT}"
fi
done
#########
[ $DEBUG = «1» ] && echo «stat1 ${ISP1_stat}; stat2 ${ISP2_stat}; stat3 ${ISP3_stat}»
[ $DEBUG = «1» ] && echo «route1 $ISP1_route; route2 $ISP2_route; route3 $ISP3_route;»
########### Now, make decision for routing.
case "${ISP1_stat}" in
1)
[ $DEBUG = «1» ] && echo «1»
if [[ ${route_now} != «1-0-0» ]]; then
[ $REPORT = «1» ] && echo "$dt ALL became ALIVE..."
[ $DEBUG = «1» ] || /wrk/route.sh norm
# [ $DEBUG = «1» ] || ip ro flush cache
# [ $DEBUG = «1» ] || /wrk/sat softrestart
[ $DEBUG = «1» ] && echo «Default NORM»
else
[ $DEBUG = «1» ] && echo «Already OK»
fi;
;;
0)
[ $DEBUG = «1» ] && echo «0»
if [[ ${route_now} != «0-0-1» ]]; then
[ $REPORT = «1» ] && echo "$dt $ISP1_name died, turning off."
[ $DEBUG = «1» ] || /wrk/route.sh itl
[ $DEBUG = «1» ] || ip ro flush cache
# [ $DEBUG = «1» ] || /wrk/sat softrestart
[ $DEBUG = «1» ] && echo «Default via $ISP2_name & $ISP3_name»
else
[ $DEBUG = «1» ] && echo «Already default route via $ISP2_name & $ISP3_name. Nothing changes.»
fi;
;;
*)
[ $REPORT = «1» ] && echo «Route Restart.»
[ $DEBUG = «1» ] || /wrk/route.sh restart &
exit 1
esac
#if [ ${ISP1_stat} -eq 1 -a ${ISP2_stat} -eq 0 ]; then
#if [ ${ISP3_stat} -eq 1 ]; then
# echo "$ISP3_name suck"
# /wrk/sat restart
#fi
exit 0
Огромное спасибо за мануал, поднял у себя двух PPPoE провайдеров описанным способом. Всё работает, но возникла беда с автостартом всей этой системы.
Добавил в crontab для рута:
После загрузки системы проверяю и вижу:
И интернет на самой машине есть (и на IF1, и на IF2 — всё хорошо), но на IF0 — не раздаётся.
Но стоит мне сделать руками в консоли то, что, казалось бы, уже сделал cron:
И я сначала вижу такое сообщение:
А дальше начинается уже вывод скрипта («Both channels» и пр.) и, что самое главное, на IF0 появляется интернет.
Предположил, что скрипт выполняется слишком «рано» (маскарадить ещё нечего в момент его выполнения), поставил такое в кронтабе:
И перезапустил машину почти ровно в 23 часа. Вывод перенаправил в файл.
Глянул в 23:10 — в лог скрипт писать начал вовремя, т.е. запустился скрипт своевременно, но интернет не раздаётся. После запуска руками в консоли — всё снова ок.
Подскажите, пожалуйста, в чём магия? А в идеале подскажите правильный способ того, как стартовать всё это хозяйство при загрузке и автоматически перезапускать, если скрипт вдруг когда-то помрёт.
Добавил в crontab для рута:
@reboot /etc/balance/check.sh
После загрузки системы проверяю и вижу:
# ps ax | grep che
1261 ? Ss 0:00 /bin/sh -c /etc/balance/check.sh
1262 ? S 0:00 /bin/bash /etc/balance/check.sh
И интернет на самой машине есть (и на IF1, и на IF2 — всё хорошо), но на IF0 — не раздаётся.
Но стоит мне сделать руками в консоли то, что, казалось бы, уже сделал cron:
# /etc/balance/check.sh
И я сначала вижу такое сообщение:
RTNETLINK answers: File exists
А дальше начинается уже вывод скрипта («Both channels» и пр.) и, что самое главное, на IF0 появляется интернет.
Предположил, что скрипт выполняется слишком «рано» (маскарадить ещё нечего в момент его выполнения), поставил такое в кронтабе:
5 23 * * * /etc/balance/check.sh
И перезапустил машину почти ровно в 23 часа. Вывод перенаправил в файл.
Глянул в 23:10 — в лог скрипт писать начал вовремя, т.е. запустился скрипт своевременно, но интернет не раздаётся. После запуска руками в консоли — всё снова ок.
Подскажите, пожалуйста, в чём магия? А в идеале подскажите правильный способ того, как стартовать всё это хозяйство при загрузке и автоматически перезапускать, если скрипт вдруг когда-то помрёт.
Есть еще способ с помощью стандартных средств без скриптов — Ubuntu Bonding.
Пытался найти подробную информацию про бонинг, так и не понял, будет ли оно работать если две линки от двух разных провайдеров, с разными IP, шлюзами и тд. Вы его на практике использовали? Расскажите подробнее ваши впечатления пожалуйста
Bonding для увеличения пропускной способности а не для объединения разных ip. Тоесть если гигабитная сетевуха не справляется с потоком, ставим вторую и делаем bonding, будет 2 гигабитный канал, у обеих сетевух будет один и тотже ip.
У этого метода есть большая проблема при настройках по умолчанию. Описал ее тут habrahabr.ru/post/267339
Отличный пост. Попробую сделать подобное на FreeBSD.
Sign up to leave a comment.
Объединение пропускной способности двух интернет каналов и простая отказоустойчивость