Описание статистики NAT [Документация VAS Experts]

Описание статистики NAT

Вывод статистики NAT возможен в stat_log и через fdpi_ctrl.
Вывод информации по очередям возможно сделать dump NAT профиля через fdpi_cli.

Вывод статистики в fastdpi_stat.log

Задается с помощью параметра dbg_log_mask в /etc/dpi/fastdpi.conf.
Для применения требуется релоад сервиса: service fastdpi reload Пример:
dbg_log_mask=0x2000000

0x40000 - вывод в alert лог детализации инициализации NAT (профили, белые адреса и прочее)
0x100000 - вывод статистики по блокам белых адресов (если задано 0x2000000)
0x2000000 - вывод статистики по NAT.

Общее для всех профилей

[STAT    ][2021/12/22-17:33:17:513859] NAT statistics : itrnsl=0, iprof=2, profile 'cgnat', nttype=0, ref_cnt=1, cidr=94.140.198.84/30
[STAT    ][2021/12/22-17:33:17:513869] NAT statistics : itrnsl=1, iprof=3, profile 'nat1_1', nttype=1, ref_cnt=1, cidr=16.35.121.0/24

    itrnsl  - внутренний индекс преобразователя серый <--> белый профиля.
    iprof   - внутренний индекс профиля
    profile - имя профиля
    nttype  - тип профиля (0 - cgnat, 1 - 1:1)
    ref_cnt - счетчик ссылок использования преобразователя профилями 
    (Профили могут использовать один набор бесклассовых IP сетей, но разное количество ограничений на сессии)
    cidr    - список бесклассовых белых адресов профиля 

Профиль CG-NAT

[STAT    ][2021/12/22-17:33:19:252622] NAT statistics : itrnsl=0, iprof=2, profile 'cgnat', nttype=0, ref_cnt=1, cidr=94.140.198.84/30
        k=0, itrnsld=0, cidr=94.140.198.84/30
                total  TCP : 30/20/0/7/17/ 0/0/0 50/20/0/50/0 5516/8/121
                actual TCP : 0/0/0/0/0 0/0/0 0/0/0/0/0 0/0/0
                total  UDP : 13/4/0/13/1/ 0/0/0 17/4/11/17/0 28/1/3
                actual UDP : 0/0/0/0/0 0/0/0 0/0/0/0/0 0/0/0
                total GRE : 0/0

Информация по преобразователю данных

        k=0, itrnsld=0, cidr=94.140.198.84/30
    k       - номер itrnsld
    itrnsld - внутренний индекс данных преобразователя - того, кто обслуживает бесклассовые IP сети
    cidr    - конкретная бесклассовая IP сеть

    total   - суммарная статистика
    actual  - статистика изменений счетчиков за период вывода статистики (параметр delta_alarm, default 15 секунд) 

    total  TCP : 30/20/0/7/17 0/0/0 50/20/0/50/0 5516/8/121

Четыре группы:
1 группа -- операции с портами белых адресов

30/20/0/7/17:

30 - выделение нового белого порта 
20 - повторное использование белого порта 
0  - ошибки получения нового белого порта
7  - выполняет декремент количества сессий абонента по освобождению flow
17 - выполняет декремент количества сессий абонента по повторному использованию белого порта

2 группа -- общая статистика

0/0/0:

0 - раcсчитали CRC по IP при обращении для выделения белого адреса. Должно быть == 0 
0 - превышение количества сессий для абонентов
0 - разные белые адреса в flow и преобразователях - Должно быть == 0

3 группа -- статистика по кэшу серый -→ белый

50/20/0/50/0:

50 - добавлено записей в кэш
20 - удалено записей из кэша
0  - найдено записей в кэше при выделении нового белого порта
50 - не найдено по серому белый адрес
0  - ошибки добавления в кэш

4 группа -- статистика преобразования белый -→ серый (inet-→subs)

5516/8/121: 

5516 - успешно проведена трансляция белый --> серый
8    - порт не попадает в выделенный диапазон белых портов
121  - не найдена трансляция белый --> серый

Для TCP/UDP и total/actual статистика одинаковая.

Для GRE - это GRE по умолчанию (когда не смогли в туннельном протоколе "точка-точка" найти сессию). На белый адрес может быть создана только одна такая сессия.

