Подсчёт трафика по IP

Раздел для тех, кто начинает знакомиться с MikroTik
Правила форума
Как правильно оформить вопрос.
Прежде чем начать настройку роутера, представьте, как это работает. Попробуйте почитать статьи об устройстве интернет-сетей. Убедитесь, что всё, что Вы задумали выполнимо вообще и на данном оборудовании в частности.
Не нужно изначально строить Наполеоновских планов. Попробуйте настроить простейшую конфигурацию, а усложнения добавлять в случае успеха постепенно.
Пожалуйста, не игнорируйте правила русского языка. Отсутствие знаков препинания и неграмотность автора топика для многих гуру достаточный повод проигнорировать топик вообще.

1. Назовите технологию подключения (динамический DHCP, L2TP, PPTP или что-то иное)
2. Изучите темку "Действия до настройки роутера".
viewtopic.php?f=15&t=2083
3. Настройте согласно выбранного Вами мануала
4. Дочитайте мануал до конца и без пропусков, в 70% случаев люди просто не до конца читают статью и пропускают важные моменты.
5. Если не получается, в Winbox открываем терминал и вбиваем там /export hide-sensitive. Результат в топик под кат, интимные подробности типа личных IP изменить на другие, пароль забить звездочками.
6. Нарисуйте Вашу сеть, рисунок (схему) сюда. На словах может быть одно, в действительности другое.
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Как вариант писать результаты в текстовый файл. После перезагрузки всегда можно будет считать данные из файла. Я когда-то набрасывал простыню, но вылизывать времени не хватило, потом надобность отпала. Если не лень, смотрите, пользуйтесь. Как условие - результатом поделиться со мной. Если результат необходимо сохранить неопубликованным, я его не буду публиковать.
 Набросок подсчета трафика

Код: Выделить всё

