mikrotik-wiki.ru
Главная
Загрузка...

IP Accounting на MikroTik — учёт трафика

RouterOS 7.xМониторинг7 мин30 мар. 2026 г.
TelegramVK

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-addressIP-адрес источника
dst-addressIP-адрес назначения
packetsКоличество пакетов
bytesОбъём трафика в байтах

IP Accounting не фиксирует порты, протоколы, время или направление. Только IP-адреса и объём. Для более детальной статистики используйте Traffic Flow (NetFlow).

IP Accounting vs Traffic Flow

ПараметрIP AccountingTraffic Flow (NetFlow)
ДетализацияТолько IP + bytesIP, порт, протокол, DSCP, AS
ХранениеТаблица в RAM (ограничена)Экспорт на внешний коллектор
ИсторияНет (только текущий snapshot)На коллекторе (дни, месяцы, годы)
Нагрузка на CPUМинимальнаяМинимальная (v9/IPFIX)
Настройка1 командаНужен коллектор
ВизуализацияCLI / API / Webntopng, 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 — подсеть, из которой разрешён доступ

После этого данные доступны по адресу:

code
http://<router-ip>/accounting/ip.cgi

Формат вывода — текст, по одной записи на строку:

code
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

Каждая строка: 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 может заменить полноценный биллинг. Схема:

  1. IP Accounting собирает данные на MikroTik
  2. Внешний скрипт (Python/Bash) каждые 5 минут забирает данные через /accounting/ip.cgi
  3. Скрипт суммирует трафик по IP-адресам и записывает в базу данных
  4. При превышении лимита — скрипт через API MikroTik переключает абонента на заблокированный профиль

Пример Python-скрипта для сбора данных:

python
import 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. Включается одной командой, не требует внешнего ПО. Подходит для быстрой диагностики и базового учёта в малых сетях. Ключевые правила:

  1. Включение: /ip/accounting/set enabled=yes threshold=4096
  2. Обязательно настройте автоматический snapshot (scheduler каждые 5 минут)
  3. Ограничьте web-access конкретной подсетью
  4. Следите за полем missed — если > 0, увеличивайте threshold
  5. Для сетей более 500 хостов или при необходимости детальной статистики — используйте Traffic Flow
  6. IP Accounting не заменяет полноценный биллинг, но может быть его источником данных
[admin@MikroTik] >
Абонент 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`.

**Решение:**
Мониторинг / IP Accounting на MikroTik — учёт трафика