====== Description of NAT statistics ====== {{indexmenu_n>4}} The output of statistics in fastdpi_stat.log is set by dbg_log_mask. 0x40000 - output of NAT initialization details (profiles, public addresses, etc.) to the alert log \\ 0x100000 - output of statistics by blocks of public addresses (if 0x2000000 is set) \\ 0x2000000 - NAT statistics output. **Example:** \\ dbg_log_mask=0x2000000 ==== Common for all profiles ==== [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 - internal index of the private<-->public proile converter. iprof - internal index of the profile profile - profile name nttype - profile type (0 - cgnat, 1 - 1:1) ref_cnt - counter of references of converter usage by profiles (Profiles can use one set of CIDR, but different number of restrictions per session) cidr - list of profile's public addresses CIDR ==== CG-NAT Profile ==== [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 ==== Information on the data converter ==== k=0, itrnsld=0, cidr=94.140.198.84/30 k - itrnsld number itrnsld - internal converter data index - the one serving the CIDR cidr - exact cidr total - total statistics actual - статистика изменеий счетчиков за период вывода статистики (delta_alarm parameter, 15 seconds by default) total TCP : 30/20/0/7/17 0/0/0 50/20/0/50/0 5516/8/121 **Four groups группы:** \\ 1 group -- operations with public address ports 30/20/0/7/17: 30 - allocation of a new public port 20 - public port reuse 0 - errors of allocating a new public port 7 - performs decrement of number of subscriber sessions on flow releasing 17 - performs decrement of the number of subscriber sessions on public port reuse 2 group -- general statistics 0/0/0: 0 - calculated CRC by IP when accessed to allocate a public address. Should be == 0 0 - excessive number of sessions for subscribers 0 - different public addresses in flow and converters - Should be == 0 3 group -- cache statistics //private --> public// 50/20/0/50/0: 50 - added records to cache 20 - deleted records from cache 0 - found records in cache when new public port is allocated 50 - no public address found for private 0 - errors of adding to cache 4 group -- conversion statistics //public --> private// (//inet-->subs//) 5516/8/121: 5516 - successful translation public --> private 8 - port is not in the allocated range of public ports 121 - translation public --> private was not found For TCP/UDP and total/actual statistics are the same. For GRE – it is GRE by default (when session is not found in PPTP). Only one such session can be created per public address. total GRE : 0/0 0 - address used 0 - number of attempts to create sessions on an already allocated public address ==== 1:1 Profile ==== [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 Group 2 statistics: \\ 1 group - 256/256/0/0/0/0 \\ 2 group - 0/0 **Example:** \\ dbg_log_mask=0x2100000 ==== Output of public addresses statistics ==== [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 - addresses mask nwhaddr - the number of public addresses that are under the mask 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 - public address sb=64 - port block size lsb=64 - size of the last block nb=1008 - number of port blocks whpa=64512 - total ports whpb=0 - ports occupied whpf=64512 - free ports awhb=4 - blocks issued fwhb=1004 - free blocks puwhb=0.40% - percentage of blocks occupied === Added in version 12.1.0 === whp_salfs - how many ports are in the 'short' queue whp_lalfs - how many ports are in the 'long' queue whp_ruse - how many ports can be reused whp_ruse_salfs - how many ports can be reused from the 'short' queue whp_ruse_lalfs - how many ports can be reused from the 'long' queue whp_dthr - how many ports were created in one worker thread but used in another thread whp_dthr_salfs - how many ports were created in one worker thread but used in another from the 'short' queue whp_dthr_lalfs - how many ports were created in one worker thread but used in another from the 'long' queue Within the public address you can see the distribution of captured ports/blocks by worker threads thr=0, ublock=1, uport=0 thr=0 - worker thread number ublock=1 - public ports blocks used uport=0 - public ports used thr_salfs - how many ports are in the 'short' queue thr_lalfs - how many ports are in the 'long' queue thr_ruse - how many ports can be reused thr_ruse_salfs - how many ports can be reused from the 'short' queue thr_ruse_lalfs - how many ports can be reused from the 'long' queue thr_dthr - how many ports were created in one worker thread but used in another thread thr_dthr_salfs - how many ports were created in one worker thread but used in another from the 'short' queue thr_dthr_lalfs - how many ports were created in one worker thread but used in another from 'long' queue The output format is the same. 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 **Output:** 192.168.4.20 - private IP crcip=0xd649d853 - CRC of the private IP nttype=0 - NAT type: 0 - cgnat, 1 - 1:1 profile='cgnat' - profile name itrnsl=0 - internal index of the converter private<-->public profile. itrnsld=0 - internal converter data index whiteip=94.140.198.86 - public address sess_tcp=127 - number of TCP sessions sess_udp=108 - number of UDP sessions indmtd=4 - internal index of subscriber data (subscriber metadata) 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 The format is the same. === Key to command to view NAT profile statistics via fdpi_ctrl === Command: fdpi_ctrl list status --service 11 --profile.name cgnat Output: 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 Key: nttype - profile type (0 - cgnat, 1 - 1:1) profile - profile name itrnsl - internal index of private<-->public profile converter nitrnsld - number of profile converter data (number of CIDR) itrnsld - internal converter data index - the one serving the CIDR cidr - exact CIDR proto - TCP/UDP ip_mask - addresses mask nwhaddr - the number of public addresses which fall under the mask or CRC (depends on rx_dispatcher parameter) whip - public address sb - size of the block of ports to be allocated lsb - size of the last block nb - number of prot blocks whpa - ports in total whpb - ports occupied whpf - free ports awhb - blocks issued fwhb - free blocks puwhb - percentage of blocks occupied whp_salfs - is in the 'short' queue whp_lalfs - in the 'long' queue whp_ruse - can be used whp_ruse_salfs - can be used in 'short' queue whp_ruse_lalfs - can be used in 'long' queue whp_dthr - number of elements ithr_owner != ithr by queue whp_dthr_salfs - number of elements ithr_owner != ithr by 'short' queue whp_dthr_lalfs - number of elements ithr_owner != ithr by 'long' queue ''rx_dispatcher'' parameter description [[dpi:opt_cgnat:сgnat_settings#parameters_and_possible_values|at the link]] === Key to command to view the dump NAT profile statistics === Command: fdpi_cli nat dump whaddr queue test_nat_cgnat Output: 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 Key: profile - profile name itrnsl - internal index of the private<-->public profile converter cidr - exact CIDR itrnsld - internal converter data index - the one serving the CIDR whip - public address proto - TCP/UDP The implementation of the used ports queue for public addresses uses a single array - let's call it WHP, of size 0xffff. It is used to build a list of used ports for the worker thread. Index 0 is used as a stub (empty). Thread queues cannot be output as a list, because records in the queue are moved in the process, which may cause the output to loop. Therefore, the WHP array is output 'as is' for occupied entries. entryp : sets entry points to the list of public ports of the worker thread ithr - worker thread number ihead - top of the list itail - the last element of the list data : WHP white port array data (only occupied entries are output) sind - record index inext - next record index iprev - previous record index whport - public port graddr - private address, which the public address is assigned to tml - time of the last record access lifetime - timeout, time in seconds, the record lifetime (depends on the parameters for short/long queue) canreuse - sign that the record can be used again ialf - number of the processing queue : en_nalfs_shrt = 0, # queue with a short lifetime en_nalfs_long = 1, # long queue indmtd - internal index of the subscriber's data (subscriber's metadata) iown - owner thread which has created the record ilst - number of the thread which has last accessed the record subproto - the protocol the record was allocated for from 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 - a mark that the port usage counter on the private address has decremented ind_gcache_slice - index of the 'private --> public' transcoding cache-slice igcache - index in the corresponding cache-slice recoding 'private --> public'