total GRE : 0/0
0 - использован адрес 
0 - количество попыток создания сессий на уже занятый белый адрес

Профиль 1:1

[STAT    ][2021/12/22-17:17:28:749622] NAT statistics : itrnsl=1, iprof=3, profile 'nat1_1', nttype=1, ref_cnt=1, cidr=16.35.121.0/24
        k=0, itrnsld=1, cidr=16.35.121.0/24
                total 256/256/0/0/0/0 0/0

Статистика 2 группы:
1 группа - 256/256/0/0/0/0
2 группа - 0/0

Пример:
dbg_log_mask=0x2100000

Вывод статистики по белым адресам

[STAT    ][2021/12/22-21:14:48:385991] NAT statistics : itrnsl=0, iprof=2, profile 'cgnat', nttype=0, ref_cnt=1, cidr=94.140.198.84/30
        k=0, itrnsld=0, cidr=94.140.198.84/30
                total  TCP : 26/4/0/4/2/ 0/0/0 30/4/0/30/0 3045/1/36
                actual TCP : 0/0/0/0/0 0/0/0 0/0/0/0/0 0/0/0
                        TCP whiteblck ip_mask=0x0, nwhaddr=2
                                whip=94.140.198.84 : sb=64, lsb=64, nb=1008, whpa=64512, whpb=0, whpf=64512, awhb=4, fwhb=1004, puwhb=0.40%
                                        thr=0, ublock=1, uport=0
                                        thr=1, ublock=1, uport=0
                                        thr=2, ublock=1, uport=0
                                        thr=3, ublock=1, uport=0
                                whip=94.140.198.86 : sb=64, lsb=64, nb=1008, whpa=64512, whpb=26, whpf=64486, awhb=4, fwhb=1004, puwhb=0.40%
                                        thr=0, ublock=1, uport=0
                                        thr=1, ublock=1, uport=0
                                        thr=2, ublock=1, uport=13
                                        thr=3, ublock=1, uport=13
TCP whiteblck ip_mask=0x0, nwhaddr=2 :

    ip_mask - маска адресов 
    nwhaddr - количество белых адресов, которые попадают под маску
whip=94.140.198.84 : sb=64 ( 64 ), nb=1008, whpa=64512, whpb=0, whpf=64512, awhb=4, fwhb=1004, puwhb=0.40%

    whip=94.140.198.84 - белый адрес
    sb=64       - размер блока портов
    lsb=64      - размер последнего блока
    nb=1008     - количество блоков портов
    whpa=64512  - всего портов
    whpb=0      - занято портов
    whpf=64512  - свободно портов
    awhb=4      - выдано блоков
    fwhb=1004   - свободно блоков
    puwhb=0.40% - процент занятости блоков

Добавлено в версии 12.1.0

whp_salfs 	- сколько портов в 'короткой' очереди
whp_lalfs 	- сколько портов в 'длинной' очереди
whp_ruse  	- сколько портов может быть использовано повторно
whp_ruse_salfs 	- сколько портов может быть использовано повторно из 'короткой' очереди
whp_ruse_lalfs 	- сколько портов может быть использовано повторно из 'длинной' очереди
whp_dthr 	- сколько портов созданы в одном рабочем потоке, но использовались в другом
whp_dthr_salfs	- сколько портов созданы в одном рабочем потоке, но использовались в другом из 'короткой' очереди
whp_dthr_lalfs	- сколько портов созданы в одном рабочем потоке, но использовались в другом из 'длинной' очереди

В рамках белого адреса видно распределение захваченных портов/блоков по рабочим потокам

thr=0, ublock=1, uport=0
thr=0    - номер рабочего потока
ublock=1 - использовано блоков белых портов 
uport=0  - использовано белых портов
thr_salfs 	- сколько портов в 'короткой' очереди
thr_lalfs 	- сколько портов в 'длинной' очереди
thr_ruse  	- сколько портов может быть использовано повторно
thr_ruse_salfs 	- сколько портов может быть использовано повторно из 'короткой' очереди
thr_ruse_lalfs 	- сколько портов может быть использовано повторно из 'длинной' очереди
thr_dthr 	- сколько портов созданы в одном рабочем потоке, но использовались в другом
thr_dthr_salfs	- сколько портов созданы в одном рабочем потоке, но использовались в другом из 'короткой' очереди
thr_dthr_lalfs	- сколько портов созданы в одном рабочем потоке, но использовались в другом из 'длинной' очереди

