IPN и классы трафика
-
- Site Admin
- Сообщения: 5749
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
Вот пример рабочего шейпера для линуха в линкапдаун. Некоторые замечания:
1. Я не ограничиваю скорость входящего (в сторону клиента) трафика из приватных подсетей (10/8, 172.16/12, 192.168/16) и исходящего трафика в приватные подсети. Весь остальной трафик попадает под ограничения. По-уму конечно было бы вытаскивать всё из интервалов из базы и строить правила, но времени ковырять исходник на тему как это проще сделать у меня нету. Если Автор подскажет, как получить пары типа подсеть-скорость, подсеть-скорость... - вставлю.
2. Резать исходящий трафик ингресс дисциплиной с политикой дроп - это конечно жестоко
Собсно у меня-то сделано по-другому. Режется классовыми дисциплинами в другом месте. Но мой реальный шейпер врядли кому-то подойдёт. А для универсальности вполне и этот покатит. По крайней мере работать будет у всех.
линкапдаун строка 332:
1. Я не ограничиваю скорость входящего (в сторону клиента) трафика из приватных подсетей (10/8, 172.16/12, 192.168/16) и исходящего трафика в приватные подсети. Весь остальной трафик попадает под ограничения. По-уму конечно было бы вытаскивать всё из интервалов из базы и строить правила, но времени ковырять исходник на тему как это проще сделать у меня нету. Если Автор подскажет, как получить пары типа подсеть-скорость, подсеть-скорость... - вставлю.
2. Резать исходящий трафик ингресс дисциплиной с политикой дроп - это конечно жестоко

