Я использую Traffic Flow
с pmacct (nfacct) для ведения учета IP.
Я заметил, что если поток превышает ~ 4 ГБ менее чем за минуту (это мой active-flow-timeout
) экспортируемый поток Octets
счетчик оборачивается вокруг потери значительного количества общих данных.
Я считаю, что это проблема с 32-битным беззнаковым счетчиком октетов, и если трафик превышает этот порог (4294967296
), то экспортер оборачивается вокруг счетчика, не отправляя сначала поток в сборщик (я не уверен, как другие поставщики справляются с этим).
Это довольно серьезно, так как приводит к очень неправильным подсчетам трафика!
Вот моя конфигурация потока трафика:
/ip traffic-flow
set active-flow-timeout=1m cache-entries=1k enabled=yes interfaces=sfp1
/ip traffic-flow target
add dst-address=X.X.X.X v9-template-refresh=60 v9-template-timeout=1m
А вот пара снимков потока из wirehark.
Flow 3
[Duration: 59.590000000 seconds (switched)]
Packets: 5700194
Octets: 4255323704
InputInt: 16
OutputInt: 0
SrcAddr: 31.X.X.254
DstAddr: 185.X.X.254
Protocol: UDP (17)
IP ToS: 0x00
SrcPort: 2043 (2043)
DstPort: 2299 (2299)
NextHop: 185.X.X.X
DstMask: 0
SrcMask: 0
TCP Flags: 0x00
Destination Mac Address: Routerbo_XX:XX:XX (d4:ca:6d:XX:XX:XX)
Post Source Mac Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
Post NAT Source IPv4 Address: 31.X.X.254
Post NAT Destination IPv4 Address: 185.X.X.254
Post NAPT Source Transport Port: 0
Post NAPT Destination Transport Port: 0
Второй захват:
Flow 3
[Duration: 59.590000000 seconds (switched)]
Packets: 5532208
Octets: 4003344704
InputInt: 16
OutputInt: 0
SrcAddr: 31.X.X.254
DstAddr: 185.X.X.254
Protocol: UDP (17)
IP ToS: 0x00
SrcPort: 2043 (2043)
DstPort: 2299 (2299)
NextHop: 185.X.X.X
DstMask: 0
SrcMask: 0
TCP Flags: 0x00
Destination Mac Address: Routerbo_XX:XX:XX (d4:ca:6d:XX:XX:XX)
Post Source Mac Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
Post NAT Source IPv4 Address: 31.X.X.254
Post NAT Destination IPv4 Address: 185.X.X.254
Post NAPT Source Transport Port: 0
Post NAPT Destination Transport Port: 0
Во время этих захватов в течение некоторого времени проводился тест пропускной способности (UDP, 1500 байт, 1 Гбит, прием). Так работает на 1 Гбит в течение 60 секунд (active-flow-timeout
) он должен был иметь размер не менее ~7864320000
Октеты (~ 7,3 ГБ)
Если я уменьшу тест полосы пропускания до 460 Мбит, то экспортированные потоки, похоже, будут правильно сообщать о трафике, поскольку счетчик октетов не превышает 32-битный максимум без знака. Хотя я вижу довольно много накладных расходов, и мне интересно, почему это так. При устойчивом трафике 460 Мбит за 60 секунд он должен измерить ~3617587200
октеты (= 3,36 ГБ). Но вместо этого он измерил 4269160500
(= 3,9 ГБ) Я не уверен, откуда взялись лишние ~ 600 МБ.
Flow 6
[Duration: 59.590000000 seconds (switched)]
Packets: 2846107
Octets: 4269160500
InputInt: 16
OutputInt: 0
SrcAddr: 31.X.X.254
DstAddr: 185.X.X.254
Protocol: UDP (17)
IP ToS: 0x00
SrcPort: 2058 (2058)
DstPort: 2314 (2314)
NextHop: 185.X.X.X
DstMask: 0
SrcMask: 0
TCP Flags: 0x00
Destination Mac Address: Routerbo_0d:95:72 (d4:ca:6d:XX:XX:XX)
Post Source Mac Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
Post NAT Source IPv4 Address: 31.X.X.254
Post NAT Destination IPv4 Address: 185.X.X.254
Post NAPT Source Transport Port: 0
Post NAPT Destination Transport Port: 0
Но если я увеличу тест полосы пропускания, например, до 480 Мбит, тогда счетчик экспортируемого потока будет обернут вокруг потери значительного количества данных (то есть: ~ 4 ГБ данных)
Flow 3
[Duration: 59.590000000 seconds (switched)]
Packets: 2865308
Octets: 2994704 <-- Only 2.8MB?! Even with 64byte packets,
based on the measured packets above,
it should have measured > 174MBytes of data!
InputInt: 16
OutputInt: 0
SrcAddr: 31.X.X.254
DstAddr: 185.X.X.254
Protocol: UDP (17)
IP ToS: 0x00
SrcPort: 2055 (2055)
DstPort: 2311 (2311)
NextHop: 185.X.X.X
DstMask: 0
SrcMask: 0
TCP Flags: 0x00
Destination Mac Address: Routerbo_0d:95:72 (d4:ca:6d:XX:XX:XX)
Post Source Mac Address: 00:00:00_00:00:00 (00:00:00:00:00:00)
Post NAT Source IPv4 Address: 31.X.X.254
Post NAT Destination IPv4 Address: 185.X.X.254
Post NAPT Source Transport Port: 0
Post NAPT Destination Transport Port: 0
Вышеупомянутые тесты были выполнены на CCR1036-8G-2S + с версией 6.32.1 (я не могу выполнить обновление, поскольку это производственная система).
Выполнение тех же тестов на установке x86 (работающая под управлением 6.29 - также невозможно обновить, потому что она находится в производстве) результаты еще хуже! Кажется, что счетчик октетов оборачивается на 2147483647
что предполагает, что либо в версиях <6.32.1, либо в сборках, отличных от Tilera, счетчик октетов имеет 32-битную подпись.
Вся ситуация примерно такая же, когда вы отслеживаете интерфейс Gbit с v1 SNMP (32-битные счетчики). Решение в SNMP очень простое. Используйте SNMP v2, который поддерживает 64-битные счетчики. Но я не могу найти никакого решения для Netflow.
Может ли кто-нибудь еще подтвердить эту проблему? Кто-нибудь знает обходной путь? Это ограничение протокола netflow или ошибка RouterOS? Как с этим справляются другие поставщики (на данный момент у меня нет другого оборудования, чтобы проверить это)?
Глядя на Документация Cisco в NetFlow v9 упоминается, что счетчик байтов по умолчанию 32-битный, но он настраивается и предлагает увеличить его до 64-битного на основных маршрутизаторах и т. д.
В некоторых случаях размер типа поля фиксируется по определению, например PROTOCOL или IPV4_SRC_ADDR. Однако в других случаях они определяются как вариантный тип. Это повышает эффективность использования памяти в сборщике и снижает требования к пропускной способности сети между экспортером и сборщиком. Например, в случае IN_BYTES на маршрутизаторе доступа может быть достаточно использования 32-битного счетчика (N = 4), на базовом маршрутизаторе потребуется 64-битный счетчик (N = 8). Все счетчики и подобные счетчикам объекты представляют собой целые числа без знака размером N * 8 бит.
Таким образом, сам протокол может поддерживать 64-битные счетчики. Просто кажется, что в шаблоне mikrotik v9 используются 32-битные счетчики.
Я только что подтвердил это, захватив шаблон данных в wirehark.
FlowSet 1 [id=0] (Data Template): 256,257
FlowSet Id: Data Template (V9) (0)
FlowSet Length: 184
Template (Id = 256, Count = 22)
Template Id: 256
Field Count: 22
Field (1/22): LAST_SWITCHED
Field (2/22): FIRST_SWITCHED
Field (3/22): PKTS
Field (4/22): BYTES
Type: BYTES (1)
Length: 4
Field (5/22): INPUT_SNMP
Field (6/22): OUTPUT_SNMP
Field (7/22): IP_SRC_ADDR
Field (8/22): IP_DST_ADDR
Field (9/22): PROTOCOL
Field (10/22): IP_TOS
Field (11/22): L4_SRC_PORT
Field (12/22): L4_DST_PORT
Field (13/22): IP_NEXT_HOP
Field (14/22): DST_MASK
Field (15/22): SRC_MASK
Field (16/22): TCP_FLAGS
Field (17/22): DESTINATION_MAC
Field (18/22): SOURCE_MAC
Field (19/22): postNATSourceIPv4Address
Field (20/22): postNATDestinationIPv4Address
Field (21/22): postNAPTSourceTransportPort
Field (22/22): postNAPTDestinationTransportPort
Template (Id = 257, Count = 21)
Template Id: 257
Field Count: 21
Field (1/21): IP_PROTOCOL_VERSION
Field (2/21): IPV6_SRC_ADDR
Field (3/21): IPV6_SRC_MASK
Field (4/21): INPUT_SNMP
Field (5/21): IPV6_DST_ADDR
Field (6/21): IPV6_DST_MASK
Field (7/21): OUTPUT_SNMP
Field (8/21): IPV6_NEXT_HOP
Field (9/21): PROTOCOL
Field (10/21): TCP_FLAGS
Field (11/21): IP_TOS
Field (12/21): L4_SRC_PORT
Field (13/21): L4_DST_PORT
Field (14/21): FLOW_LABEL
Field (15/21): IPV6_OPTION_HEADERS
Field (16/21): LAST_SWITCHED
Field (17/21): FIRST_SWITCHED
Field (18/21): BYTES
Type: BYTES (1)
Length: 4
Field (19/21): PKTS
Field (20/21): DESTINATION_MAC
Field (21/21): SOURCE_MAC
Поле байтов имеет длину 4.
Думаю, MikroTik должен это исправить.
Если кто-то не знает решения / обходного пути.