Pull to refresh

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
Потому что ADSL у нас для домашних пользователей — до 4 mbps download, а upload всего 512 kbps, а старый добрый беспроводный канал — симметричный, честные 2 mbps. К тому же постоянный реальный IP, чем я пользуюсь, чтобы хостить у себя на сервере пару страничек.
АДСЛ «одного известного на Украине провайдера» имеет (при куче положительных моментов в виде цен, доступности почти в любой деревне и относительной стабильности) пару отрицательных моментов в духе «если уж упало в пятницу — до понедельника работать не будет», «если коннектишься вечером в час пик — можно по полчаса ждать выделения IP-адреса, потому как их не хватает» и т.д. Так что пусть будет.
Ниразу не в точку )
Я уже год абонент этого провайдера и проблем с коннектом нет. Бывают моменты, когда что-то не работает… Не без этого!

Но чтобы все выходные не было инета или чтобы пол дня коннектиться — такого не было ниразу.

///
А по поводу поста — для домашнего пользователя доступна скорость до 8 мбит/с, а отдача — 1 мбит/с.
Да, сорри, неучел недавнего изменения тарифных планов…
у нас, как минимум, два больших adsl провайдеров. вы про какой?
Я видимо чего-то пропустил, а какой второй?
укртелеком и фарлеп (вега телеком)
Не могу сказать, что Фарлеп очень большой провайдер :)

З.Ы. опять заминусуете? )
Ну покрывает крупные города… до ут далеко, наверное, но все-же

Эээээ… про какие минуса идет речь?
у меня в городе сельского типа как раз так и работает. При чем будешь звонить в понедельник ругаться типа все выходные небыло инета — они: щас работает? я: да. Они: так в чем проблема. Вот и все. После таких разговоров хочется побить им окна.
я кстати не про крупного провайдера. У крупного пока портов нет, жду.
неделю линию поднять не могли. подняли. проработала 2,5 дня. сегодня опять упала. Трубку не берут(прячутся наверное).
Меня скоро с работы уволят
У нас на Кавказе то же самое. Один раз они даже на Новый год нас без проводной связи оставили 10 дней. Общие проблемы… Как у классика — дураки и коммуникационные линии.
Резерв, да и видимо он тоже анлимитный — чтобы скорость была побыстрее чем на одном.
А теперь все тоже самое, но для Вендузятников. Кто поможет?
Можно поставить аппаратный девайс, из «подешевле» DLink выпускает. А можно поставить Linux-маршрутизатор на самом убитом железе перед Windows машиной для объединения каналов. У меня все это крутится на Celeron 300 MHz, 256 MB RAM
А если подключена витая пара, которую свич делит на три канала ( 13 + 2х5 мегабит, 3 статики внешних) оно работать будет?
Думаю нет, объеденить три канала свичем не получится, желательно иметь три сетевых карты, куда это все будет воткнуто. Хотя… может какими извращениями может удастся и с одной сетевухой.
Извращения называются Vlan-ами.
Проблема лишь в том, что нужно будет знать номера вланов, хотя сниффером вычислить их не представляет сложности.
Неуправляемый свич не умеет маршрутизировать, соотв. ничего «делить» он не будет :)

Нужен маршрутизатор либо управляемый коммутатор (с VLAN-ами и load balancing-ом).
имеете виду Вланы? Тогда работать будет как описано в статье.
Пользовался ASUS RX3042H для этих целей. Балансировка, failover все работает отлично. Стоит 4000р
UFO landed and left these words here
а подробнее?

Private AS они ж для роутинга в рамках одного провайдера. Интернет о них ничо не знает
можно использовать провайдеров чисто как транспорт до хоста в инете, можно попросить провайдеров согласовать эту AS, можно попросить провайдера одолжить реальную AS, можно самому приобрести AS, можно еще кучу возможностей изыскать, было бы желание.
UFO landed and left these words here
Как это может произойти?