линкапдаун строка 332:
Код: Выделить всё
elsif ($ARGV[0] eq 'pppd') {
my $s_in = $speed_out * 1024;
my $s_out = $speed_in * 1024;
if ($traf_type == 0) {
$s_in = $speed_in * 1024;
$s_out = $speed_out * 1024;
}
my $s_deltain = 104857600 - $s_in;
if ($speed_in > 0) {
# Ограничение входящего (с точки зрения клиента) трафика
push @FW_ACTIONS, "/sbin/tc qdisc del dev $INTERFACE root &>/dev/null";
push @FW_ACTIONS, "/sbin/tc qdisc add dev $INTERFACE root handle 1: htb default 20";
# Вся полоса = 100Мбит. Предполагается, что клиент подключён через ethernet (PPPoE или PPTP)
push @FW_ACTIONS, "/sbin/tc class add dev $INTERFACE parent 1: classid 1:1 htb rate 104857600bit";
# Полоса, в которую заворчивается трафик, скорость которого НЕ НАДО ограничивать
push @FW_ACTIONS, "/sbin/tc class add dev $INTERFACE parent 1:1 classid 1:10 htb rate $s_deltain"."bit ceil 104857600bit";
# Полоса с ограничением скорости
push @FW_ACTIONS, "/sbin/tc class add dev $INTERFACE parent 1:1 classid 1:20 htb rate $s_in"."bit";
# Дисциплины обслуживания полос
push @FW_ACTIONS, "/sbin/tc qdisc add dev $INTERFACE parent 1:10 handle 10: sfq perturb 10";
push @FW_ACTIONS, "/sbin/tc qdisc add dev $INTERFACE parent 1:20 handle 20: sfq perturb 10";
# Трафик из приватных сетей пропускаем без ограничения скорости
push @FW_ACTIONS, "/sbin/tc filter add dev $INTERFACE parent 1: protocol ip prio 1 u32 match ip src 10.0.0.0/8 flowid 1:10";
push @FW_ACTIONS, "/sbin/tc filter add dev $INTERFACE parent 1: protocol ip prio 1 u32 match ip src 172.16.0.0/12 flowid 1:10";
push @FW_ACTIONS, "/sbin/tc filter add dev $INTERFACE parent 1: protocol ip prio 1 u32 match ip src 192.168.0.0/16 flowid 1:10";
# Остальной трафик (типа из инета) попадёт в дефолтовый класс с ограничением скорости
}
if ($speed_out > 0) {
# Ограничение исходящего (с точки зрения клиента) трафика
push @FW_ACTIONS, "/sbin/tc qdisc del dev $INTERFACE ingress &>/dev/null";
push @FW_ACTIONS, "/sbin/tc qdisc add dev $INTERFACE handle ffff: ingress";
# Трафик в приватные сети пропускаем без ограничения скорости
push @FW_ACTIONS, "/sbin/tc filter add dev $INTERFACE parent ffff: protocol ip prio 1 u32 match ip dst 10.0.0.0/8 flowid :1";
push @FW_ACTIONS, "/sbin/tc filter add dev $INTERFACE parent ffff: protocol ip prio 1 u32 match ip dst 172.16.0.0/12 flowid :1";
push @FW_ACTIONS, "/sbin/tc filter add dev $INTERFACE parent ffff: protocol ip prio 1 u32 match ip dst 192.168.0.0/16 flowid :1";
# Остальной трафик (типа в инет) попадает под ограничение скорости
push @FW_ACTIONS, "/sbin/tc filter add dev $INTERFACE parent ffff: protocol ip prio 2 u32 match ip dst 0.0.0.0/0 police rate $s_out"."bit burst 20k drop flowid :1";
}
}
#FreeBSD ipfw pipe shaper
У меня такой вопрос
При редактировании Тарифы трафика в пункте
Система/ Dialup / VPN/ Тарифные планы/ Интервалы/
есть поле Выражения
Так вот, облазил форум и прочитал доки и нигде не нашёл описания этого поля
1) Как его можно использовать, отдельно или совместно с полем NETS
И какой синтаксис надо использовать?
2) Могу ли я использовать стандартные перловые regexp'ы?
Например описать пару внутренних трафиков таким образом:
Для чего мне это нужно?
Я делаю перловым скриптом детальную статистику по трафикам/субтрафикам (хостам+протоколам+портам) пользователей на основе данных NETFLOW. Соответственно параметры для обработки хочу брать из базы abills.
И описывать трафики хотелось бы одним шаблоном, чтоб обрабатывать за 1 проход.
3) Кстати, посему ещё вопрос
каков порядок проверки при обработке IP, если один из трафиков содержит в себе подсеть, входящую в бОльшую сеть в другом трафике.
К примеру
субтрафик 0 = 0.0.0.0/24
субтрафик 1 = 192.168.10.0/24
субтрафик 2 = 192.168.10.0/25
Пакет с IP 192.168.10.34 куда попадёт?
А если номера трафиков сменить в обратном направлении?
Заранее благодарен
При редактировании Тарифы трафика в пункте
Система/ Dialup / VPN/ Тарифные планы/ Интервалы/
есть поле Выражения
Так вот, облазил форум и прочитал доки и нигде не нашёл описания этого поля
1) Как его можно использовать, отдельно или совместно с полем NETS
И какой синтаксис надо использовать?
2) Могу ли я использовать стандартные перловые regexp'ы?
Например описать пару внутренних трафиков таким образом:
Код: Выделить всё
внутренний1 - "10\.[12]0\.|192\.168\.15\.|172\.35\.10\.([0-9][0-9]|1[0-2][0-9])"
внутренний2 - "192\.168\.|172\.16\.|10\."
Я делаю перловым скриптом детальную статистику по трафикам/субтрафикам (хостам+протоколам+портам) пользователей на основе данных NETFLOW. Соответственно параметры для обработки хочу брать из базы abills.
И описывать трафики хотелось бы одним шаблоном, чтоб обрабатывать за 1 проход.
3) Кстати, посему ещё вопрос
каков порядок проверки при обработке IP, если один из трафиков содержит в себе подсеть, входящую в бОльшую сеть в другом трафике.
К примеру
субтрафик 0 = 0.0.0.0/24
субтрафик 1 = 192.168.10.0/24
субтрафик 2 = 192.168.10.0/25
Пакет с IP 192.168.10.34 куда попадёт?
А если номера трафиков сменить в обратном направлении?
Заранее благодарен
Человек должен думать, машина - работать
1) http://abills.net.ua./wiki/doku.php?id= ... #intervals
2) а зачем изобретать велосипед? детальная статистика уже реализована в модуле Ipn
3) по наиболее точному совпадению - в субтрафик 2 от номеров трафиков не зависит
2) а зачем изобретать велосипед? детальная статистика уже реализована в модуле Ipn
3) по наиболее точному совпадению - в субтрафик 2 от номеров трафиков не зависит
Кстати я что-то не вижу, где в IPN детальная статистика, наверное лыжи не едутran писал(а):2) а зачем изобретать велосипед? детальная статистика уже реализована в модуле Ipn