{
# Script from podarok66, may 2014.
:global temprx ;
:global temptx ;
:local rx [/interface get [find name=ether1] rx-byte]  ;
:local tx [/interface get [find name=ether1] tx-byte]  ;
:if ([:len [/file find name=rx.txt]]>0) do={
/file set [/file find name=rx.txt] content=(( $rx - $temprx ) + [/file get [find name=rx.txt] content]) ;
}   else={/file print file=rx.txt;
:delay 5 ;
/file set [/file find name=rx.txt] content=$rx ;
}
:if ([:len [/file find name=tx.txt]]>0) do={/file set [/file find name=tx.txt] content=(( $tx - $temptx ) + [/file get [find name=tx.txt] content]) ;
}   else={/file print file=tx.txt ;
:delay 5 ;
/file set [/file find name=tx.txt] content=$tx ;
}
:set temprx $rx ;
# :put "temprx=$temprx" ;
:set temptx $tx ;
# :put "temptx=$temptx" ;
:local rdata "01"
:local year [:pick [system clock get date] 7 11 ];
:local months [:toarray "jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec"] ;
:local month [:pick [system clock get date] 0 3 ];
:local month2 ;
:local day [:pick [system clock get date] 4 6 ]
:for mindex from=0 to=[:len $months] do={
  :if ([:pick $months $mindex] = $month) do={:set month2 ($mindex-1) }
};
:if ($month2 = -1) do={:set month2 11 ; :set year ($year - 1) };
# :put [:pick $months $month2];
# :put   [$year];
:if  ($day=$rdata) do={:local smtpserv [:resolve "smtp.gmail.com"];
:local Eaccount "ПОЧТОВЫЙ АДРЕС";
:local pass "ПАРОЛЬПОЧТЫ";
:local reporttheme  ("Traffic Report " .  $year . "-" . $month . "-" . $day);
:local rxreport [/file get [/file find name=rx.txt] content];
:local simplKbrxreport ($rxreport / 1024);
:local lowKbrxreport ((($rxreport - ($simplKbrxreport * 1024)) * 1000) / 1024);
:local Kbrxreport ("$[$simplKbrxreport]".",".[:pick "$[$lowKbrxreport]" 0 2] );
# :put $Kbrxreport
:local simplMbrxreport ($rxreport / 1048576);
:local lowMbrxreport  ((($rxreport - ($simplMbrxreport * 1048576)) * 1000000) /  1048576);
:local Mbrxreport ("$[$simplMbrxreport]".",".[:pick "$[$lowMbrxreport]" 0 2] );
# :put $Mbrxreport;
:local simplGbrxreport ($rxreport / 1073741824);
:local lowGbrxreport  ((($rxreport - ($simplGbrxreport * 1073741824)) * 1000000000) /  1048576);
:local Gbrxreport ("$[$simplGbrxreport]".",".[:pick "$[$lowGbrxreport]" 0 2] );
# :put $Gbrxreport;
:local txreport [/file get [/file find name=tx.txt] content];
:local simplKbtxreport ($txreport / 1024);
:local lowKbtxreport ((($txreport - ($simplKbtxreport * 1024)) * 1000) / 1024);
:local Kbtxreport ("$[$simplKbtxreport]".",".[:pick "$[$lowKbtxreport]" 0 2] );
# :put $Kbtxreport;
:local simplMbtxreport ($txreport / 1048576);
:local lowMbtxreport  ((($txreport - ($simplMbtxreport * 1048576)) * 1000000) /  1048576);
:local Mbtxreport ("$[$simplMbtxreport]".",".[:pick "$[$lowMbtxreport]" 0 2] );
# :put $Mbtxreport;
:local simplGbtxreport ($txreport / 1073741824);
:local lowGbtxreport  ((($txreport - ($simplGbtxreport * 1073741824)) * 1000000000) /  1048576);
:local Gbtxreport ("$[$simplGbtxreport]".",".[:pick "$[$lowGbtxreport]" 0 2] );
# :put $Gbtxreport;
:local conbody ("Traffic Report for " . [:pick $months $month2] . "-" . [:pick [:if ([:pick $months $month2]!="dec") do={$year} else={($year - 1)}] 1] . "
 Incoming traffic - " . $Kbrxreport . "Kb" . ";" . "
" . $Mbrxreport . "Mb" . ";" . "
" . $Gbrxreport . "Gb" . "." . "
" . "Outbound traffic - "  . $Kbtxreport . "Kb" . ";" . "
" . $Mbtxreport . "Mb" . ";" . "
" . $Gbtxreport . "Gb" . ".");
:delay 2;
# :put $conbody;
/file remove [find name=report.txt];
:delay 3;
/file print file=report.txt;
:delay 5;
/file set [find name=report.txt] content=$conbody ;
:delay 5;
/tool e-mail send from="<$Eaccount>" to=$Eaccount server=$smtpserv port=587 user=$Eaccount password=$pass start-tls=yes file=report.txt subject=$reporttheme body=$conbody ;
:delay 20;
 /file remove [find name=rx.txt];
 /file remove [find name=tx.txt]
}


Если выкинуть все переводы трафика из одних единиц в другие, вполне себе скромный скрипт должен выйти...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
siroc-co
Сообщения: 3
Зарегистрирован: 17 сен 2014, 10:32
Откуда: Moscow

Спасибо, буду разбираться. Результат не жалко, выложу тут для общей критики и как следствие улучшения итогового решения )


MikroTik CRS109-8G-1S-2HnD-IN
Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Нужны будут комментарии, пиши, постараюсь вспомнить...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
siroc-co
Сообщения: 3
Зарегистрирован: 17 сен 2014, 10:32
Откуда: Moscow

Продублирую тут:
Ну вот, форум заработал.
И так, чего придумал\достиг:
Пришла идея, собирать количественную инфу об интернет трафике средствами Mangle:
всего два правила, маркируем исходящий трафик,
ИзображениеИзображение

маркируем входящий трафик
ИзображениеИзображение

Получаем вот что:

Изображение

Общее количество принятого\отправленного интернет трафика конкретного IP адреса. После рестарта роутера обнуляется. Почему учитывается именно интернет трафик - не знаю. Но локальный таким образом у меня не считается, может потому, что все сетевые порты, кроме WAN, объединены в LAN. Интернет трафик считает очень точно, по крайней мере скачав файлов на гигабайт получаем примерно это же число, +/- ~5-10 Мб, понятно, что не учитывал служебную информацию, другой трафик, и т.д.
То есть кол-во трафика считать можем. Осталось доставать эту цифру скриптом, также получать время, в которое извлекаем информацию о количестве трафика, и соответственно узнаем кол-во трафика за промежуток времени. В чём, собственно, и состоит задача.

Как реализовать?

Чтоб вытащить значение количества трафика трафика из Mangle нагуглил такой кусок скрипта, точнее команду:

Код: Выделить всё

:local a [/ip fi mangle get number=3 bytes]; :put $a;

Если это исполнить в терминале микротика, то получим значение в "bytes" третьего по порядку правила, в моем случае Rx:

Изображение

Значение мы вытащили. Теперь нужно его куда-то сохранить. Сначала я хотел сохранять эти данные на флешку вставленную в микротик в txt файл, но я не смог передать это значение туда, а также я не смог прикрутить к значению трафика информацию с датой\временем в виде "мм.чч.сс чч.мм.гг", чтобы выхлоп был примерно такой 15:55:43 02.03.2015 7389735466,
А в итоге для каждого IP был бы файл 192.168.XXX.XXX.txt в котором содержимое вида:
01.02.2015 Rx 1.7GiB Tx 0.30GiB
02.02.2015 Rx 3.2GiB Tx 0.95GiB
и т.д. хотяб посуточно. Но обойтись только роутером не получилось...
Решено было отправлять на сторонний сервер в БД. У меня есть Synology, на нем БД. Также был найден метод отправки значения в БД php скриптом, через GET запрос с микротика. Это такой командой:

Код: Выделить всё

:local iPadRx "[/ip fi mangle get number=3 bytes]" 
/tool fetch url="http://192.168.XXX.XXX/index.php/$iPadRx" mode=http\

php скрипт обрабатывает GET запрос, и передаёт данные в БД, время фиксируется по приходу значения в БД. Таким образом просто тупо складываем значения в БД.
Теперь нужно написать скрипт, который бы брал предыдущее значение, вычитал его из текущего, и заносил в БД, так мы узнаем кол-во трафика за промежутки времени. При таких данных можно вычислить и среднюю скорость передачи данных за промежуток времени. А потом и графики отрисовать, на том же php, например. Но...

Весна пришла, погодка лучше и лучше. Скоро мотосезон открывать... Вобщем чёт не до скриптов и микротиков. Может есть такие, кому это кроме меня надо, может кто-то доделает... Или сам сделаю. В любом случае продолжение будет :-):

P.S. Критика, замечания, предложения - жду с нетерпением.


MikroTik CRS109-8G-1S-2HnD-IN
siroc-co
Сообщения: 3
Зарегистрирован: 17 сен 2014, 10:32
Откуда: Moscow

Иногда по непонятным причинам порядок правил в Mangle меняется. Не понял от чего зависит. Например если раньше правлило стояло под порядковым номером 3, то иногда всё переконтовывается, и правило попадает под другой порядковый номер, например 5.
Соответственно доработал поиск. Ищем не по номеру, а по коментарию.
Было:

Код: Выделить всё

:local a [/ip fi mangle get number=3 bytes]; :put $a;


Стало:

Код: Выделить всё

:local a [/ip fi mangle get [find comment="iPad_prinyal"] bytes]; :put $a;


Теперь находит именно то, что требуется.

P.S. Кстати, кто знает как отправить полноценный GET или POST запрос с параметрами? Почему-то из строки запроса убирается знак вопроса, и ничего не работает.


MikroTik CRS109-8G-1S-2HnD-IN
Ответить