IP Accounting на MikroTik — учёт трафика
IP Accounting на MikroTik — учёт трафика по IP-адресам
IP Accounting — встроенная функция RouterOS для подсчёта трафика по каждой паре IP-адресов (source → destination). Для каждой пары фиксируется количество пакетов и байт. Это самый простой способ узнать, сколько трафика потребил каждый хост в сети — без установки внешних коллекторов, без SNMP, без сложной настройки. Включается одной командой. IP Accounting полезен для базового учёта в небольших провайдерских сетях, анализа потребления трафика в офисе и как источник данных для простых биллинговых систем.
Руководство актуально для RouterOS 7.20+.
Описание
Что такое IP Accounting
IP Accounting собирает статистику по каждому IP-потоку, проходящему через маршрутизатор. Для каждой уникальной пары «source IP — destination IP» создаётся запись с количеством пакетов и байт.
Данные хранятся в таблице фиксированного размера (threshold — максимальное количество записей). Когда таблица заполняется — новые записи не добавляются, пока таблица не будет сброшена (через snapshot).
codeАбонент 192.168.1.10 → google.com (142.250.74.46) Packets: 1520 Bytes: 2 048 576 (2 MB) Абонент 192.168.1.10 → yandex.ru (77.88.55.242) Packets: 340 Bytes: 512 000 (500 KB) Абонент 192.168.1.20 → netflix.com (54.74.73.31) Packets: 45 000 Bytes: 67 108 864 (64 MB)
Что фиксируется
| Поле | Описание |
|---|---|
| src-address | IP-адрес источника |
| dst-address | IP-адрес назначения |
| packets | Количество пакетов |
| bytes | Объём трафика в байтах |
IP Accounting не фиксирует порты, протоколы, время или направление. Только IP-адреса и объём. Для более детальной статистики используйте Traffic Flow (NetFlow).
IP Accounting vs Traffic Flow
| Параметр | IP Accounting | Traffic Flow (NetFlow) |
|---|---|---|
| Детализация | Только IP + bytes | IP, порт, протокол, DSCP, AS |
| Хранение | Таблица в RAM (ограничена) | Экспорт на внешний коллектор |
| История | Нет (только текущий snapshot) | На коллекторе (дни, месяцы, годы) |
| Нагрузка на CPU | Минимальная | Минимальная (v9/IPFIX) |
| Настройка | 1 команда | Нужен коллектор |
| Визуализация | CLI / API / Web | ntopng, Grafana, Elastiflow |
| Масштаб | Малые сети (до 500 хостов) | Любой масштаб |
| Биллинг | Простой (суммирование по IP) | Полный (по направлениям, протоколам) |
Когда использовать IP Accounting:
- Быстро посмотреть, кто потребляет трафик
- Простой учёт для малого ISP (до 200–500 абонентов)
- Экспорт данных в скрипт или простую биллинговую систему
- Не нужен внешний коллектор
Когда использовать Traffic Flow:
- Нужна детальная статистика (порты, протоколы)
- Нужна история за длительный период
- Нужна визуализация (графики, top talkers)
- Более 500 хостов
Настройка
Шаг 1: Включение IP Accounting
[admin@MikroTik] ># Включаем IP Accounting /ip/accounting/set enabled=yes threshold=4096 # threshold — максимальное количество записей в таблице # Для малой сети (50 хостов): threshold=2048 # Для средней сети (200 хостов): threshold=4096 # Максимум: threshold=8192
Параметр threshold определяет размер таблицы. Каждая запись — пара src/dst IP + счётчики. Если в сети 100 абонентов и каждый обращается к 20 уникальным IP, потребуется 2000 записей. Рекомендуется ставить threshold с запасом 2x.
Шаг 2: Просмотр данных
[admin@MikroTik] ># Текущая таблица accounting /ip/accounting/snapshot/take # Просмотр snapshot /ip/accounting/snapshot/print # Фильтр по конкретному IP /ip/accounting/snapshot/print where src-address=192.168.1.10 # Фильтр по destination /ip/accounting/snapshot/print where dst-address~"142.250"
Важно: команда snapshot/take фиксирует текущую таблицу и сбрасывает счётчики. Данные в snapshot доступны до следующего snapshot/take.
Шаг 3: Включение Web-доступа
IP Accounting может отдавать данные через HTTP — это удобно для внешних систем (биллинг, скрипты):
[admin@MikroTik] ># Включаем Web-доступ к accounting /ip/accounting/web-access/set accessible-via-web=yes address=172.16.0.0/24 # address — подсеть, из которой разрешён доступ
После этого данные доступны по адресу:
codehttp://<router-ip>/accounting/ip.cgi
Формат вывода — текст, по одной записи на строку:
code192.168.1.10 142.250.74.46 1520 2048576 192.168.1.10 77.88.55.242 340 512000 192.168.1.20 54.74.73.31 45000 67108864
Каждая строка: src-address dst-address packets bytes
Шаг 4: Скрипт автоматического snapshot
По умолчанию таблица accounting заполняется до threshold и перестаёт обновляться. Для непрерывного учёта нужно периодически делать snapshot и обрабатывать данные.
Скрипт: автоматический snapshot каждые 5 минут с записью в лог:
[admin@MikroTik] ># Создаём скрипт /system/script/add name=accounting-snapshot source={ # Делаем snapshot (фиксируем данные и сбрасываем счётчики) /ip/accounting/snapshot/take # Подсчитываем общий трафик по каждому абоненту :local totalBytes 0 :local count 0 :foreach entry in=[/ip/accounting/snapshot/find] do={ :set count ($count + 1) } /log info message="IP Accounting snapshot: $count entries captured" } # Планировщик: каждые 5 минут /system/scheduler/add name=accounting-auto-snapshot \ interval=5m \ on-event="/system/script/run accounting-snapshot" \ comment="Auto snapshot IP Accounting every 5 min"
Скрипт: экспорт данных через fetch (отправка на внешний сервер):
[admin@MikroTik] ># Скрипт экспорта accounting на внешний сервер /system/script/add name=accounting-export source={ /ip/accounting/snapshot/take # Отправляем данные на сервер биллинга /tool/fetch url="http://172.16.0.10:8080/api/accounting" \ http-method=post \ http-header-field="Content-Type: text/plain" \ http-data=[/ip/accounting/snapshot/print as-value] \ output=none /log info message="IP Accounting data exported to billing" } /system/scheduler/add name=accounting-export-schedule \ interval=5m \ on-event="/system/script/run accounting-export" \ comment="Export IP Accounting to billing"
Шаг 5: Подсчёт трафика конкретного абонента (скрипт)
[admin@MikroTik] ># Скрипт подсчёта трафика для конкретного IP /system/script/add name=user-traffic source={ :local targetIP "192.168.1.10" :local totalDownload 0 :local totalUpload 0 /ip/accounting/snapshot/take # Download: dst-address = абонент (трафик ИЗ интернета К абоненту) :foreach entry in=[/ip/accounting/snapshot/find where dst-address=$targetIP] do={ :local bytes [/ip/accounting/snapshot/get $entry bytes] :set totalDownload ($totalDownload + $bytes) } # Upload: src-address = абонент (трафик ОТ абонента В интернет) :foreach entry in=[/ip/accounting/snapshot/find where src-address=$targetIP] do={ :local bytes [/ip/accounting/snapshot/get $entry bytes] :set totalUpload ($totalUpload + $bytes) } :local dlMB ($totalDownload / 1048576) :local ulMB ($totalUpload / 1048576) /log info message="Traffic for $targetIP: Download=$dlMB MB, Upload=$ulMB MB" }
ISP-сценарий: простой биллинг на IP Accounting
Для малого провайдера (50–200 абонентов) IP Accounting может заменить полноценный биллинг. Схема:
- IP Accounting собирает данные на MikroTik
- Внешний скрипт (Python/Bash) каждые 5 минут забирает данные через
/accounting/ip.cgi - Скрипт суммирует трафик по IP-адресам и записывает в базу данных
- При превышении лимита — скрипт через API MikroTik переключает абонента на заблокированный профиль
Пример Python-скрипта для сбора данных:
pythonimport requests from datetime import datetime # Забираем данные с MikroTik response = requests.get("http://172.16.0.1/accounting/ip.cgi", auth=("admin", "password")) for line in response.text.strip().split("\n"): parts = line.split() if len(parts) == 4: src_ip, dst_ip, packets, bytes_count = parts # Записываем в БД save_to_db(src_ip, dst_ip, int(packets), int(bytes_count), datetime.now())
Проверка
Проверка статуса IP Accounting
[admin@MikroTik] ># Статус /ip/accounting/print # Ожидаемый вывод: # enabled: yes # threshold: 4096 # missed: 0
Поле missed показывает количество потерянных записей (если таблица переполнилась). Если missed > 0 — увеличьте threshold или чаще делайте snapshot.
Проверка snapshot
[admin@MikroTik] ># Сделать snapshot /ip/accounting/snapshot/take # Просмотреть данные /ip/accounting/snapshot/print # Количество записей в snapshot /ip/accounting/snapshot/print count-only
Проверка Web-доступа
[admin@MikroTik] ># Из командной строки MikroTik /tool/fetch url="http://127.0.0.1/accounting/ip.cgi" output=user # Или из браузера: # http://172.16.0.1/accounting/ip.cgi
Мониторинг переполнения таблицы
[admin@MikroTik] ># Проверяем missed-записи /ip/accounting/print # Если missed > 0 — таблица переполнялась # Увеличиваем threshold /ip/accounting/set threshold=8192
Типичные ошибки
Ошибка 1: Таблица переполнена — данные теряются
Симптомы: поле missed растёт, не все пары IP-адресов попадают в таблицу.
Причина: threshold слишком мал для количества уникальных пар src/dst в сети.
Решение:
[admin@MikroTik] ># Увеличиваем threshold /ip/accounting/set threshold=8192 # И настраиваем автоматический snapshot каждые 5 минут # (чтобы таблица сбрасывалась до переполнения)
Ошибка 2: Забыли сделать snapshot — данные не обновляются
Симптомы: данные в /ip/accounting/snapshot/print устаревшие или пустые.
Причина: snapshot фиксирует таблицу в момент вызова. Без регулярного snapshot данные не обновляются.
Решение: настройте scheduler для автоматического snapshot (см. Шаг 4 выше).
Ошибка 3: Web-доступ открыт для всех
Симптомы: данные accounting доступны из интернета, утечка информации об абонентах.
Причина: accessible-via-web=yes без ограничения address.
Решение:
[admin@MikroTik] ># Ограничиваем доступ только из management-сети /ip/accounting/web-access/set accessible-via-web=yes address=172.16.0.0/24 # Дополнительно — закрываем порт 80 в firewall от внешних сетей /ip/firewall/filter/add chain=input in-interface=ether1-wan protocol=tcp \ dst-port=80 action=drop comment="Block web access from WAN"
Ошибка 4: IP Accounting считает трафик после NAT
Симптомы: вместо внутренних IP-адресов абонентов в src-address отображается внешний IP (NAT-адрес).
Причина: IP Accounting по умолчанию учитывает пакеты после NAT-трансляции. Если NAT меняет src-address на внешний IP — accounting видит уже изменённый адрес.
Решение: это зависит от цепочки обработки пакетов. Убедитесь, что accounting работает с нужными адресами. Для forward-трафика (абонент → интернет) accounting обычно видит оригинальный src-address до NAT.
Ошибка 5: Нагрузка на CPU при большом threshold
Симптомы: повышенная нагрузка CPU на маршрутизаторе.
Причина: при threshold=8192 и большом количестве потоков обработка таблицы потребляет ресурсы. На слабых устройствах (hEX, hAP) это может быть заметно.
Решение: для слабых устройств ограничьте threshold до 2048 и делайте snapshot чаще (каждые 2–3 минуты). Для серьёзного учёта используйте Traffic Flow + внешний коллектор.
Итоги
IP Accounting — простейший инструмент учёта трафика на MikroTik. Включается одной командой, не требует внешнего ПО. Подходит для быстрой диагностики и базового учёта в малых сетях. Ключевые правила:
- Включение:
/ip/accounting/set enabled=yes threshold=4096 - Обязательно настройте автоматический snapshot (scheduler каждые 5 минут)
- Ограничьте web-access конкретной подсетью
- Следите за полем missed — если > 0, увеличивайте threshold
- Для сетей более 500 хостов или при необходимости детальной статистики — используйте Traffic Flow
- IP Accounting не заменяет полноценный биллинг, но может быть его источником данных
Абонент 192.168.1.10 → google.com (142.250.74.46)
Packets: 1520
Bytes: 2 048 576 (2 MB)
Абонент 192.168.1.10 → yandex.ru (77.88.55.242)
Packets: 340
Bytes: 512 000 (500 KB)
Абонент 192.168.1.20 → netflix.com (54.74.73.31)
Packets: 45 000
Bytes: 67 108 864 (64 MB)
# Включаем IP Accounting
/ip/accounting/set enabled=yes threshold=4096
# threshold — максимальное количество записей в таблице
# Для малой сети (50 хостов): threshold=2048
# Для средней сети (200 хостов): threshold=4096
# Максимум: threshold=8192
# Текущая таблица accounting
/ip/accounting/snapshot/take
# Просмотр snapshot
/ip/accounting/snapshot/print
# Фильтр по конкретному IP
/ip/accounting/snapshot/print where src-address=192.168.1.10
# Фильтр по destination
/ip/accounting/snapshot/print where dst-address~"142.250"
# Включаем Web-доступ к accounting
/ip/accounting/web-access/set accessible-via-web=yes address=172.16.0.0/24
# address — подсеть, из которой разрешён доступ
http://<router-ip>/accounting/ip.cgi
192.168.1.10 142.250.74.46 1520 2048576
192.168.1.10 77.88.55.242 340 512000
192.168.1.20 54.74.73.31 45000 67108864
# Создаём скрипт
/system/script/add name=accounting-snapshot source={
# Делаем snapshot (фиксируем данные и сбрасываем счётчики)
/ip/accounting/snapshot/take
# Подсчитываем общий трафик по каждому абоненту
:local totalBytes 0
:local count 0
:foreach entry in=[/ip/accounting/snapshot/find] do={
:set count ($count + 1)
}
/log info message="IP Accounting snapshot: $count entries captured"
}
# Планировщик: каждые 5 минут
/system/scheduler/add name=accounting-auto-snapshot \
interval=5m \
on-event="/system/script/run accounting-snapshot" \
comment="Auto snapshot IP Accounting every 5 min"
# Скрипт экспорта accounting на внешний сервер
/system/script/add name=accounting-export source={
/ip/accounting/snapshot/take
# Отправляем данные на сервер биллинга
/tool/fetch url="http://172.16.0.10:8080/api/accounting" \
http-method=post \
http-header-field="Content-Type: text/plain" \
http-data=[/ip/accounting/snapshot/print as-value] \
output=none
/log info message="IP Accounting data exported to billing"
}
/system/scheduler/add name=accounting-export-schedule \
interval=5m \
on-event="/system/script/run accounting-export" \
comment="Export IP Accounting to billing"
# Скрипт подсчёта трафика для конкретного IP
/system/script/add name=user-traffic source={
:local targetIP "192.168.1.10"
:local totalDownload 0
:local totalUpload 0
/ip/accounting/snapshot/take
# Download: dst-address = абонент (трафик ИЗ интернета К абоненту)
:foreach entry in=[/ip/accounting/snapshot/find where dst-address=$targetIP] do={
:local bytes [/ip/accounting/snapshot/get $entry bytes]
:set totalDownload ($totalDownload + $bytes)
}
# Upload: src-address = абонент (трафик ОТ абонента В интернет)
:foreach entry in=[/ip/accounting/snapshot/find where src-address=$targetIP] do={
:local bytes [/ip/accounting/snapshot/get $entry bytes]
:set totalUpload ($totalUpload + $bytes)
}
:local dlMB ($totalDownload / 1048576)
:local ulMB ($totalUpload / 1048576)
/log info message="Traffic for $targetIP: Download=$dlMB MB, Upload=$ulMB MB"
}
### Проверка
#### Проверка статуса IP Accounting
Поле `missed` показывает количество потерянных записей (если таблица переполнилась). Если missed > 0 — увеличьте threshold или чаще делайте snapshot.
#### Проверка snapshot
#### Проверка Web-доступа
#### Мониторинг переполнения таблицы
### Типичные ошибки
#### Ошибка 1: Таблица переполнена — данные теряются
**Симптомы:** поле `missed` растёт, не все пары IP-адресов попадают в таблицу.
**Причина:** threshold слишком мал для количества уникальных пар src/dst в сети.
**Решение:**
#### Ошибка 2: Забыли сделать snapshot — данные не обновляются
**Симптомы:** данные в `/ip/accounting/snapshot/print` устаревшие или пустые.
**Причина:** snapshot фиксирует таблицу в момент вызова. Без регулярного snapshot данные не обновляются.
**Решение:** настройте scheduler для автоматического snapshot (см. Шаг 4 выше).
#### Ошибка 3: Web-доступ открыт для всех
**Симптомы:** данные accounting доступны из интернета, утечка информации об абонентах.
**Причина:** `accessible-via-web=yes` без ограничения `address`.
**Решение:**