У меня скрипт делает детальную статистику по трафикам/субтрафикам (хостам+протоколам+портам) пользователей.
причём имена хостов я делаю не обратным резолвингом, поскольку этим способом, если что-то и выясните, то не факт что это будет реальное имя WEB-сервера, да и вообще зачастую нет имён в обратной зоне.
Я просто парсером при каждой заливке трафика беру имена из логов transparent-proxy сервера и складываю/обновляю в файлик cdb-хеша, где всё это безобразие накапливается для последующего использования. Для невыясненных хостов указываются IP
Получается примерно такая статистика, правда она у меня в красивой html-таблице:
Код: Выделить всё
USER - test
Трафик --Интернет-- подключений Протоколы-порты
sb.google.com 0.288 Mb 54 TCP-80
www.opennet.ru 0.177 Mb 19 TCP-80
nexus.org.ua 0.139 Mb 3 TCP-80
www-128.ibm.com 0.114 Mb 4 TCP-80
informer.gismeteo.ru 0.101 Mb 10 TCP-80
pics.utro.ru 0.066 Mb 2 TCP-80
tbn0.google.com 0.060 Mb 4 TCP-80
a.gismeteo.ru 0.049 Mb 10 TCP-80
an.yandex.ru 0.038 Mb 4 TCP-80
www.google.com 0.027 Mb 6 TCP-80
images.google.com 0.023 Mb 7 TCP-80
static.feed.rbc.ru 0.013 Mb 2 TCP-80
counter.rambler.ru 0.005 Mb 8 TCP-80
www.ibm.com 0.004 Mb 8 TCP-80
top.list.ru 0.004 Mb 12 TCP-80
top8.list.ru 0.004 Mb 6 TCP-80
tools.spylog.ru 0.004 Mb 2 TCP-80
engine.awaps.net 0.003 Mb 2 TCP-80
button.blogs.yandex.net 0.003 Mb 2 TCP-80
hitsrv3.hotlog.ru 0.003 Mb 4 TCP-80
top3.list.ru 0.002 Mb 4 TCP-80
dyn.gismeteo.ru 0.002 Mb 2 TCP-80
counter.yadro.ru 0.002 Mb 2 TCP-80
u9121.01.spylog.com 0.002 Mb 2 TCP-80
www.google-analytics.com 0.001 Mb 4 TCP-80
top100-images.rambler.ru 0.001 Mb 4 TCP-80
c.bigmir.net 0.001 Mb 2 TCP-80
80.91.249.20 0.000 Mb 3 ICMP-0
82.116.1.46 0.000 Mb 3 ICMP-0
213.248.104.142 0.000 Mb 3 ICMP-0
213.248.97.173 0.000 Mb 3 ICMP-0
217.150.45.197 0.000 Mb 3 ICMP-0
ya.ru 0.000 Mb 4 ICMP-0
Итого --Интернет-- 1.139 Mb
Трафик --Внутренний-- подключений Протоколы-порты
192.168.10.54 0.301 Mb 5 TCP-22
tech.dom.local 0.078 Mb 8 TCP-80
stat.dom.local 0.025 Mb 2 TCP-22
88.230.162.250 0.010 Mb 12 TCP-3128
88.230.162.1 0.000 Mb 3 ICMP-0
88.230.162.28 0.000 Mb 3 ICMP-0
88.230.162.17 0.000 Mb 3 ICMP-0
Итого --Внутренний-- 0.416 Mb
Человек должен думать, машина - работать
Кстати я что-то не вижу, где в IPN детальная статистика, наверное лыжи не едутran писал(а):2) а зачем изобретать велосипед? детальная статистика уже реализована в модуле Ipn

