photon Опубликовано 2 июля, 2012 (изменено) · Жалоба После этого инет грохнулся.(Сижу под виндой на работе).При чем с шлюза пинги не проходили.=( Надо сначала все отладить в сети из виртуальных машин, а потом уже внедрять. Изменено 2 июля, 2012 пользователем photon Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
sx-sqlx Опубликовано 2 июля, 2012 · Жалоба У меня такое чувство что просто база не коннектится,можете написать поподробнее по поводу как создать,кого добавить как юзера и т.п.Пробовал заюзать genbase,не хочет заполнять. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 3 июля, 2012 (изменено) · Жалоба Настройки по умолчанию ориентированы на работу с локальной базой данных в формате SQLite3, поэтому все должно работать, если файл /etc/sc/sc.db доступен для записи тому пользователю, из-под которого запускается sc. Если нужно настроить загрузку данных из биллинга на отдельной машине, то надо редактировать в /etc/sc/sc.conf соответствующие параметры db_* и query_*. Изменено 3 июля, 2012 пользователем photon Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Antares Опубликовано 11 сентября, 2012 · Жалоба Как найти дублирующий IP в базе? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 11 сентября, 2012 (изменено) · Жалоба Вообще говоря, по умолчанию IP-адрес помечен как первичный ключ, поэтому такого быть не должно. Найти дубликаты можно, выполнив к базе следующий SQL-запрос: SELECT ip, COUNT(ip) AS dup_count FROM table GROUP BY ip HAVING (COUNT(ip) > 1) Изменено 11 сентября, 2012 пользователем photon Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Петрович-2012 Опубликовано 10 октября, 2012 · Жалоба Столкнулся с проблемой: через роутер не проходит более 1 гбит/с трафика. Использую версию sc 1.1.2, т. к. наложил пробегавший тут патч a0d75 для общего ограничения скорости нескольких айпи. Абоненты стали жаловаться на медленный интернет в часы пик (потерь пакетов нет!). Симптомы следующие: #sc init #sc add ... сервер не нагружен #w load average: 0,39, 0,52, 0,48 #sar -u ALL 3 Linux 3.2.1-gentoo-r2 (core) 11.10.2012 _x86_64_ (8 CPU) 00:04:06 CPU %usr %nice %sys %iowait %steal %irq %soft %guest %idle 00:04:09 all 8,18 0,00 3,08 0,00 0,00 0,00 33,29 0,00 55,46 00:04:12 all 6,60 0,00 2,23 0,08 0,00 0,00 32,34 0,00 58,75 00:04:15 all 7,72 0,00 2,50 0,21 0,00 0,00 32,10 0,00 57,46 ... #cat /proc/net/stat/ipt_netflow | grep Rate Rate: 903167378 bits/sec, 140088 packets/sec; Avg 1 min: 919100929 bps, 142096 pps; 5 min: 998652773 bps, 150989 pps Rate более 1 гбита не поднимается, pps 150000 если сделать sc reset то пропускная способность сразу возрастает в разы: #sc reset #sleep 10 #cat /proc/net/stat/ipt_netflow | grep Rate Rate: 1569569010 bits/sec, 217051 packets/sec; Avg 1 min: 1552245870 bps, 215591 pps; 5 min: 1375383290 bps, 194454 pps Rate в пиках доходит до 1.8 гбит/с, pps до 200000 на загрузке роутера это никак не сказывается схема: бондинг bond0 из 3-х сетевых intel, на этом бондинге есть vlan257 out_if = ifb0 in_if = vlan257 ifb0 поднимается стандартно /sbin/ip link set ifb0 up /sbin/tc qdisc add dev vlan257 ingress /sbin/tc filter add dev vlan257 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 11 октября, 2012 (изменено) · Жалоба Столкнулся с проблемой: через роутер не проходит более 1 гбит/с трафика. Использую версию sc 1.1.2, т. к. наложил пробегавший тут патч a0d75 для общего ограничения скорости нескольких айпи. Абоненты стали жаловаться на медленный интернет в часы пик (потерь пакетов нет!). Если трафик классифицируется правильно и попадает в классы, то нужно увеличить размеры очередей дочерних классов: поставить в sc.conf параметр leaf_qdisc = 'pfifo limit 100' вместо 50, а то и больше. Другая причина может быть в том, что входящий трафик неправильно классифицируется, если шейпер повешен на интерфейс, через который ходит тегированный трафик. Нужные оффсеты могут быть смещены на 4 байта, которые добавляются при инкапсуляции 802.1q. Советую проверить это дело с помощью tcpdump. Изменено 11 октября, 2012 пользователем photon Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Петрович-2012 Опубликовано 11 октября, 2012 · Жалоба Трафик классифицируется правильно, сегодня попробую увеличить размеры очередей. Спасибо за совет! Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Петрович-2012 Опубликовано 11 октября, 2012 (изменено) · Жалоба Не помогло: если сделать только sc init без загрузки правил - через роутер не проходит более 1 гбит/с. Если сделать sc reset - пропускная способность поднимается до 1,5 гбит/с. Снова делаешь sc init - опять падает до 1 гбит/с. Т. е. при инициализации хэш фильтров упираемся в 1 гбит/с пропуской способности. Выяснил что это из за заворота на ifb интерфейс (для ограничения исходящей), буду менять схему Изменено 11 октября, 2012 пользователем Петрович-2012 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Петрович-2012 Опубликовано 12 октября, 2012 · Жалоба в последней версии нужно поправить строчку 1963: if (!defined $rul_rate) { $rul_rate = 0; } Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ilya Evseev Опубликовано 12 октября, 2012 · Жалоба в последней версии нужно поправить строчку 1963: if (!defined $rul_rate) { $rul_rate = 0; } Лучше $rul_rate ||= 0; Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 12 октября, 2012 (изменено) · Жалоба в последней версии нужно поправить строчку 1963: if (!defined $rul_rate) { $rul_rate = 0; } Лучше $rul_rate ||= 0; Вы так говорите, как будто if (!defined $rul_rate) $rul_rate = 0; без фигурных скобок не работает, а ||= не будет ругаться на неинициализированную переменную. Изменено 12 октября, 2012 пользователем photon Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ilya Evseev Опубликовано 12 октября, 2012 · Жалоба Вы так говорите, как будто if (!defined $rul_rate) $rul_rate = 0; без фигурных скобок не работает Проверьте. а ||= не будет ругаться на неинициализированную переменную. Проверьте :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 12 октября, 2012 · Жалоба $a ||= 0 -- хороший трюк, спасибо за подсказку. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Петрович-2012 Опубликовано 13 октября, 2012 (изменено) · Жалоба Интересует вопрос по масштабируемости: нужно как обычно решать задачу shaping+nat+netflow для нескольких тысяч абонентов. До текущего момента всё крутилось на одном сервере, сейчас трафик перевалил за 1 гигабит и сервер перестал справляться. Вариантов на мой взгляд всего два (не считая покупки мощной циски): 1. shaping на одной машине, nat+netflow на другой. Всё здорово, однако количество сетевых карт в каждом сервере растет пропорционально гигабитам трафика 2. Несколько серверов, каждый будет делать shaping+nat+netflow для небольшой группы абонентов. Всё хорошо масштабируется, но теперь пропорционально растет количество серверов, нужно постоянно следить за загрузкой и своевременно добавлять новые серверы может я что-то упустил? Изменено 13 октября, 2012 пользователем Петрович-2012 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 13 октября, 2012 (изменено) · Жалоба Лучше отказаться от NAT, получить статус LIR и раздавать юзерам белые IP из имеющегося пула. Если NAT все-таки останется, функции шейпинга лучше отделить от функций border router (NAT, BGP), будет меньше проблем с диагностикой. Ну да, придется дополнительно купить несколько машин и сетевых адаптеров. Если от NAT удалось избавиться, можно смело совмещать функции шейпера и бордера на одной машине. Для обеспечения failover, на каждом шейпере нужно создать набор правил для всех IP-адресов сети (там хэши, и от числа правил ничего не зависит), воткнуть их в L3-коммутатор, на котором созданы соответствующие маршруты. Вариант "несколько дешевых shaping bridges со встроенными гигабитными портами + один мощный border router с многопортовыми картами" можно реализовать с помощью LACP. Кроме того, поскольку 10-гигабитные адаптеры уже сравнялись по стоимости с многопортовыми гигабитными и поддерживаются современными ядрами, то вполне можно рассмотреть варианты их использования. Изменено 13 октября, 2012 пользователем photon Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Петрович-2012 Опубликовано 14 октября, 2012 (изменено) · Жалоба У нас есть своя AS, адресов пока достаточно, однако на перспективу их на всех не хватит, новые адреса IPV4 RIPE перестал выдавать, поэтому без NAT никуда :( Насчет 10-гбитных адаптеров пока сомневаюсь, т. к. PCI шина вроде как не позволяет им работать на скоростях более 4 гбит/с (где то видел тесты). Скорее всего буду использовать вариант "несколько дешевых shaping bridges" Изменено 14 октября, 2012 пользователем Петрович-2012 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 14 октября, 2012 (изменено) · Жалоба Насчет 10-гбитных адаптеров пока сомневаюсь, т. к. PCI шина вроде как не позволяет им работать на скоростях более 4 гбит/с (где то видел тесты). Во всех серверных решениях сетевые адаптеры (включая встроенные) вешают на шину PCI Express. Теоретическая пропускная способность одного lane шины PCIe v2.0 -- 500 MByte/s или 4 Gbit/s, PCIe v3.0 -- почти в два раза больше. Изменено 14 октября, 2012 пользователем photon Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Петрович-2012 Опубликовано 17 октября, 2012 · Жалоба photon, спасибо за замечательный скрипт Поставил свежее ядро, свежий sc, свежий iproute2 и всё стало отлично. В ближайшее время попробую несколько гбит прокрутить возможно кому-то пригодится мой небольшой патч: классификатор u32, режим shaping Что делает патч: 1. отключает блокирование всего трафика 2. IP с нулевой скоростью заворачивает в корневую дисциплину без создания подкласса (возможно кому то понадобится если пункт 1 включить) 3. позволяет ставить общее ограничение скорости нескольким IP (работа со встроенной БД не поддерживается), например sc add 192.168.3.12 6000kibit 1234 sc add 192.168.5.41 6000kibit 1234 sc add 192.168.6.33 6000kibit 1234 и т. д. где 1234 - class_id. --- sc.original 2011-10-20 16:01:36.000000000 +0400 +++ sc.patched 2012-10-16 15:47:27.000000000 +0400 @@ -93,7 +93,7 @@ # database handler (optional) 'dbhandler' => \&cmd_dbadd, # arguments (optional) - 'arg' => '<ip> <rate>', + 'arg' => '<ip> <rate> <class>', # command description 'desc' => 'add rules', # check root privileges before execution (optional) @@ -115,7 +115,7 @@ 'del|rm' => { 'handler' => \&cmd_del, 'dbhandler' => \&cmd_dbdel, - 'arg' => '<ip>', + 'arg' => '<ip> <class>', 'desc' => 'delete rules', 'priv' => 1, }, @@ -655,6 +655,15 @@ return $!; } +sub is_class +{ + if ($_[0] <= 0 || $_[0] > 65535) { + return 0; + } else { + return $_[0]; + } +} + sub arg_check { my ($issub, $arg, $argname) = @_; @@ -688,7 +697,7 @@ my ($num, $unit); if (($num, $unit) = $rate =~ /^([0-9]+)([A-z]*)$/xms) { - return 0 if $num == 0; +# return 0 if $num == 0; if (nonempty($unit)) { foreach my $u (keys %units) { if ($unit =~ /^(?:$u)$/xms) { @@ -791,7 +800,7 @@ while (my $ref = $sth->fetchrow_arrayref()) { ($intip, $rate) = @{$ref}; - if (!defined $rate) { + if (!nonempty($rate)) { log_carp("IP $ip has undefined rate, skipping\n"); next; } @@ -1342,10 +1351,10 @@ } # block all other traffic - $TC->( - "filter add dev $dev parent 1:0 protocol ip pref $pref_default ". - 'u32 match u32 0 0 at 0 police mtu 1 action drop' - ); +# $TC->( +# "filter add dev $dev parent 1:0 protocol ip pref $pref_default ". +# 'u32 match u32 0 0 at 0 police mtu 1 action drop' +# ); return $?; } @@ -1362,7 +1371,8 @@ sub u32_dev_add { my ($dev, $cid, $rate, $ceil, $match, $ht, $key) = @_; - + my ($num, $unit) = $rate =~ /^([0-9]+)([A-z]*)$/xms; + if($num) { $TC->( "class replace dev $dev parent 1: classid 1:$cid htb ". "rate $rate ceil $ceil quantum $quantum" @@ -1370,6 +1380,11 @@ $TC->( "qdisc replace dev $dev parent 1:$cid handle $cid:0 $leaf_qdisc" ); + } + else { + $cid = 0; + } + $TC->( "filter replace dev $dev parent 1: pref $pref_leaf ". "handle $ht:$key:800 u32 ht $ht:$key: match $match flowid 1:$cid" @@ -1851,20 +1866,20 @@ sub cmd_add { - my ($ip, $rate) = @_; + my ($ip, $rate, $class) = @_; arg_check(\&is_ip, $ip, 'IP'); $rate = arg_check(\&is_rate, $rate, 'rate'); - my $cid = ip_classid($ip); - return $rul_add->($ip, $cid, $rate); + my $cid = arg_check(\&is_class, $class, 'class'); + return $rul_add->($ip, $cid, $rate); } sub cmd_del { - my ($ip) = @_; + my ($ip, $class) = @_; arg_check(\&is_ip, $ip, 'IP'); - my $cid = ip_classid($ip); + my $cid = arg_check(\&is_class, $class, 'class'); return $rul_del->($ip, $cid); } @@ -1960,6 +1975,7 @@ } # change if rate in database is different my $rul_rate = $rul_data{$dcid}{'rate'}; + if (!defined $rul_rate) { $rul_rate = 0; } if ($rul_rate ne $db_rate) { my $ip = $db_data{$dcid}{'ip'}; print "* $ip $rul_rate -> $db_rate\n" if $verbose & VERB_ON; Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 21 октября, 2012 (изменено) · Жалоба Спасибо, сделаю багфикс-версию. Когда будет время, я планирую все переписать на Python в объектно-ориентированном стиле и добавить поддержку HFSC. Изменено 21 октября, 2012 пользователем photon Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
isup Опубликовано 6 ноября, 2012 · Жалоба sc dbcreate или sc help Global symbol "$ip" requires explicit package name at /usr/sbin/sc line 1964. BEGIN not safe after errors--compilation aborted at /usr/sbin/sc line 2175. Что же ему не нравится? Все по инстукции, модули поставлены, база настроена Linux i 2.6.32-24-generic-pae #39-Ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 7 ноября, 2012 (изменено) · Жалоба Скачайте здесь, там дурацкая ошибка при выводе сообщения о неопределенной полосе пропускания: https://bitbucket.org/sky/sc/get/tip.tar.bz2 На Sourceforge тоже все обновил. Изменено 7 ноября, 2012 пользователем photon Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
isup Опубликовано 7 ноября, 2012 · Жалоба Скачайте здесь, там дурацкая ошибка при выводе сообщения о неопределенной полосе пропускания: https://bitbucket.org/sky/sc/get/tip.tar.bz2 На Sourceforge тоже все обновил. Спасибо помоголо Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
sol Опубликовано 22 ноября, 2012 · Жалоба А так-же ключик --set для iptables уже депрекейтед и надо пользовать --match-set и для ipset комбинация -nsL не канает и надо -n -s -L А еще нужно в конфиг внести опцию "не блокировать трафик от ip без шейпера" и включить ее по умолчанию. Иначе, это доставляет оргазмы при спешной инсталяции на _удаленном_ сервере. В остальном - скрипт чоткий и, вероятно, это самая удобная оболочка для мутного tc из виденных мной. Респект автору. Пеши ищо. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
photon Опубликовано 23 ноября, 2012 · Жалоба Спасибо. Напишу. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...