Комментарии 106
\\ Тоесть через первый канал пойдет в два раза больше трафика, чем через первый.
Ошиблись.
Ошиблись.
+2
У меня еще используются следующие правила (подглядел в каком-то мануале;). На любителя.
# 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
0
А зачем старый канал, если уже есть ADSL?
0
Потому что ADSL у нас для домашних пользователей — до 4 mbps download, а upload всего 512 kbps, а старый добрый беспроводный канал — симметричный, честные 2 mbps. К тому же постоянный реальный IP, чем я пользуюсь, чтобы хостить у себя на сервере пару страничек.
0
Как резервный.
0
АДСЛ «одного известного на Украине провайдера» имеет (при куче положительных моментов в виде цен, доступности почти в любой деревне и относительной стабильности) пару отрицательных моментов в духе «если уж упало в пятницу — до понедельника работать не будет», «если коннектишься вечером в час пик — можно по полчаса ждать выделения IP-адреса, потому как их не хватает» и т.д. Так что пусть будет.
+5
В точку! :-)
+1
Как всё запушено…
0
Ниразу не в точку )
Я уже год абонент этого провайдера и проблем с коннектом нет. Бывают моменты, когда что-то не работает… Не без этого!
Но чтобы все выходные не было инета или чтобы пол дня коннектиться — такого не было ниразу.
///
А по поводу поста — для домашнего пользователя доступна скорость до 8 мбит/с, а отдача — 1 мбит/с.
Я уже год абонент этого провайдера и проблем с коннектом нет. Бывают моменты, когда что-то не работает… Не без этого!
Но чтобы все выходные не было инета или чтобы пол дня коннектиться — такого не было ниразу.
///
А по поводу поста — для домашнего пользователя доступна скорость до 8 мбит/с, а отдача — 1 мбит/с.
-4
Да, сорри, неучел недавнего изменения тарифных планов…
0
у нас, как минимум, два больших adsl провайдеров. вы про какой?
0
у меня в городе сельского типа как раз так и работает. При чем будешь звонить в понедельник ругаться типа все выходные небыло инета — они: щас работает? я: да. Они: так в чем проблема. Вот и все. После таких разговоров хочется побить им окна.
+1
неделю линию поднять не могли. подняли. проработала 2,5 дня. сегодня опять упала. Трубку не берут(прячутся наверное).
Меня скоро с работы уволят
Меня скоро с работы уволят
0
У нас на Кавказе то же самое. Один раз они даже на Новый год нас без проводной связи оставили 10 дней. Общие проблемы… Как у классика — дураки и коммуникационные линии.
0
Он видимо шире
0
Резерв, да и видимо он тоже анлимитный — чтобы скорость была побыстрее чем на одном.
0
А теперь все тоже самое, но для Вендузятников. Кто поможет?
-1
Можно поставить аппаратный девайс, из «подешевле» DLink выпускает. А можно поставить Linux-маршрутизатор на самом убитом железе перед Windows машиной для объединения каналов. У меня все это крутится на Celeron 300 MHz, 256 MB RAM
+1
А если подключена витая пара, которую свич делит на три канала ( 13 + 2х5 мегабит, 3 статики внешних) оно работать будет?
0
Думаю нет, объеденить три канала свичем не получится, желательно иметь три сетевых карты, куда это все будет воткнуто. Хотя… может какими извращениями может удастся и с одной сетевухой.
0
Неуправляемый свич не умеет маршрутизировать, соотв. ничего «делить» он не будет :)
Нужен маршрутизатор либо управляемый коммутатор (с VLAN-ами и load balancing-ом).
Нужен маршрутизатор либо управляемый коммутатор (с VLAN-ами и load balancing-ом).
+1
имеете виду Вланы? Тогда работать будет как описано в статье.
0
Пользовался ASUS RX3042H для этих целей. Балансировка, failover все работает отлично. Стоит 4000р
0
НЛО прилетело и опубликовало эту надпись здесь
Kerio WinRoute Firewall не ниже 6.5
+1
Правильный ответ был третий — BGP
+1
чем поможет BGP без создания AS?
+1
Private AS?
0
а подробнее?
Private AS они ж для роутинга в рамках одного провайдера. Интернет о них ничо не знает
Private AS они ж для роутинга в рамках одного провайдера. Интернет о них ничо не знает
0
можно использовать провайдеров чисто как транспорт до хоста в инете, можно попросить провайдеров согласовать эту AS, можно попросить провайдера одолжить реальную AS, можно самому приобрести AS, можно еще кучу возможностей изыскать, было бы желание.
0
НЛО прилетело и опубликовало эту надпись здесь
Как это может произойти?
Мне кажется что мало внедрения BGP у клиентов с двумя каналами, т.к. это как правило не требуется малому и среднему бизнесам, а не по каким-то иным техническим причинам. Как правило все ISP идут навстречу.
Мне кажется что мало внедрения BGP у клиентов с двумя каналами, т.к. это как правило не требуется малому и среднему бизнесам, а не по каким-то иным техническим причинам. Как правило все ISP идут навстречу.
0
Вы еще сперва с провайдерами договоритесь. Которые априори предоставляют услуги для физических лиц, подразумевая при этом традиционный home use. По крайней мере у нас так.
0
>> Тоесть через первый канал пойдет в два раза больше трафика,
в два раза больше tcp-сессий
в два раза больше tcp-сессий
0
для балансировки честно скажу — жутко кривое решение с огромной кучей невразумительных последствий. И сессии в http — далеко не единственная проблема. btw wtf with UDP?
+1
Предложите более кошерное, будет интересно послушать. Да, варианты «купить...» или «зарегистрировать..» и пр. прошу не предлогать — рассматривается домашняя сеть.
+1
домой я не стал бы два канала подводить, хотя вероятно имел бы один как запасной.
Я бы лучше договорился с провайдером на нужную мне скорость. Все равно должно получится дешевле чем у двух провайдеров покупать два канала.
Я бы лучше договорился с провайдером на нужную мне скорость. Все равно должно получится дешевле чем у двух провайдеров покупать два канала.
0
tc
0
бондинг?
0
Да, та часть с одновременной работой двух каналов нежизнеспособна. Проверено и не раз.
Пинг до шлюза — то еще приближение.
А про UDP — просто, один влево, два вправа, и не «важно», что у них src будет разный. %)
Пинг до шлюза — то еще приближение.
А про UDP — просто, один влево, два вправа, и не «важно», что у них src будет разный. %)
0
угу, а это большинство voip как минимум
0
игрушки еще там всякие
0
эм… я тут посмотрел еще раз — соединения(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)
т.е. в пределах сессии пакеты будут отпускаться с разных источников.
0
решение о том, через какой канал пойдет пакет принимается на уровне маршрутизации. и без разницы, какой протокол — TCP или UDP — все пакеты к одному хосту пойдут через тот же канал
0
какое дело маршрутизации в данном случае до TCP? У маршрутизации есть пакет, который нужно взять с одного(в данном случае) интерфейса и поставить на другой, причем вы абсолютно однозначно ставите веса, что определяет какой пакет(по факту прибытия) куда пойдет.
0
для объединения каналов тут используется multipath routing — тоесть пакет к серверу A пойдет через один интерфейс, а к серверу B через другой. Через какой интерфейс пойдет пакет к серверу определяется случайно, с учетом весов, и маршрут кешируется, тоесть все последющие пакеты к серверу А идут через тот же интерфейс
0
да, теперь понятно, по сути просто ip route weight. но тогда какой смысл в такой балансировке, просто некая автоматическая случайная разброска путей маршрутизации. Это же нельзя назвать балансировкой.
0
маршрут скешируется и для двух интерфейсов, так ведь?
0
там короче так, приходит ip пакет, роутер смотри на dst, не находит в кеш-таблице такой, и с условием веса кидает на тот или иной интерфейс и отправляет, а dst записывает в кеш, и поэтому все последующие пакеты с 1 белым хостом будут роутится через один gw, пока запись в кеше не протухнет.
Т.е. вся процедура проходит не выше сетевого уровня.
Т.е. вся процедура проходит не выше сетевого уровня.
0
Надо в очередной раз затестить, посмотреть. Оно работало, но с маркированием пакетов.
0
не, тут другое, пакеты не маркируются.
роутер просто помнит что куда отправлял
роутер просто помнит что куда отправлял
0
вот тут патчи автора для ip route weight
www.ssi.bg/~ja/#routes
www.ssi.bg/~ja/#routes
0
С статье скорее всего это «опущено», по дефолту в iptables стоит пропускать established, просто забыли об этом упомянуть :)
0
Есть еще готовая сборка — Endian Firewall, позволяет это сделать. И многое другое. Очень хорошая штука, мы в студии ее используем.
0
А как такое на винде провернуть?
+1
актуальный вопрос для тех не очень близко знаком с изнанкой TCP/IP
0
Раз попробовал. Есть ADSL через раутер раздаваемый по квартире. Воткнул WiFi сетевую, подключился к чей-то сети. И начал наблюдать, что получится. Периодически обрубая то там интернет, то там. Как-то это работало. Какой софт по какому маршруту идет я так и не понял. Но если скажем LAN «лежит» то браузер идет по WiFi, но так на нем и остается. Если выключить WiFi при работающем LAN — браузер не «переключится». Но если его закрыть и запустить по новой — он будет пользоваться тем, что в тот момент работает.
ps. Сейчас купил LinkSys — он с альтернативной прошивкой умеет делать то, что тут описано. Но пока руки не дошли разобраться и настроить.
ps. Сейчас купил LinkSys — он с альтернативной прошивкой умеет делать то, что тут описано. Но пока руки не дошли разобраться и настроить.
0
Kerio WinRoute Firewall не ниже 6.5 — выше было
0
дешево(бесплатно) но сердито — 3proxy ( 3proxy.ru/howtor.asp#ROUNDROBIN )
0
Большое спасибо. Не сколько за решение, сколько за идею. У нас несколько иная специфика, но ход мысли уловил.
0
Немного не в тему, но:
Есть ли возможность для win машины, объеденить два wifi соединения в один? (скорость хочется увеличить, в квартире два wifi роутера, с разными провайдерами)
Есть ли возможность для win машины, объеденить два wifi соединения в один? (скорость хочется увеличить, в квартире два wifi роутера, с разными провайдерами)
0
НЛО прилетело и опубликовало эту надпись здесь
Маршрутизатор — дорого, но можно заменить на OpenBSD + OpenBGPD.
AS — public-as вам не дадут в RIPE. Сейчас зарегистрировать систему и получить адресное пространство не просто, а для сетей с планируемым числом адресов менее 512 на практике — практически не возможно.
Пиринг с вами ни один серьезный оператор не подпишет, зачем ему это? Телекомы ничего не делают просто так.
AS — public-as вам не дадут в RIPE. Сейчас зарегистрировать систему и получить адресное пространство не просто, а для сетей с планируемым числом адресов менее 512 на практике — практически не возможно.
Пиринг с вами ни один серьезный оператор не подпишет, зачем ему это? Телекомы ничего не делают просто так.
0
>>по обеим каналам
по обоим каналам
по обоим каналам
0
спасибо, добавил в мемориз=)
+2
Уважаемый, а не подскажите как сделать подобную, но чуть другую вещь.
Есть серевер под Linux с двумя белыми IP-адресами. Один — основной для этой машины
К нему через VPN цепляется машина, которая получает серый адрес (или как вариант второй белый адрес).
Далее необходимо все запросы в инет от этой машины NAT-ить на айпишник сервера, но в то же время, все запросы, пришедшие на второй айпишник натить на эту, подключенную через VPN машинку, и чтобы на коннекты, установленные со второго белого айпишника к ней, она отвечала через него же, а не через NAT.
Сижу и думаю… в ядре вроде все есть… conntrack, чтобы отслеживать коннекты, множественные таблицы маршрутизации чтобы гибко рулить коннектами… а вот какими командами заставить сервер делать то, что мне нужно — не знаю.
Есть серевер под Linux с двумя белыми IP-адресами. Один — основной для этой машины
К нему через VPN цепляется машина, которая получает серый адрес (или как вариант второй белый адрес).
Далее необходимо все запросы в инет от этой машины NAT-ить на айпишник сервера, но в то же время, все запросы, пришедшие на второй айпишник натить на эту, подключенную через VPN машинку, и чтобы на коннекты, установленные со второго белого айпишника к ней, она отвечала через него же, а не через NAT.
Сижу и думаю… в ядре вроде все есть… conntrack, чтобы отслеживать коннекты, множественные таблицы маршрутизации чтобы гибко рулить коннектами… а вот какими командами заставить сервер делать то, что мне нужно — не знаю.
0
метить пакеты fwmark, и на основе меток в iproute 2 пускать на разные таблицы
0
У меня когда возникла необходимость на одном из 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 ;)
Но статья таки полезна :)
0
Только мне кажется что никаого объединения двух каналов тут не нарисовано
я понимаю что железный вариан решения не спортивен — но может кому нить пригодится? 8))
DI-LB604 Маршрутизатор Express EtherNetwork 4-х портовый c функцией распределения нагрузки — Цена: 3532.29 руб.
зы — если гуглить на «распределение нагрузки» можно найти и за 50 баксов железку
я понимаю что железный вариан решения не спортивен — но может кому нить пригодится? 8))
DI-LB604 Маршрутизатор Express EtherNetwork 4-х портовый c функцией распределения нагрузки — Цена: 3532.29 руб.
зы — если гуглить на «распределение нагрузки» можно найти и за 50 баксов железку
-1
Понятно, что можно заплатить N баксов и купить железку для чего угодно…
Для тех, кто не верит — вот картинка
Вверху два объединяемях канала (2 и 1 mbps), внизу — график загрузки общего совместного канала (с разбивкой по классам HTB). Как видно загрузка достигает почти 3 mbps
Для тех, кто не верит — вот картинка
Вверху два объединяемях канала (2 и 1 mbps), внизу — график загрузки общего совместного канала (с разбивкой по классам HTB). Как видно загрузка достигает почти 3 mbps
0
я не о том работают ли оба канала — 8)
запустите на скачивание по http файл побольше — уроните один канал — потом поднимите — уроните второй
если всё «без разрывов» вы в шоколаде
8)
запустите на скачивание по http файл побольше — уроните один канал — потом поднимите — уроните второй
если всё «без разрывов» вы в шоколаде
8)
0
мм а что за плагин ггенерировал нижный график… хотелось бы его у себя тоже поднять
0
Плагин собственной разработки, визуализирует разбиений трафика на классы шейпера, про него, а так же про шейпинг в линукс планирую в скором времени статью тоже написать
а пока этот плагин можно скачать с сайта munin
а пока этот плагин можно скачать с сайта munin
+1
Спасибо. У нас в офисе adsl падал постоянно, точнее само ppp соединение, приходилось ifdown; ifup делать, скорее всего из-за китайского модема. Я давно хотел написать скрипт, который сам бы поднимал канал при падении, но всё руки не доходили, да и bash я не так хорошо знаю. В общем спасибо вам за скрипт check.sh.
0
Поделюсь своим скриптом. Проверка каналов, на 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
+2
Огромное спасибо за мануал, поднял у себя двух 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 — в лог скрипт писать начал вовремя, т.е. запустился скрипт своевременно, но интернет не раздаётся. После запуска руками в консоли — всё снова ок.
Подскажите, пожалуйста, в чём магия? А в идеале подскажите правильный способ того, как стартовать всё это хозяйство при загрузке и автоматически перезапускать, если скрипт вдруг когда-то помрёт.
0
Есть еще способ с помощью стандартных средств без скриптов — Ubuntu Bonding.
+1
Пытался найти подробную информацию про бонинг, так и не понял, будет ли оно работать если две линки от двух разных провайдеров, с разными IP, шлюзами и тд. Вы его на практике использовали? Расскажите подробнее ваши впечатления пожалуйста
0
Bonding для увеличения пропускной способности а не для объединения разных ip. Тоесть если гигабитная сетевуха не справляется с потоком, ставим вторую и делаем bonding, будет 2 гигабитный канал, у обеих сетевух будет один и тотже ip.
0
У этого метода есть большая проблема при настройках по умолчанию. Описал ее тут habrahabr.ru/post/267339
0
Отличный пост. Попробую сделать подобное на FreeBSD.
0
Зарегистрируйтесь на Хабре , чтобы оставить комментарий
Объединение пропускной способности двух интернет каналов и простая отказоустойчивость