Формат вывода сохранился

fdpi_ctrl list status --service 11 --ip 192.168.4.20
Autodetected fastdpi params : dev='em1', port=29001
connecting 94.140.198.68:29001 ...

================================
192.168.4.20    crcip=0xd649d853        nttype=0        profile='cgnat' itrnsl=0 itrnsld=0       whiteip=94.140.198.86   sess_tcp=127    sess_udp=108   indmtd=4

Вывод:

192.168.4.20		- серый IP
crcip=0xd649d853	- CRC серого IP
nttype=0        	- тип NAT: 0 - cgnat, 1 - 1:1
profile='cgnat' 	- имя профиля
itrnsl=0 		- внутренний индекс преобразователя серый <--> белый профиля.
itrnsld=0       	- внутренний индекс данных преобразователя 
whiteip=94.140.198.86 	- белый адрес
sess_tcp=127    	- количество сессий TCP
sess_udp=108   		- количество сессий UDP
indmtd=4              	- внутренний индекс данных абонента (метаданных абонента)

fdpi_ctrl list status --service 11 --ip 192.168.4.20 --outformat=json
fdpi_ctrl list status --service 11 --ip 192.168.4.20 --outformat=json  | jq .

fdpi_ctrl list all status --service 11
fdpi_ctrl list all status --service 11 --outformat=json

Формат аналогично

Легенда команды просмотра статистики NAT профиля через fdpi_ctrl

Команда:

fdpi_ctrl list status --service 11 --profile.name cgnat

Вывод:

nttype=0        profile='test_nat_cgnat'        itrnsl=0        nitrnsld=1
        itrnsld=0       cidr=94.140.198.84/30
                proto=TCP       ip_mask=0x0     nwhaddr=2
                        proto=TCP       ip_mask=0x0     whip=94.140.198.84      sb=64   lsb=64  nb=1008 whpa=64512      whpb=0  whpf=64512      awhb=4  fwhb=1004       puwhb=0.40%     whp_salfs=0     whp_lalfs=0     whp_ruse=0      whp_ruse_salfs=0        whp_ruse_lalfs=0        whp_dthr=0      whp_dthr_salfs=0        whp_dthr_lalfs=0
                                nthr=0  ublock=1        uport=0 thr_salfs=0     thr_lalfs=0     thr_ruse=0      thr_ruse_salfs=0        thr_ruse_lalfs=0        thr_dthr=0      thr_dthr_salfs=0        thr_dthr_lalfs=0
                                nthr=1  ublock=1        uport=0 thr_salfs=0     thr_lalfs=0     thr_ruse=0      thr_ruse_salfs=0        thr_ruse_lalfs=0        thr_dthr=0      thr_dthr_salfs=0        thr_dthr_lalfs=0

Легенда:

nttype         - тип профиля (0 - cgnat, 1 - 1:1)
profile        - имя профиля
itrnsl         - внутренний индекс преобразователя серый<-->белый профиля
nitrnsld       - количество данных преобразователей профиля (количество бесклассовых IP сетей)
itrnsld        - внутренний индекс данных преобразователя - того, кто обслуживает бесклассовые IP сетеи
cidr           - конкретная бесклассовая IP сеть
proto          - протокол TCP/UDP
ip_mask        - маска адресов
nwhaddr        - количество белых адресов, которые попадают под маску или под CRC (зависит от параметра rx_dispatcher)
whip           - белый адрес
sb             - размер блока выделяемых портов.
lsb            - размер последнего блока
nb             - количество блоков портов
whpa           - всего портов
whpb           - занято портов
whpf           - свободно портов
awhb           - выдано блоков
fwhb           - свободно блоков
puwhb          - процент занятости блоков
whp_salfs      - находится в 'короткой' очереди
whp_lalfs      - находится в 'длинной' очереди
whp_ruse       - может быть использовано
whp_ruse_salfs - может быть использовано в 'короткой' очереди
whp_ruse_lalfs - может быть использовано в 'длинной' очереди
whp_dthr       - количество элементов ithr_owner != ithr по очередям
whp_dthr_salfs - количество элементов ithr_owner != ithr по 'short' очереди
whp_dthr_lalfs - количество элементов ithr_owner != ithr по 'long' очереди
Описание параметра rx_dispatcher по ссылке