Мне кажется что мало внедрения BGP у клиентов с двумя каналами, т.к. это как правило не требуется малому и среднему бизнесам, а не по каким-то иным техническим причинам. Как правило все ISP идут навстречу.
Каждая AS — это запись в памяти маршрутизатора. Каждого, у которого full-view.

Память маршрутизаторов — конечна, число AS уже и сейчас крайне велико. Зачастую, слабый маршрутник просто не вытягивает full-view.

А теперь представьте, что AS — в 10 раз больше… :)
будут ставить в железо не 1 гиг а 32 гига — думаю это не существенная причина для загибания интернета. :)
ну и потом если бы это дело активно использовалось, то можно было бы огромне количество задач решать в private as — прокидывая MPLS между провайдерами например.
Вы еще сперва с провайдерами договоритесь. Которые априори предоставляют услуги для физических лиц, подразумевая при этом традиционный home use. По крайней мере у нас так.
я бы дома вообще не заморачивался такими проблемами, и в любом случае можно было бы договорится — и договаривался когда подключал квартиры-офисы (через физиков), просто стоило денег.
>> Тоесть через первый канал пойдет в два раза больше трафика,
в два раза больше tcp-сессий
Да, надо понимать, что такая балансировка весьма приблизительна.

>>в два раза больше tcp-сессий
даже еще более грубо — 2/3 итернета будут открываться через один канал, 1/3 — через другой
но для торрентов (а это согласитесь основная нагрузка) такой балансировки хватает
эм, я не знаю достаточно вам это или нет. «4» это приблизительно «5», но все же это «4» :)
грубо говоря если с 1 пиром образовалась сессия на 2 гига, это значит статистика будет 2гига-0гигов
для балансировки честно скажу — жутко кривое решение с огромной кучей невразумительных последствий. И сессии в http — далеко не единственная проблема. btw wtf with UDP?
Предложите более кошерное, будет интересно послушать. Да, варианты «купить...» или «зарегистрировать..» и пр. прошу не предлогать — рассматривается домашняя сеть.
домой я не стал бы два канала подводить, хотя вероятно имел бы один как запасной.

Я бы лучше договорился с провайдером на нужную мне скорость. Все равно должно получится дешевле чем у двух провайдеров покупать два канала.
бондинг в данном случае невозможен, разве что сквозь шлюз в инете.
Да, та часть с одновременной работой двух каналов нежизнеспособна. Проверено и не раз.
Пинг до шлюза — то еще приближение.
А про UDP — просто, один влево, два вправа, и не «важно», что у них src будет разный. %)
С UDP, игрушками и VOIP все просто замечательно! Все это уже работает у меня дома без всяких проблема
да, два провайдера, два IP адреса. Все пакеты на один хост в каждый промежуток времени идут только с одного адреса
эм… я тут посмотрел еще раз — соединения(tcp) не отслеживаются, мне кажется будет следующее:
>> 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, пока запись в кеше не протухнет.

Т.е. вся процедура проходит не выше сетевого уровня.
Надо в очередной раз затестить, посмотреть. Оно работало, но с маркированием пакетов.
не, тут другое, пакеты не маркируются.
роутер просто помнит что куда отправлял
С статье скорее всего это «опущено», по дефолту в iptables стоит пропускать established, просто забыли об этом упомянуть :)
-m tcp -p tcp -m state --state ESTABLISHED,RELATED
тогда, и только тогда.
Есть еще готовая сборка — Endian Firewall, позволяет это сделать. И многое другое. Очень хорошая штука, мы в студии ее используем.
актуальный вопрос для тех не очень близко знаком с изнанкой TCP/IP
Раз попробовал. Есть ADSL через раутер раздаваемый по квартире. Воткнул WiFi сетевую, подключился к чей-то сети. И начал наблюдать, что получится. Периодически обрубая то там интернет, то там. Как-то это работало. Какой софт по какому маршруту идет я так и не понял. Но если скажем LAN «лежит» то браузер идет по WiFi, но так на нем и остается. Если выключить WiFi при работающем LAN — браузер не «переключится». Но если его закрыть и запустить по новой — он будет пользоваться тем, что в тот момент работает.