У меня скрипт делает детальную статистику по трафикам/субтрафикам (хостам+протоколам+портам) пользователей.
причём имена хостов я делаю не обратным резолвингом, поскольку этим способом, если что-то и выясните, то не факт что это будет реальное имя WEB-сервера, да и вообще зачастую нет имён в обратной зоне.
Я просто парсером при каждой заливке трафика беру имена+IP из логов transparent-proxy сервера и складываю/обновляю в файлик cdb-хеша, где всё это безобразие накапливается для последующего использования. Для невыясненных хостов указываются IP
Получается примерно такая статистика, правда она у меня в красивой html-таблице:
Код: Выделить всё
USER - test
Трафик --Интернет-- подключений Протоколы-порты
sb.google.com 0.288 Mb 54 TCP-80
www.opennet.ru 0.177 Mb 19 TCP-80
nexus.org.ua 0.139 Mb 3 TCP-80
www-128.ibm.com 0.114 Mb 4 TCP-80
informer.gismeteo.ru 0.101 Mb 10 TCP-80
pics.utro.ru 0.066 Mb 2 TCP-80
tbn0.google.com 0.060 Mb 4 TCP-80
a.gismeteo.ru 0.049 Mb 10 TCP-80
an.yandex.ru 0.038 Mb 4 TCP-80
www.google.com 0.027 Mb 6 TCP-80
images.google.com 0.023 Mb 7 TCP-80
static.feed.rbc.ru 0.013 Mb 2 TCP-80
counter.rambler.ru 0.005 Mb 8 TCP-80
www.ibm.com 0.004 Mb 8 TCP-80
top.list.ru 0.004 Mb 12 TCP-80
top8.list.ru 0.004 Mb 6 TCP-80
tools.spylog.ru 0.004 Mb 2 TCP-80
engine.awaps.net 0.003 Mb 2 TCP-80
button.blogs.yandex.net 0.003 Mb 2 TCP-80
hitsrv3.hotlog.ru 0.003 Mb 4 TCP-80
top3.list.ru 0.002 Mb 4 TCP-80
dyn.gismeteo.ru 0.002 Mb 2 TCP-80
counter.yadro.ru 0.002 Mb 2 TCP-80
u9121.01.spylog.com 0.002 Mb 2 TCP-80
www.google-analytics.com 0.001 Mb 4 TCP-80
top100-images.rambler.ru 0.001 Mb 4 TCP-80
c.bigmir.net 0.001 Mb 2 TCP-80
80.91.249.20 0.000 Mb 3 ICMP-0
82.116.1.46 0.000 Mb 3 ICMP-0
213.248.104.142 0.000 Mb 3 ICMP-0
213.248.97.173 0.000 Mb 3 ICMP-0
217.150.45.197 0.000 Mb 3 ICMP-0
ya.ru 0.000 Mb 4 ICMP-0
Итого --Интернет-- 1.139 Mb
Трафик --Внутренний-- подключений Протоколы-порты
192.168.10.54 0.301 Mb 5 TCP-22
tech.dom.local 0.078 Mb 8 TCP-80
stat.dom.local 0.025 Mb 2 TCP-22
88.230.162.250 0.010 Mb 12 TCP-3128
88.230.162.1 0.000 Mb 3 ICMP-0
88.230.162.28 0.000 Mb 3 ICMP-0
88.230.162.17 0.000 Mb 3 ICMP-0
Итого --Внутренний-- 0.416 Mb
Человек должен думать, машина - работать
Видимо в моей версии этого нет, я из портов собирал в январе - 0.37bran писал(а):/ Отчёт/ IP Net/ Детали/ или / Клиенты/ Логины/ Информация/ Сервисы/ IP Net/ Детали/ если у тебя конечно её сбор настроенКстати я что-то не вижу, где в IPN детальная статистика, наверное лыжи не едут
Человек должен думать, машина - работать
Перелез - обновился с CVS
Автору за биллинг премного благодарен, наверное как и все, кто им пользуется. Поэтому скажу только о том, что на мой взгляд можно доработать.
Почти везде в коде указаны абсолютные пути (где-то в форуме уже на это жаловались) надо бы в настройки вынести пути, или брать из системных настроек.
Детализация IPN теперь есть, и в общем то это лучше чем никакой, но по ряду параметров она не совсем удобная., потому что:
- не отражается тип протокола, хотя это реализовать вполне можно - в netflow данные есть.
- нельзя агрегировать по типам трафиков из ТП, но это уже сложнее и возможно не настолько актуально.
- база статистики IPN быстро растёт, и для значительного уменьшения размера, предлагаю после определённого срока агрегировать её по дням, месяцам и т.п.
- нельзя агрегировать по отрезкам времени (не выводить кучу записей за отрезок времени, а именно агрегировать в минимальное количество строк)
- обратный резолвинг имён - почти бесполезен, в отличие от моего метода разрешения имён с лога прокси.
По последнему пункту с лога SQUIDа берутся пары FQDN <-> IP
Можно юзать типа такого скриптика, для сбора данных:
Автору за биллинг премного благодарен, наверное как и все, кто им пользуется. Поэтому скажу только о том, что на мой взгляд можно доработать.
Почти везде в коде указаны абсолютные пути (где-то в форуме уже на это жаловались) надо бы в настройки вынести пути, или брать из системных настроек.
Детализация IPN теперь есть, и в общем то это лучше чем никакой, но по ряду параметров она не совсем удобная., потому что:
- не отражается тип протокола, хотя это реализовать вполне можно - в netflow данные есть.
- нельзя агрегировать по типам трафиков из ТП, но это уже сложнее и возможно не настолько актуально.
- база статистики IPN быстро растёт, и для значительного уменьшения размера, предлагаю после определённого срока агрегировать её по дням, месяцам и т.п.
- нельзя агрегировать по отрезкам времени (не выводить кучу записей за отрезок времени, а именно агрегировать в минимальное количество строк)
- обратный резолвинг имён - почти бесполезен, в отличие от моего метода разрешения имён с лога прокси.
По последнему пункту с лога SQUIDа берутся пары FQDN <-> IP
Можно юзать типа такого скриптика, для сбора данных:
Код: Выделить всё
#!/usr/bin/perl
$debug=1;
$proxylog="/var/log/squid/access.log";
$IP2FQDN="/usr/abills/ip2fqdn.cdb";
tie %ip2fqdn, 'DB_File', "$IP2FQDN" or die "Cant open IP2FQDN file: $!\n";
open(LOG,"$proxylog");
while (<LOG>) {
if (/^\d+\.\d+\s+\S+\s+\S+\s+\S+\s+\d+\s+(CONNECT\s+|\S+\s+\w+tp:\/\/)([\w+\-\.]+)(\/|:\d+\/)\S+\s+\S+\s+DIRECT\/(\d+\.\d+\.\d+\.\d+)\s+\S/) {
$ip2fqdn{"$4"} = "$2";
print STDERR "$4 \t$2\n" if $debug > 0;
}
}
close LOG;
untie %ip2fqdn;
Человек должен думать, машина - работать
писАл когда-то про это в запросе новых возможностей... однажды меня это достало, я прошерстил все сырцы на предмет путей и понаделал симлинковTux писал(а):Почти везде в коде указаны абсолютные пути (где-то в форуме уже на это жаловались)