Легенда команды просмотра статистики dump NAT профиля

Команда:

fdpi_cli nat dump whaddr queue test_nat_cgnat

Вывод:

profile='test_nat_cgnat' itrnsl=0
        cidr='94.140.198.84/30' itrnsld=0
                whip=94.140.198.86
                        proto=TCP
                                entryp :
                                        ithr=0, ihead=0, itail=0
                                        ithr=1, ihead=0, itail=0
                                        ithr=2, ihead=133, itail=265
                                        ithr=3, ihead=193, itail=327
                                data :
                                        sind=129, inext=257, iprev=258, whport=1152, graddr=192.168.4.20:60637 tml='2023/03/06 16:28:09, -00:00:10.657 (7472516905147512 ticks)', lifetime=120, canreuse=0, ialf=1, imtd=516, iown=2, ilst=2, subproto=0, decr_sess=0, ind_gcache_slice=1, igcache=40
                                        sind=130, inext=151, iprev=148, whport=1153, graddr=192.168.4.20:52553 tml='2023/03/06 16:27:50, -00:00:29.455 (7472459405058624 ticks)', lifetime=30, canreuse=0, ialf=0, imtd=516, iown=2, ilst=2, subproto=0, decr_sess=0, ind_gcache_slice=1, igcache=1

Легенда:

profile        - имя профиля
itrnsl         - внутренний индекс преобразователя серый <--> белый профиля

cidr           - конкретная бесклассовая IP сеть
itrnsld        - внутренний индекс данных преобразователя - того, кто обслуживает бесклассовую IP сеть

whip           - белый адрес
proto          - протокол TCP/UDP

Реализация очереди используемых портов для белых адресов использует один массив - назовем его WHP, размером 0xffff. На его основе построен список используемых портов для рабочего потока. Индекс 0 - используется как заглушка (пусто).

Очереди потоков нельзя вывести в виде списка, так как в процессе происходит перемещение записей в очереди, из-за чего вывод может зациклиться. Поэтому массив WHP выводится as is для занятых записей.

entryp : задает точки входа в список белых портов рабочего потока
	ithr   - номер рабочего потока
	ihead  - вершина списка
	itail  - последний элемент списка
data : данные массива белых портов WHP (выводятся только занятые записи)

	sind		 - индекс записи
	inext            - индекс след. записи
	iprev            - индекс пред. записи
	
	whport           - белый порт
	graddr           - серый адрес, которому назначен белый адрес
	tml              - время последнего обращения к записи 
	lifetime         - тайм-аут в секундах время жизни записи (зависит от параметров для short/long очереди)
	canreuse         - признак, что запись может быть использована повторно
	ialf             - номер очереди обработки:
							en_nalfs_shrt = 0,  # очередь с коротким временем жизни
							en_nalfs_long = 1,  # долгоиграющая очередь 
	indmtd           - внутренний индекс данных абонента (метаданных абонента)
	iown             - поток-владелец, который породил запись. 
	ilst             - номер потока, который последний обращался к записи
	subproto         - для какого протокола выделена запись из UDP
						typedef enum en_nat_borrw_udp: u_int8_t
						{
							ennatborwu_ORG     = 0, # UDP/TCP
							ennatborwu_DFLTGRE = 1, # общий GRE 
							ennatborwu_MAX     = 2, # ICMP
						} en_nat_borrw_udp_t;
					   
	decr_sess        - признак, что произошел декремент счетчика использования порта на сером адресе.
	ind_gcache_slice - индекс кэше-slice перекодировки 'серый --> белый'
	igcache          - индекс в соответствующем кэше-slice перекодировки 'серый --> белый' 

Мониторинг свободных/занятых портов на белых адресах

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

свободно портов на белом адресе = whpf (не распределены) + whp_ruse (готовы к переиспользованию)
занято портов на белом адресе = whpb (распределены) - whp_ruse (готовы к переиспользованию)