ps. Сейчас купил LinkSys — он с альтернативной прошивкой умеет делать то, что тут описано. Но пока руки не дошли разобраться и настроить.
Большое спасибо. Не сколько за решение, сколько за идею. У нас несколько иная специфика, но ход мысли уловил.
Немного не в тему, но:
Есть ли возможность для win машины, объеденить два wifi соединения в один? (скорость хочется увеличить, в квартире два wifi роутера, с разными провайдерами)
UFO landed and left these words here
Маршрутизатор — дорого, но можно заменить на OpenBSD + OpenBGPD.

AS — public-as вам не дадут в RIPE. Сейчас зарегистрировать систему и получить адресное пространство не просто, а для сетей с планируемым числом адресов менее 512 на практике — практически не возможно.

Пиринг с вами ни один серьезный оператор не подпишет, зачем ему это? Телекомы ничего не делают просто так.
Уважаемый, а не подскажите как сделать подобную, но чуть другую вещь.

Есть серевер под 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 ;)
Но статья таки полезна :)
Только мне кажется что никаого объединения двух каналов тут не нарисовано

я понимаю что железный вариан решения не спортивен — но может кому нить пригодится? 8))

DI-LB604 Маршрутизатор Express EtherNetwork 4-х портовый c функцией распределения нагрузки — Цена: 3532.29 руб.

зы — если гуглить на «распределение нагрузки» можно найти и за 50 баксов железку
Понятно, что можно заплатить N баксов и купить железку для чего угодно…
Для тех, кто не верит — вот картинка

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

запустите на скачивание по http файл побольше — уроните один канал — потом поднимите — уроните второй
если всё «без разрывов» вы в шоколаде

8)
так небывает ) да и ненадо это мне например. Большие файлы по HTTP некачаю уже пару лет, торренты с таким обрывами справляются очень легко, чего еще хотеть )))
Подозреваю, что в домашних условиях, без собственной AS такого и с указанной железкой не добиться.
мм а что за плагин ггенерировал нижный график… хотелось бы его у себя тоже поднять
Плагин собственной разработки, визуализирует разбиений трафика на классы шейпера, про него, а так же про шейпинг в линукс планирую в скором времени статью тоже написать

а пока этот плагин можно скачать с сайта 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
Огромное спасибо за мануал, поднял у себя двух PPPoE провайдеров описанным способом. Всё работает, но возникла беда с автостартом всей этой системы.

Добавил в 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 — в лог скрипт писать начал вовремя, т.е. запустился скрипт своевременно, но интернет не раздаётся. После запуска руками в консоли — всё снова ок.

Подскажите, пожалуйста, в чём магия? А в идеале подскажите правильный способ того, как стартовать всё это хозяйство при загрузке и автоматически перезапускать, если скрипт вдруг когда-то помрёт.
я стартую скрипт из /etc/rc.local
за год работы еще ни разу скрипт не помирал, там собственно ломаться нечему, поэтому для автоматического перезапуска ничего не придумывал
Есть еще способ с помощью стандартных средств без скриптов — Ubuntu Bonding.
Пытался найти подробную информацию про бонинг, так и не понял, будет ли оно работать если две линки от двух разных провайдеров, с разными IP, шлюзами и тд. Вы его на практике использовали? Расскажите подробнее ваши впечатления пожалуйста
Bonding для увеличения пропускной способности а не для объединения разных ip. Тоесть если гигабитная сетевуха не справляется с потоком, ставим вторую и делаем bonding, будет 2 гигабитный канал, у обеих сетевух будет один и тотже ip.
Отличный пост. Попробую сделать подобное на FreeBSD.
Only those users with full accounts are able to leave comments. Log in, please.