тоже грил Асмодеусу. Правишь строчку 513 в Abills/modules/Ipn/traffic2sql на:Детализация IPN теперь есть, и в общем то это лучше чем никакой, но по ряду параметров она не совсем удобная., потому что:
- не отражается тип протокола, хотя это реализовать вполне можно - в netflow данные есть.
Код: Выделить всё
$DATA{PROTOCOL} = $9;
Код: Выделить всё
PROTOCOL => $DATA->{PROTOCOL} || 0,

Зачем? А если сквида нету? Лучше запрос в обратную зону днс делать... тоже грил уже... и ваще... это всё наверно в запрос новых возможностей нада, а не сюда - офтоп аднакаПо последнему пункту с лога SQUIDа берутся пары FQDN <-> IP
Можно юзать типа такого скриптика, для сбора данных:
Может и оффтоп, но я уже объяснял почему запрос в обратную зону днс НЕ ЛУЧШЕ.ran писал(а):Зачем? А если сквида нету? Лучше запрос в обратную зону днс делать... тоже грил уже... и ваще... это всё наверно в запрос новых возможностей нада, а не сюда - офтоп аднакаTux писал(а):По последнему пункту с лога SQUIDа берутся пары FQDN <-> IP
Можно юзать типа такого скриптика, для сбора данных:
Потому что фиг чего ты вразумительного найдёшь в обратной зоне. Нужны подтверждения? Типичный пример:
Код: Выделить всё
# host www.gismeteo.ru
www.gismeteo.ru is an alias for web.gismeteo.ru.
web.gismeteo.ru has address 212.48.138.18
# host 212.48.138.18
Host 18.138.48.212.in-addr.arpa not found: 3(NXDOMAIN)
Но если они есть, и не обязательно на той же машине, где Abills, то предложенный cdb-файлик будет очень кстати.
Человек должен думать, машина - работать