Jump to content
Калькуляторы

ANAT (Advanced asymmetric CG NAT) xt_ANAT module ядра для Linux

---------------------------------------------------------------------------------------------------------------------------------

ВНИМАНИЕ!

Ввиду обнаружения мною выложенных кем-то исходников ANAT на других ресурсах от моего имени, я  хотел-бы всех предупредить:

я не размещал где либо (в т.ч. на гитхабе) исходные коды ANAT кроме моих ссылок на этом форуме.

Скачивая исходники из других источников вы можете получить не то, на что рассчитываете, в т.ч. "закладки".

-------------------------------------------------------------------------------------------------------------------------------

Чем ANAT лучше простого NAT:

https://forum.nag.ru/index.php?/topic/195398-anat-advanced-asymmetric-cg-nat-xt_anat-module-yadra-dlya-linux/#comment-1754088

-------------------------------------------------------------------------------------------------------------------------------

Всем привет.

Я решил создать отдельную  тему в которой дальше предлагаю обсуждать ANAT.

 

Уважаемые друзья, это версия ANAT на данном этапе публикуется as is ввиду занятости автора, со всеми авторскими комментариями. На данный момент релиз работает без сбоев около 6 месяцев, на последних ядрах 4.х.
Вы можете ее использовать исключительно в некоммерческих целях.
Желающие отблагодарить автора или использовать код для коммерческих целей могут обратиться в личку или на почту в проекте

Ваш автор, Сербулов Дмитрий (aka SDY).

 

=============================================================================

axt_NAT_v0_09_public_01:

https://disk.yandex.ru/d/sZuEr1LopHlVpQ

 

Документация:

Скрытый текст

=====================================================================================================
===== xt_ANAT - Advanced NAT - CG_NAT xt_tables linux kenel module- (c) Serbulov Dmitry Y. 2024 =====

xt_ANAT - Advanced CG NAT linux kenel  module.
xt_ANAT - это модуль ядра встраиваемый в стандартный файрфол linux обеспечивающий работу IPv4 CG-NAT с расширенным функционалом и NETFLOW v9.

xt_ANAT является полностью переработанной автором заменой известного модуля xt_NAT. Основные цели разработки - повышение стабильности модуля за счет изменения
части архитектуры модуля, адаптация для работы на современных процессорах intel, ускорение работы NAT. Предоставление администраторам возможности  гибкого
управления настройками NAT 'на лету' (без перезагрузки модуля). Добавление инструментов для мониторинга и борьбы с DDOS и спамом со стороны пользователей
из локальной сети.

=============================
===== xt_ANAT и CG NAT ======

xt_ANAT соответствует стандартам CG NAT в протоколах TCP, UDP и ICMP, с некоторыми исключениями:
- не поддерживается груповое выделение портов (опыт показал, что для современных приложений это не актуально и лишь ведет к расходу ресурса портов)
- при смене настроек пулов адресов, пользователь может оказаться за разными NAT адресами. В случае необходимости, следует сбросить старые сессии пользователя.
- другие протоколы (далее other) (не TCP, UDP и ICMP) работают в режиме близком к работе conntrack (но с jhash сжатием 32бит диапазона адресов в 16бит).
  Данное решение позволяет нескольким пользователям за одним NAT адресом использовать одновременно такие протоколы как PPTP и прочие протоколы стэка IPv4.
  Планируется доработка xt_ANAT для работы в режиме полного conntrack без jhash сжатия.
  (сроки доработки - новая версия или жалобы пользователей на невозможность использовать IP протоколы или тунели)
 
=====================================
===== xt_ANAT общий функционал ======  

xt_ANAT поддерживает следующие функции
- множество соответвий пулов пользователей пулам NAT адресов (всего до 100 пулов, возможно расширение при необходимости) - (см. ==CONFIG==)
- поддержка пулов NAT адресов 'по умолчанию'
- выбор используемого пула при создании сессии в зависмотси от маркировки пакета правилами файрвола iptables -m --mark (-j MARK --set-mark xxx)
- выбор способа подбора NAT адреса: линейный или hash 'случайный'
- настройка исключения из диапазона выдаваемых адресов х.х.х.0 и х.х.х.256
- изменение настроек пулов адресов и множества праметров модуля 'на лету' (см. ==CONFIG== и ==PARAMS==)
- регистрация и просмотр ошибок и событий ограничения по числу сессий в кольцевом буфере  (см. ==MESSAGES==)
- ТЕСТОВЫЙ IP - позволяет администартору проверить работу сети с любого адреса NAT одной командой (см. ==CMD_TEST_IP_SET==)
- разделение пользователей на группы 'user groups' (далее UG) до 64 группы в т.ч. с помощью маркировки пакета правилом файрвола --mark
- настройка ограничений по максимальному числу сессий и выдачи сообщений администарторам по UG и по дефолту 'на лету' (см. ==CMD_USGR_SET_XXX==)
- приостановка/блокировка пользователя для создания им новых NAT сессий  (см. ==CMD_NAT_XXX==)
- сброс (отключение) сессий пользователей по адресу, порту пользователя, NAT, UG и другим критериям (см. ==CMD_KILL_XXX==)
- трассировка пакетов(регистарция и просмотр сведений проходящих через xt_ANAT пакетов в кольцевом буфере) (см. ==CMD_TRACE_XXX==)
- отправка информации о сессиях по протоколу NetFlow v.9 (далее NF9) при высоконагруженном трафике одновременно до 10 получателям (см. ==NET_FLOW==)
- поддержка в NF9 фукнции KeepAlive и StartTime для длительных сессий или для холодного старта сбора сведений по NF9 без сброса сессий пользователей
- сбор счетчиков статистики для своевременного предупреждения возможных проблем с производительностью и внешнего мониторинга (см. ==STATISTICS==)
- поддержка static sessions (STATIC_MAP) (static port mapping) (см. ==CMD_STATIC_MAP_XXX==)

===============================================================================
===== ==CONFIG== xt_ANAT настройка конфигурации и отправка команд модулю ======

В момент старта, модуль создает в каталоге /proc/net/ANAT/ множество 'файлов' большая часть из которых прдназначена для получения различной информации
о работе и настроках модуля. Полный список доступных ресурсов можно узнать набрав в консоле
$> ls /proc/net/ANAT/
Среди этих файлов есть файл 'config' который доступен не только для чтения, но и для записи. С помощью отправки в него данных происходит настройка работы модуля.

!!! ВАЖНО! Вы можете менять большинство настроек модуля и конфигурацию NAT 'на лету' без остановки работы модуля и сброса сессий пользователей, но
при этом следует учитывать некторые технические моменты, которые подробнее описны в разделе ==HOW_IT_WORK==

Для отправки одновременно большого числа комманд или загрузки настроек конфигурации при старте или во время работы наберите в консоле:
$>cat /etc/anat.conf > /proc/net/ANAT/config
  /etc/anat.conf - можно заменить на произвольный доступный файл в котором содержаться настройки или команды для их выполнения модулем.
 Обычно, в rc.local сразу после загрузки модуля  в 'config' загружаются настройки пулов и получателей NF9, а также начальные команды управления модулем.

Для отправки единичных команд наберите в консоле:
$>echo [CMD_XXX XXXX] >> /proc/net/ANAT/config
  где [CMD_XXX XXXX] - команда которую необходимо выполнить и ее атрибуты, перечень и формат доступных команд (см. ==CMD==).
 
В случае успешной загрузки конфигурации или успешного исполнения команды, в консоле ничего не произойдет, в случае ошибки в консоль будет выведено
сообщение об ошибке. Причину ошибки можно узнать просмотрев debug лог сообщений ядра для чего наберите в консоле:
$>dmesg

Так-же в debug лог выводятся сообщения о критических ошибках в работе модуля, некоторая отладочная информация, инофрмация о ходе выполнения некоторых команд и
загрузке настроек. ВНИМАНИЕ! Информация о событиях связанных с работай NAT выводится в кольцевой буфер (см. ==MESSAGES==).

---
Файл конфигурации и команды имеют следующий формат и особенности.
1. Файл конфигурации обрабатывается построчно.
2. В файле конфигурации допускаются пустые строки.
3. В Файле конфигурации можно использовать комменатрии в отдельных строках. Коментарии начинаются с '#' и заканчиваются концом строки.
4. Максимальная длина строки 127 символов, включая пробелы и табуляции в конце строк!
5. ВСЕ комманды и названия начала и концов секций (см.ниже) заключаются в квадратные скобки '[' ']'.
6. Между '[' и началом команды или названием секций НЕ ДОПУСКАЕТСЯ пробелов!
7. Между ']' и концом некторых команд или названиями секций НЕ ДОПУСКАЕТСЯ пробелов! Избегайте лишних пробелов возле скобок!
8. Перед '[' не допускается каких либо символов кроме пробелов или табуляции.
9. После ']' не допускается каких либо символов кроме пробелов или табуляции.
10. Внутри секций конфигурации формат строк должен строго соблюдаться в зависимости от типа секции.
11. Допускается использовать внутри секций комментарии, если иное прямо не указано в документации.
12. В одной строке должна быть только: или 1 команада, или 1 название начала или конца секции, или 1 строка формата настроек секции.
13. Регистр букв в коммандах, названиях секций и параметрах имеет значение, и должен строго соблюдаться!
14. При описании формата команд или строк секций следует учитывать следующие сокращения и правила.
14.1. Лексемы включенные в квадратные скобки - не обязательны (не путайте их со скобками обрамляющими команды и названия секций).
14.2. Лексемы включенные в фигурные скобки - допустим один из вариантов.
14.3. Лексемы разделенные '|' - используется один из вариантов.
14.4. Если между лексемами есть пробел в форматной строке, значит в этом месте допустимо использовать пробелы.
14.5. Если между лексемами нет пробела в форматной строке, значит в этом месте недопустимо использовать пробелы.
14.6. Принятые стандартные лексемы, сокращения и понятия
14.6.1. ^<T>  - 'trace char' (символ трассировки, буква английского алфавита в верхнем регистре или '@') - примеры: "^T", "^@"
14.6.2. +<UG> - 'user group' (номер группы пользователей от 00 до 63, обязательно 2 цифры!)  - пример: "+00", "+01", "+63"  
14.6.3. с<nnn> - числовое значение сразу после бувы или символа  - пример: "s0", "t1011", "d63"
14.6.4. *L(inear) - лексема '*L' - текст в скобках для пояснения назначения - пример: "*L", "*H"
14.6.5. &<E>, !<mark> - лексема начинающаяся с символа (в данном случае '&' или '!' и некоторым значением за ним - пример: "&3", "!0xFFF0"
14.6.6. : <value> - лексема начинающаяся с символа (в данном случае ':') между которым и ней допустим пробел - пример: ": 443", ": 10.0.0.1"
14.6.7. <value1>  <value2> - лексемы разделенные пробелами - пример:  "10.0.0.1 70.0.0.1"
14.6.8. <value1> - <value2> - лексемы разделенная символом ('-') пробелы не обязательны - пример:  "10.0.0.1-10.0.0.4"
14.6.9. как правило все числовые значения указываются в десятичных числах, исключение - лексема !<mark>, где допускается использовать hex числа с префиксом '0х'
14.7. !!! ВНИМАНИЕ !!! Использовать лексемы можно только СТРОГО в том порядке, в котором они указаны в форматной строке!
 
---
В этом раделе описаны секции и команды связанные с настройкой пулов адресов и пулов получателей NF9. Полное описание доступных команд можно найти далее
в разделе (см. ==CMD==).

Настройку пулов разберем на примере следующего файла конфигурации (test_config.conf):
 
#config sections settings
[LOAD_TMP_CONFIG_V2_0]
#IP pool config
[CFG_NATPOLL_V2_0]
# line format:
#[ [^<T>] [+<UG>] [&<E>] [*L(inear)|*H(ash)] [!<mark>] : ] [ <usr_ip_start> - <usr_ip_end> :] <nat_ip_start> - <nat_ip_end>
# ^ - trace_code for trace packets to msg: <T>-one char from 'A' to 'Z', default = '@'
# + - user_group <UG>='00'..'63': (must be 2 digits, use '01' not '1'), deafult = '00'
# & - nat_use <E>-one digit: '0'- use all NAT ip , '1'- exclude x.0 (move to x.1), '2'- exclude x.255 (move to x.254),
#      '3'- both (1) and (2)), default = '0'
# * - nat_hash ip method : 'L' - linear, 'H' - jhash, default is: 'H'- for defaults user pool 'L'- for all other pools
# ! - mark (take rule only for <mark> marked trafic
#     (if !0 - it the rule is ONLY for non marked trafic, if no !<mark> - rule is for ALL trafic), default - no

^S +01 &3 *L !0x01 :  192.168.0.0 - 192.168.10.055 : 67.100.100.20 - 67.103.102.30 #SPAM
 *H !10 : 10.0.0.123 - 10.0.0.255  :  67.100.100.10 -  67.100.101.20
^T*H!0xFFFF:10.0.0.0-10.0.0.255:70.100.100.66-70.100.100.68
172.0.0.0   - 172.0.0.255     : 70.100.100.69 - 70.100.100.82
80.100.100.65 - 80.100.100.65
[CFG_NATPOLL_END]

#netflow9 desination config
[CFG_NF9DEST_V2_0]
# dest_ip : dest_port
 10.0.0.20 : 2055 #SORM
 10.0.0.21 : 2056
 10.20.2.19: 2055
[CFG_NF9DEST_END]
[LOAD_TMP_CONFIG_END]

# make config working (if loaded no error)
[CMD_CONFIG_TMPTOINA]
[CMD_CONFIG_SWAP]

Обратите внимание:
1. Списки пулов адесов и получателей NF9 находятся внутри специальной секции файла конфигурации [LOAD_TMP_CONFIG_V2_0] - [LOAD_TMP_CONFIG_END]
2. Настройки пулов адесов находятся внутри специальной секции [CFG_NATPOLL_V2_0] - [CFG_NATPOLL_END]
3. Настройки пула получателей NF9 находятся внутри специальной секции [CFG_NF9DEST_V2_0] - [CFG_NF9DEST_END]
!!! Строго соблюдайте названия и формат начала и конца секций, в них не допускаются пробелы или нижний регистр букв !!!

Для каждой строки пула адресов можно указать:
в заголовке
  ^<T>  - 'trace char'  используется для фильтрации сессий и пакетов в командах трассировки и работы с сессиями (атрибут сессии).
  +<UG> - 'user group' используется для фильтрации сессий и пакетов в командах трассировки, работы с сессиями, установки лимитов (атрибут сессии и пользователя).
  &<E>  - настройка запрета выдачи из пула NAT адресов, заканчивающихся на x.0 или x.255 (атрибут строки пула).
        <E> = '0'- не исключать, '1'- исключить x.0 (будет выдан адрес x.1), '2'- исключить x.255 (будет выдан адрес x.254), '3'- исключать x.0 и x.255
  *L|*H - способ подбора NAT адреса из пула (атрибут строки пула).
        *L - линейный (диапазон user IP сжимается линейно) - рекомендуется для плотно используемых диапазонов с прогнозируемой нагрузкой на NAT адрес
        *H - по хэшу (NAT адрес выдается псевдослучайно)   - рекомендуется для разряженных user IP диапазонов или default пулов (см. далее)
  !<mark> - фильтр использования строки пула по --mark пакета, можно указывать как десятичное число, так и hex (с префиксом '0x') (атрибут строки пула).
        если указано - (в т.ч. 0!) то строка пула будет применяться только к пакетам с (iptables -m --mark) равным  (<mark>) (= 0 - только к не маркированным)
        если не указано -  то строка пула будет применяться ко всем пакетам назависимо от значения --mark в пакете
  <usr_ip_start> - <usr_ip_end> - пул пользовательских (локальных) адресов, для которых применяется данное правило (атрибут строки пула)
        если не указан, то  данная строка является deafult пулом (отображается и применяется как диапазон 0.0.0.0 - 255.255.255.255)
  <nat_ip_start> - <nat_ip_end> - пул NAT адресов, в которые производится трансляция локальных адресов по этой строке пула (обязательный атрибут строки пула!)

!!! Обратите внимание на наличие ':' между заголовком настроек и пулом адресов пользователя, а также между пулом адресов пользователя и пулом NAT !!!
Более подробное описание параметров и их использование можно найти в разделах документации ==HOW_IT_WORK== и ==METODICS==

Для каждой строки пула получателей NF9 необходимо указать:
  dest_ip   - IPv4 адрес сервера на который будут отправляться пакеты NF9
  dest_port - UDP порт на который сервер ожидает получать пакеты NF9

Обратите внимание:
Если внутри секции  [LOAD_TMP_CONFIG_V2_0]-[LOAD_TMP_CONFIG_END] нет секции [CFG_NATPOLL_V2_0]-[CFG_NATPOLL_END], то настройки пулов адресов будут скопированы
из текущей активной конфигурации.
Если внутри секции  [LOAD_TMP_CONFIG_V2_0]-[LOAD_TMP_CONFIG_END] нет секции [CFG_NF9DEST_V2_0]-[CFG_NF9DEST_END], то настройки списка получателей NF9 будут
скопированы из текущей активной конфигурации.

-----
Следует обратить внимание, что файл примера test_config.conf, заканчивается двумя командами:
  [CMD_CONFIG_TMPTOINA]
  [CMD_CONFIG_SWAP]
Это связано со способом сохранения и загрузки конфигурации в модуле xt_ANAT.

Фактически в модуле есть 3 конфигурации:
  ACTIVE   - Активная конфигурация, это та конфигурация, которая используется модулем сейчас.
  INACTIVE - Не активная конфигурация, может быть поменена местами с активной (стать активной) с помощью комманды [CMD_CONFIG_SWAP]
  TMP      - Временная конфигурация, может быть скопирована в неактивную по истечении 3 сек после команды [CMD_CONFIG_SWAP] командой [CMD_CONFIG_TMPTOINA]

При загрузке конфигурации она сперва ВСЕГДА загружается в TMP конфигурацию. Поэтому, для активации конфигурации необходимо сперва загрузить конфигурационный файл,
затем скопировать TMP конфигурацию в INACTIVE командой [CMD_CONFIG_TMPTOINA] и только после этого активировать новую конфигурацию командой [CMD_CONFIG_SWAP].
!!! Внимание!! Команда [CMD_CONFIG_TMPTOINA] не применится и выдаст ошибку, если при загрузке TMP конфигурации были ошибки !!!
Это позволяет избежать остановки работы модуля при ошибках в конфигурационном файле настроек.
Вы также можете всегда вернутся к предыдущей INACTIVE конфигурации командой [CMD_CONFIG_SWAP].

Просмотреть текущие конфигурации можно набрав в консоле:
$>cat /proc/net/ANAT/config

==========================================================
===== ==PARAMS== xt_ANAT настройка праметров модуля ======

Помимо настроек пулов, в xt_ANAT можно изменить и ряд других параметров.
Просмотреть список доступных параметров можно набрав в консоле:
$>cat /proc/net/ANAT/params

Есть 4 параметра которые можно изменить ТОЛЬКО при загрузке модуля, указав их значения в командной строке, это размеры хэш таблиц и разбер кольцевого буфера NF9.
Признаки нобходимости корректировки этих параметров можно понять по данным счетчиков статистики (см. ==STATISTICS==) и сообщениям модуля (см. ==MESSAGES==).

Пример команды загрузки модуля с измененными парметрами:
  modprobe xt_ANAT inout_htsz=65536 user_htsz=1024 nat_htsz=512 nfrb_sz2=16
Оcтальные параметры могут быть именены 'на лету'.

Также при загрузке модуля можно задать минимальную начальную конфигурацию пулов (по аналогии с xt_NAT) - 1 строку пула адресов и 1 адрес получателя NF9:
  modprobe xt_ANAT nat_pool=10.0.0.0-10.0.0.100:77.0.0.1-77.0.0.2 nf_dest=10.2.0.1:2055

Обратите внимание на 2 параметра:
NAT_LOCFRWD_POL: = 0-DROP 1-ACCEPT  - определяет что делать с входящим внешним трафиком если не найдено подходящей сессии:
                    ( 0-DROP - трафик будет отброшен, 1 - ACCEPT трафик будет перенаправлен в локльный интерфейс связанный с NAT адресом ).
                    Политика по умолчанию - DROP, что может вызвать определенные проблемы, если NAT адреса используются на самом сервере.
                    ОДНАКО, СТОИТ ОБРАТИТЬ ВНИМАНИЕ, ЧТО ТАКОЙ ПРАКТИКИ СЛЕДУЕТ ИЗБЕГАТЬ! Т.К. xt_ANAT выдает порты НЕЗАВИСИМО от их использования самим сервером!
WTM_TMZN_MNT:    = часовой пояс для выдачи информации в сообщениях о времени событий, данная настройка используется только для удобства администраторов
            
Назначение и использование других параметров описано в соответвующих частях документации.

=====================================================================================
===== ==MESSAGES== xt_ANAT хранение и просмотр сообщений о событиях и ошибках  ======

Для увеличения производительности в xt_ANAT логи событий связанные с функциями NAT сохраняются в кольцевом буфрере сообoений 'msg'.

Просмотреть текущие события можно набрав в консоле:
$>cat /proc/net/ANAT/msga
$>cat /proc/net/ANAT/msgp

msga - выводит все сообщения в active (активном) буфере, однако в силу технологических особенностей, этот вывод производится в 'обратном порядке',
т.е. свежие сообщения оказываются в консоли сверху, что не очень удобно для оперативной работы администратора.

msgp - выводит только (part) часть сообщений из буфера, но этот вывод производится в 'обычном порядке' т.е. свежие сообщения оказываются внизу консоли, что
гораздо удобнее для оперативной работы администратора.

Количество сообщений выводимых msgp можно изменить с помощью изменения параметра модуля MSG_MSRB_PART. Вот пример команды в консоле:
 $>echo [CMD_SET_PRM_N MSG_MSRB_PART = 100] >> /proc/net/ANAT/config
!!Внимание!! Во избежании проблем с выводом msgp не рекомендуется устанавливать MSG_MSRB_PART более 1/2 размера буфера.

Для уменьшения 'лишнего' потока сообщений, повторяющиеся сообщения регистрируются путем увеличения счетчика событий в интервале одной минуты (число в квадратных
скобках после времени события в логе сообщений). Однако, следует учесть, что при большом числе событий по разным пользователям (более 30 пользователей или типов событий)
сообщения перестают инкременировать счетчик, что может приводить к быстрому заполнению буфера. Во избежании подобных событий, выделите "спамеров" в отдельную группу
пользователей и отключите в этих группах пользователей генерацию сообщений командами [CMD_USGR_SET_XXX <UG> m-] с лексемой 'm-'. В случае необходимости увеличения
глубины числа событий для инкремента, обратитесь к разработику ПО.

-----  
Следует напомнить, что кольцевой буфер предполагает, что новые сообщения затирают старые, поэтому при большом количестве сообщений следует принять
дополнительные меры по сохранению нужной информации. Для этого в xt_ANAT предусмотрены следующие механизмы:

1. Увеличение размера буфера сообщений 'на лету' путем изменения параметра MSG_MSRB_SZ2. Вот пример команды в консоле:
 $>echo [CMD_SET_PRM_N MSG_MSRB_SZ2 = 12] >> /proc/net/ANAT/config
Размер буфера задается как степень 2(N-1), так 12 означает размер 4096 сообщений. Обратите внимание, что размер буфера будет изменен только после команды:
 $>echo [CMD_MESSAGE_FREEZE] >> /proc/net/ANAT/config
 
2. Работа с замороженным буфером. В xt_ANAT для хранения сообщений и для трассировки пакетов используется по 2 буфера: 'Активный' и 'Замороженный'.
Команда [CMD_MESSAGE_FREEZE] копирует текущий Активный буфер сообщений в Замороженный и одновременно очищает Активный буфер и изменяет его размер в соответствии
с текущим значением параметра MSG_MSRB_SZ2.

Содержимое Замороженного буфера можно просмотреть можно набрав в консоле:
$>cat /proc/net/ANAT/msgf
msgf - выводит все сообщения в Замороженном буфере, вывод производится в 'обычном порядке' т.е. свежие сообщения оказываются внизу консоли, что
гораздо удобнее  для оперативной работы администратора.

С помощью команды [CMD_MESSAGE_FREEZE] можно организовать логирование сообщений запуская по cron периодически скрипт со следующими командами:
$>echo [CMD_MESSAGE_FREEZE] >> /proc/net/ANAT/config
$>cat /proc/net/ANAT/msgf > /var/log/ANAT/mylog_file.txt
!!! ВНИМАНИЕ !!! Минимальный интревал между двумя подряд командами [CMD_MESSAGE_FREEZE] = 3 секунды !!!

-----
В xt_ANAT v1.00b (wv0_08) предусмотрены следующие виды событий регистрируемые в msg:
  E-NATP: ERROR No free NAT port found!    PR=%d N=%pI4  U=:[%d]
        - говорит о перегруженном состоянии <N> IP NATа и нехватки портов для пользователей, следует увеличить пул NAT или сократить число сессий для пользователей
           также можно попробовать изменить порядок выдачи адресов с '*L' на '*H'
  W-NATP: Long search free NAT port.       PR=%d N=%pI4  U=:[%d]
        - говорит о высокой нагрузке <N> IP NATа и нехватки портов для пользователей, обычно предшествует E-NATP
  E-NATA: ERROR No NAT addr for user addr! PR=%d U=%pI4:[%d]  D=[%pI4]
        - сообщает о неверной настройке пулов адресов или правил файрвола, происходит если не удается найти строку пула для <U> IP USERа
  E-ULIM: ERROR User use too much session! PR=%d U=%pI4 +%02d  SSCNT:[%lld]
        - сообщает об исчерпании лимита сессий пользовтелем <U> в соответствии с правилами в группе +UG (см. ==CMD_USGR_SET_XXX==)
  W-ULIM: User use a lot of session.       PR=%d U=%pI4 +%02d  SSCNT:[%lld]        
        - сообщает об достижении warning лимита сессий пользовтелем <U> в соответствии с правилами в группе +UG (см. ==CMD_USGR_SET_XXX==)
  W-BLKP: User on block or pause try create session. PR=%d U=%pI4 +%02d  PAUSE_JS:[%lld]  
        - информирует о попытке создать сессию заблокированным пользователем <U> в группе +UG  
  H-HUSR: User htbl has a lot of records!  PR=%d HASH=%d  U=[%pI4] +%02d
  H-HINR: Inner htbl has a lot of records! PR=%d HASH=%d  U=[%pI4:%d] +%02d
  H-HOUT: Outer htbl has a lot of records! PR=%d HASH=%d  U=[%pI4:%d] +%02d
        - эти сообщения предупреждают об увеличении числа записей для единичного хэш элемента свыше значения параметра HTB_WRN_RNUM
          как правило, это говорит о необходимости увеличения размера хэш таблиц путем изменения параметров xxxx_htsz при загрузке модуля
  E-NFBO: ERROR Nf9 bufeer overflow!       IHEAD=[%lld]
        - сообщает о переполнении кольцевого буфера NF9,
          как правило, это говорит о необходимости увеличения размера буфера NF9, путем изменения параметра nfrb_sz2 при загрузке модуля
          если это не помогает - следует снизить нагрузку на NF9 путем уменьшения числа получателей NF9, или увеличением пропускной способности сети
          также возможно вам следует увеличить интервалы KeepLive NF9 или изменить другие параметры NF9
          также такие сообщения могут возникнуть при массовой ДДОС атаке из локальной сети
          или в момент старта/рестарта сервера, при очень большом числе пользователей

*Сообщения W-ULIM и E-ULIM можно отключить/включить для отдельных групп пользователей командами [CMD_USGR_SET_XXX <UG> m-] с лексемой 'm-'/'m+'

где
  PR      = номер IP протокола
  N      = NAT  IP адрес : порт
  U      = USER IP адрес : порт
  +NN    = user group - номер группы пользовтелей
  SSCNT  = счетчик сессий на момент первого события в интервале
  D      = DEST IP адрес : порт в первом событии в интервале
  IHEAD  = счетчик числа пакетов в буфере в первом событии в интервале
  HASH   = значение hash функции в хэш таблице
  PAUSE_JS = время окончания блокировки во внутренних jiffies секундах (текущее внутренние время можно посмотреть в начале вывода /proc/net/ANAT/config


========================================================================================================
===== ==CMD_TEST_IP_SET== Проверка работы NAT и доступности ресурсов с тестового IP администратора =====

В xt_ANAT предусмотрена возможность проверка работы NAT и доступнсти внешних ресурсов с опредленного NAT адреса.
Для настройки работы тестового IP в xt_ANAT используется следующая команда:
  [CMD_TEST_IP_SET <user_ip> <nat_ip> +<UG> ^<T>]  
   <user_ip> - ip адрес ПК администратора (!!!должен быть доступен маршрут к <user_ip> с сервера!!!),
   <nat_ip>  - ip адрес NAT, работу которого мы хотим проверить,
   <UG>  - группа пользователей для которой мы проводим проверку - ВАЖНО правильно указать, т.к. для разных групп могут быть установлены разные лимиты сессий.
   <T>   - trace char - может использоваться для трассировки пакетов или быстрой отчистки тестовых сессий
   
Пример комманды:
$>echo [CMD_TEST_IP_SET 192.168.10.4 70.0.100.1 +00 ^W] >> /proc/net/ANAT/config

Проверить текущие настройки CMD_TEST_IP_SET можно в конце вывода /proc/net/ANAT/config

!!! Для работы с <user_ip> следует указать на Тестовом ПК default gw таким, что-бы трафик прошел через сервер xt_ANAT, также следует не забыть проверить, что
для тестового <user_ip> правилами файрвола сервера предусмотрено перенаправление трафика в xt_ANAT !!!

Если всё сделано правильно, то вы получите доступ в Интернет с использованием <nat_ip> и с правилами лимитов +<UG>.

===========================================================================================
===== ==CMD_USGR_SET_XXX== Настройка лимитов сессий для различных групп пользователей =====

Одной из основных задач, которая может возникнуть при администрировании NAT на больших системах - выявление спамеров и зараженных вирусами ПК и их
последующая изоляция на отдельных NAT IP и ограничение в количестве ресурсов. Для этого в xt_ANAT в т.ч. предназначено понятие группа пользователей.
Всего может быть до 64 групп пользователей от +00 до +63.

Следует обратить ВНИМАНИЕ!!! Что группа пользователей присваивается сессии, по итогам выбора подходящей строки пула адресов (лексема +<UG>), и один USER IP
адрес может оказаться одновременно в нескольких группах. Это произойдет, если мы для одного и того-же USER IP отнеcли обращения, например,
к портам tcp25 или tcp22, с помощью --mark и !<mark>, к UG +01, а остальные обращения оставили в UG +00. Подробности (см. ==HOW_IT_WORK== и ==METODICS==)

Лимиты сессий устанавливаются внутри группы, поэтому если мы выставили для такого "раздвоенного" пользователя ограничения по сессиям TCP
в UG +01 = 100, а в UG +00 = 4096, то пользователь суммарно сможет создать 4196 сессий (4096+100), из которых только 100 будут доступны для портов 25 и 22
(как общая сумма) и 4096 портов под сессии к прочим tcp портам.

Для настройка лимитов и порога warning для отдельных групп в xt_ANAT используются следующие команды:
  [CMD_USGR_SET_MAX <UG> [m-|m+] [t<nnn>] [u<nnn>] [i<nnn>] [o<nnn>]]  - установка максимального числа сессий для группы пользователей
  [CMD_USGR_SET_WRN <UG> [m-|m+] [t<nnn>] [u<nnn>] [i<nnn>] [o<nnn>]]  - установка порога warning числа сессий для группы пользователей
    <UG>  - номер UG в формате +NN или 'ALL'. Команда с UG = ALL будет применена ко всем группам пользователей.
    <nnn> - число сессий для соответвующих протоколов: t-tcp, u-udp, i-icmp, o-other
            если вместо <nnn> указать 'D', то  будет использоваться  дефолтное значение USR_MAX_SS_XXX или USR_WRN_SS_XXX из /proc/net/ANAT/params
    m-|m+ - лексемы включения /выключения для группы вывода сообщений в буфер msg ('m-' = off, 'm+' = on) по умолчанию сообщения включены ('m+')

Примеры комманд:
$>echo [CMD_USGR_SET_MAX +01 m- t100 u100 i10 o0] >> /proc/net/ANAT/config
$>echo [CMD_USGR_SET_WRN +01 t50] >> /proc/net/ANAT/config
$>echo [CMD_USGR_SET_WRN ALL m-] >> /proc/net/ANAT/config
$>echo [CMD_USGR_SET_MAX ALL m+ tD uD iD oD] >> /proc/net/ANAT/config

Следует отметить, что комманды CMD_USGR_SET_XXX можно и СЛЕДУЕТ помещать с конфигурационный файл и применять сразу при старте xt_ANAT.
При повтороной загрузке конфигрурационного файла, не происходит автоматического сброса текущих настроек групп пользователей, поэтому
для их сброса в первоначальное состояние, перед подачей команд настройки групп пользователей, в файле можно поместить 2 команды:
[CMD_USGR_SET_MAX ALL m+ tD uD iD oD]
[CMD_USGR_SET_WRN ALL m+ tD uD iD oD]
и далее уже разместить команды настройки групп.

Проверить текущие настройки CMD_USGR_SET_XXX можно в /proc/net/ANAT/ugroups.

=============================================================================
===== ==CMD_NAT_XXX== Приостановка или блокировка создания новых сессий =====

Иногда в процессе работы возникает необходимоость приостановить на время или заблокировать возможность пользователю создавать новые сессии.
Для блокировки и приостановки создания новых сессий в xt_ANAT используются следующие команды:
  [CMD_NAT_BLOCK_ON  [<IP>] [+<UG>]]            - блокирует создание новых сессий на неопределенное время
  [CMD_NAT_BLOCK_OFF [<IP>] [+<UG>]]            - отменяет блокировку
  [CMD_NAT_PAUSE_ON   <TIME_S> [<IP>] [+<UG>]]  - приостанавливает создание новых сессий на <TIME_S> секунд    
  [CMD_NAT_PAUSE_OFF [<IP>] [+<UG>]]            - отменяет приостановку
    <IP> - USER IP - ip адрес пользователя
    <UG> - user group - номер группы пользователей
    <TIME_S> - длительность приостановки создания новых сессий в секундах


Примеры комманд:
$>echo [CMD_NAT_BLOCK_ON 192.168.10.2] >> /proc/net/ANAT/config
$>echo [CMD_NAT_BLOCK_ON 192.168.10.3 +01] >> /proc/net/ANAT/config
$>echo [CMD_NAT_PAUSE_ON 100 +01] >> /proc/net/ANAT/config
$>echo [CMD_NAT_PAUSE_ON 10] >> /proc/net/ANAT/config
$>echo [CMD_NAT_BLOCK_OFF 192.168.10.3] >> /proc/net/ANAT/config
$>echo [CMD_NAT_BLOCK_OFF] >> /proc/net/ANAT/config
$>echo [CMD_NAT_PAUSE_OFF +01] >> /proc/net/ANAT/config

Обратите внимание, что заблокировать или приостановить работу можно ТОЛЬКО тех пользователей и в тех группа которые на данный момент активны на сервере,
список активных пользователей и их группы, а также состояние блокировок и приостановок можно просмотреть в /proc/net/ANAT/users.
Если пользователь не активен, то команды CMD_NAT_XXX не дадут никакого эффекта. Для вновь активного или нового пользователя или пользователя
в новой группе ограничения CMD_NAT_XXX действовать не будут!

ВНИМАНИЕ! Команды CMD_NAT_XXX ограничивают создание НОВЫХ сессий! Старые активные сессии продолжат работать до их остановки!

============================================================================
===== ==CMD_KILL_XXX== Остановка (сброс) активных сессии пользователей =====

Иногда в процессе работы возникает необходимоость остановить (сбросить) сессии некоторых пользователей.
Для остановки сессий в xt_ANAT используются следюущие команды:
  [CMD_KILL_USER <U_IP> [p<PROTO>] [: <U_PORT>] [+<UG>] [^<T>]] - сбросить сессии пользователя с USER ip : USER port  = <U_IP> : U_PORT
  [CMD_KILL_NAT  <N_IP> [p<PROTO>] [: <N_PORT>] [+<UG>] [^<T>]] - сбросить сессии пользователей на NAT ip : NAT port  = <N_IP> : N_PORT
  [CMD_KILL_ALL [+<UG>][^<T>]]  - сбросить сессии всех пользователей
    p<PROTO> - применить команду только к сессиям с указанным номером протокола допускается использовать  pT,pU,pI,pO - (TCP,UDP,ICMP,OTHER)  
    <UG>     - применить команду только к сессиям групп пользователей с номером UG = <UG>
    <T>      - применить команду только к сессиям с trace char = <T>

Примеры комманд:
$>echo [CMD_KILL_ALL] >> /proc/net/ANAT/config
$>echo [CMD_KILL_ALL +01] >> /proc/net/ANAT/config
$>echo [CMD_KILL_ALL ^W] >> /proc/net/ANAT/config
$>echo [CMD_KILL_USER 192.168.10.3p6:25 +01] >> /proc/net/ANAT/config
$>echo [CMD_KILL_USER 192.168.10.3:53+01^S] >> /proc/net/ANAT/config
$>echo [CMD_KILL_USER 192.168.10.1] >> /proc/net/ANAT/config
$>echo [CMD_KILL_NAT 70.0.100.1:54235] >> /proc/net/ANAT/config
$>echo [CMD_KILL_NAT 70.0.100.1pO ^W] >> /proc/net/ANAT/config


ВНИМАНИЕ! Команды CMD_KILL_XXX не имеют возможности отмены, применяйте их с осторожностью, особенно команду [CMD_KILL_ALL]!
ВНИМАНИЕ! Команды CMD_KILL_XXX не удаляют статические связки.
 
======================================================================================
===== ==CMD_STATIC_MAP_XXX== Статические сессии (STATIC_MAP) (aka порт mapping)  =====

В xt_ANAT поддерживается функция static sessions (STATIC_MAP) (port mapping).
Вы можете добавлять/удалять статические связки для user_ip:user_port и nat_ip:nat_port с помощью комманд CMD_STATIC_MAP_ADD, CMD_STATIC_MAP_DEL и
CMD_STATIC_MAP_DEL_ALL. Статические связки сбрасываются при рестарте модуля, поэтому рекомендуется для постоянных связок хранить набор комманд в
отдельном файле и загружать в случае необходимости или изменения. В начале фалк можно указать [CMD_STATIC_MAP_DEL_ALL] для очистки всех статических связок.
Команды CMD_STATIC_MAP_DEL удаляют только статические связки.
ВНИМАНИЕ! Команды CMD_KILL_XXX не удаляют статические связки.
В списке net/ANAT/sessions статические сессии отображаются с отметкой (STATIC_MAP)
!!! Обратите внимание! Статические сессии создаются вне зависимости от счетчика лимитов, но учитываются при создании простых сессий. !!!
!!! Функция STATIC_MAP работает корректно только с протоколами UDP и TCP. Работа с другими протоколами не гарантируется. !!!
!!! Если на данной связке адресе:порт уже настроена STATIC_MAP или есть активная сессия, то они будут сброшены. !!!

Для управления статичкескими свзяками (статическими сессиями) в xt_ANAT используются следюущие команды:
  [CMD_STATIC_MAP_ADD p<PROTO> <user_ip> : <user_port> <nat_ip> : <nat_port> [+<UG>] [^<T>]] - добавить статическую связку   
  [CMD_STATIC_MAP_DEL p<PROTO> <user_ip> : <user_port>]                                      - удалить одну конкретную статическую связку
    <PROTO>                    - номер протокола, допускается использовать pT,pU - (TCP,UDP) или номер протокола
    <user_ip> : <user_port>  - ip адрес и порт на стороне клиента   
    <nat_ip>  : <nat_port>   - ip адрес и порт на стороне NAT
    <UG>                       - группа пользователей для сессии (по умолчанию +00)
    <T>                        - trace char - для сессии (по умолчанию ^@)
    
  [CMD_STATIC_MAP_DEL_ALL [p<proto>] [<user_ip>] [+<UG>] [^<T>]]    - удалить несколько или все статические связки
    <PROTO>    - применить команду только к сессиям с указанным номером протокола, в т.ч. допускается использовать  pT,pU,pI,pO - (TCP,UDP,ICMP,OTHER)      
    <user_ip>  - применить команду только к сессиям с указанным user_ip      
    <UG>       - применить команду только к сессиям групп пользователей с номером UG = <UG>
    <T>        - применить команду только к сессиям с trace char = <T>
 
Примеры комманд:
$>echo [CMD_STATIC_MAP_DEL_ALL] >> /proc/net/ANAT/config
$>echo [CMD_STATIC_MAP_ADDpT192.168.10.3:25 70.0.100.1:54235+01^S] >> /proc/net/ANAT/config
$>echo [CMD_STATIC_MAP_ADD pU 192.168.10.3:53 70.0.100.1:53] >> /proc/net/ANAT/config
$>echo [CMD_STATIC_MAP_ADD p17 192.168.10.3:23 70.0.100.1:2023] >> /proc/net/ANAT/config
$>echo [CMD_STATIC_MAP_ADD pT 192.168.10.3:443 70.0.100.1:443 ^W] >> /proc/net/ANAT/config
$>echo [CMD_STATIC_MAP_DEL  pT 192.168.10.3:443] >> /proc/net/ANAT/config
$>echo [CMD_STATIC_MAP_DEL 192.168.10.3 ^W] >> /proc/net/ANAT/config
 
$>cat /proc/net/ANAT/sessions | grep STATIC

=============================================================================================
===== ==CMD_TRACE_XXX== Трассировка (отслеживание заголовков) пакетов проходящих через  =====

Часто перед администратором встает вопрос, о том какая активность (трафик) сейчас проходит через сервер, особенно актуально это для выявления спамеров
и зараженных компьютеров, а также диагностики DDOS атак. В xt_ANAT добавлен функционал TRACE для логирования пакетов, который позволяет быстро отследить
активность пользователей логируя пакеты проходящие через модуль xt_ANAT. В логе отображаются, направление пакета, его статус (DROP|ACCEPT), размер пакета,
адрес и порт USER (пользователя) , адрес и порт NAT, адрес и порт DEST (удаленной стороны), адрес и порт SESSION DEST (удаленной стороны при создании сессии).
Для отбора нужных пакетов предусмотрено множество простых и сложных фильтров.

Функционал TRACE в xt_ANAT реализован на базе кольцевого буфера 'trc', работающего на принципах аналогичным буферу сообщений 'msg'.
Для просмотра лога пакетов надо набрать в консоле:
$>cat /proc/net/ANAT/trca
$>cat /proc/net/ANAT/trcp
$>cat /proc/net/ANAT/trcf

Для заморозки буфера логов используйте команду [CMD_TRACE_FREEZE], изменять размер буфера и количество строк частичного вывода можно командой [CMD_SET_PRM_N XXX=XX]
устанавливая параметры MSG_TRCB_SZ2 и MSG_TRCB_PART соответственно.

Включение механизмов TRACE производится в несколько этапов.
1. Сперва следует включить/отключить TRACE для тех 'trace сhar' или пользователей трафик которых вас интересует командами:
  [CMD_TRACE_ON_<T>]  - включает  трассировку по 'trace сhar' для сессий с tc = <T>
  [CMD_TRACE_ON_ALL]  - включает  трассировку для сессий с любыми 'trace сhar'
  [CMD_TRACE_OFF_<T>] - выключает трассировку по 'trace сhar' для сессий с tc = <T>
  [CMD_TRACE_OFF_ALL] - выключает трассировку для сессий с любыми 'trace сhar'
и (или)
  [CMD_TRACE_USER_ON {<U_IP> [+<UG>] | +<UG>} ] - включает  трассировку по пользователям с USER ip = U_IP и (или) с UG = <UG>
  [CMD_TRACE_USER_OFF]                          - выключает трассировку по пользователям
 
!!! Механизмы CMD_TRACE_ON_X и CMD_TRACE_USER_ON - работают независимо, то есть пакет попадет в трассировку если удовлетвоаряет любому из двух условий.

Также в случае необходимости можно включить/выключить TRACE для пакетов не имеющих сессий:
  [CMD_TRACE_OUTDROP_ON]   - включает  трассировку для исходящих пакетов для которых не удалось создать сессию
  [CMD_TRACE_OUTDROP_OFF]  - выключает трассировку для исходящих пакетов для которых не удалось создать сессию
  [CMD_TRACE_LOCFRWD_ON]   - включает  трассировку для входящих пакетов для которых не удалось найти сессию
  [CMD_TRACE_LOCFRWD_OFF]  - выключает трассировку для входящих пакетов для которых не удалось найти сессию
 
2. После включения TRACE следует в случае необходимости настроить дополнительную фильтрацию пакетов командами:
  [CMD_TRACE_FILTER_SET_P [p<pr> [- <pr_e>]] [s<pksz> [- <pksz_e>]] [dI|O|B] [rD|A|B]] - включает фильтрацию по протоколу, размeру пакетов, направлению и статусу
    p<pr>   [- <pr_e>]   - фильтр по диапазону протоколов, также допустимо pT - tcp, pU - udp, pI - icmp, pO - other протоколы.
    s<pksz> [- <pksz_e>] - фильтр по размеру пакетов
    dI|O|B               - фильтр по направлению (direction) dI - только входящие, dO - только исходящие, dB - входящие и исходящие
    rD|A|B               - фильтр по статусу (result) rD - только DROP'ed, rA - только ACCEPT'ed, dB - DROP и ACCEPT
    
  [CMD_TRACE_FILTER_SET_{U|N|D|S} [<ip> [- <ip_e>]] [: <port> [- <port_e>]] ]- включает фильтрацию по адресам и портам (USER, NAT, DEST и SESSION DEST)
    U|N|D|S              - определяет к каким адресам применять команду U - USER, N - NAT, D - DEST, S - SESSION DEST        
    <ip> [- <ip_e>]      - фильтр по диапазону ip адресов
    :<port> [- <port_e>] - фильтр по диапазону портов

Сброс фильтров прозводится командами без дополнительных параметров:    
  [CMD_TRACE_FILTER_SET_P] и [CMD_TRACE_FILTER_SET_{U|N|D|S}] соответсвенно.
 
Активация/деактивация (включение/отключение работы) дополнительного фильтра осуществляется командами:
  [CMD_TRACE_FILTER_ON]
  [CMD_TRACE_FILTER_OFF]

3. После завершения настроек необходимо разрешить трассировку пакетов командой:
  [CMD_TRACE_START]
Остановка трассровки пакетов производится командой
  [CMD_TRACE_STOP]
 
Примеры комманд:
$>echo [CMD_TRACE_ON_ALL] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_ON_@] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_OFF_ALL] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_OFF_T] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_USER_ON 10.0.0.1] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_USER_ON 10.0.0.3 +01] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_USER_ON +01] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_USER_OFF] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_OUTDROP_ON] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_LOCFRWD_OFF] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_FILTER_SET_P p30-200 dB] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_FILTER_SET_P pO s0-100 dI rA] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_FILTER_SET_P] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_FILTER_SET_U 10.0.0.1-10.20.0.255] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_FILTER_SET_N 70.0.0.1:10000-30000] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_FILTER_SET_D 8.8.8.8] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_FILTER_SET_S :53] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_FILTER_SET_U] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_FILTER_ON] >> /proc/net/ANAT/config
$>echo [CMD_TRACE_START] >> /proc/net/ANAT/config
 
Несмотря на то, что TRACE работает очень быстро, не рекомендуется оставлять ее включенной без надобности, посколько это всё-же пусть и незначительно,
но снижает скорость обработки пакетов xt_ANAT, особенно, если количество пакетов попадающих в лог слишком велико. Рекомендуется ограничивать длительную
трассировку по 'trace сhar' или пользователю или группам с разумным количеством пакетов.

Проверить текущие настройки CMD_TRACE_XXX можно в /proc/net/ANAT/config.

===============================================================================
===== ==NET_FLOW== Отправка информации о сессиях по протоколу Netflow v9 ======

В xt_ANAT реализована поддержка отправки информации о NAT сессиях по протоколу  Netflow v9 что позволяет собирать статистику соединений, а также взаимодействовать
с системами СОРМ. В xt_ANAT отправка NF9 реализована через промежуточный кольцевой буфер, что ускоряет обработку пакетов, а также позволяет избегать зависаний
из-за взаимных блокировок процессов. Отправка пакетов реализована в отдельном потоке xt_anat_nf9s. Наличие потока можно проверить командой:
$>ps axu | grep xt_anat_nf9s

В xt_ANAT по умолчанию можно указать до 10 получателей NF9. Увеличение числа получателей увеличивает нагрузку, т.к. пакеты дублируются каждому получателю.
Следует обратить внимание, что пакеты отправляются с произвольного порта UDP, что следует учитывать при настройке файрволов.

В xt_ANAT в сведения отправляемые в NF9 включен ряд дополнительной информации, а именно время создания сессии в милисекундах отсчитываемых от 00:00 UTC 1970 года.
Это позволяет установить принадлежность пакетов даже по сообщениям NF9 о закрытии сессии. Также в xt_ANAT предсмотрен специальний тип сообщений sessions KeepAlive,
который периодически генерируется для информирования о долго длящихся сессиях. Или может использоваться для холодного старта получателя статистики без рестарта сессий
клиентов.

Основные настройки NF9 производятся через установку значений параметров NF9_XXX  из /proc/net/ANAT/params:
  NF9_EVENTS_ON:   =1;     - (1=on,0=off) Включение генерации пакетов NF9, если не планируется использовать NF9 - утсановите его =0!
  NF9_MTU_UDPLOAD: =1300;  - Размер максимальной полезной нагрузки в UDP пакете. Изменяя этот параметр можно устранить проблемы с MTU или ускорить обмен.
  NF9_TEMPLATE_ID: =300;   - Значение поля Template ID в пакетах nf9.
  NF9_SOURCE_ID:   =1;     - Значение поля Source ID в пакетах nf9.
  NF9_TMPL_SQUANT: =1;     - Частота отправки template в пакетах nf9. (0=не отправлять, 1=отправлять всегда, N > 2 - отправлять каждый N пакет)
  NF9_TMPL_SEMPTY: =1;     - (1=on,0=off) Отправлять пустой пакте только с template если нет данных о сессиях. (Можно использовать как UDP keepalive)
  NF9_DELAY_SEC:   =10;    - Максимальная задержка между отправкой пакетов (sec) (Можно использовать как UDP keepalive)
  NF9_SSK_INTRV_S: 10800   - Интервал генерации Active sessions KeepAlive сообщений (sec). (1000000=off sessions KeepAlive)

Также, в случае необходимости, можно сбросить в 0 счетчик seq отправленных Получателям пакетов командой:
  [CMD_RESET_NF9_SEQ]
!!! Значение seq инкременируется и передается в каждом пакете NF9, и его сброс может вызвать проблемы на принимающей стороне !!!

================================================
===== ==STATISTICS== Статистика и счетчики =====
В xt_ANAT можно просмотреть список активных пользователей:
$>cat /proc/net/ANAT/users

В xt_ANAT можно просмотреть список активных сессий:
$>cat /proc/net/ANAT/sessions

В xt_ANAT можно просмотреть счетчики статистики:
$>cat /proc/net/ANAT/statistics

Среди счетчиков следует обратить внимание на счетчики:
  MM_ERBAG: 0 -- Bags managment errors find (BUGS)
  MM_NOMEM: 0 -- Not enough memory during packets work
их значения должны быть ВСЕГДА = 0, следует проверить свободную память и обратится к разработчикам при их значениях <> 0.

Для удобства администраторов, некоторые группы счетчиков можно сбросить в 0, следующими коммандами:
  [CMD_RESET_CNT_PK] - сброс счетчиков PK_XXX
  [CMD_RESET_CNT_FP] - сброс счетчиков FP_XXX
  [CMD_RESET_CNT_HT] - сброс счетчиков HT_XXX
  [CMD_RESET_CNT_OV] - сброс счетчиков OV_XXX
  [CMD_RESET_CNT_NF] - сброс счетчиков N9_XXX

Значения MS_EVCNT, N9_EVNHD, N9_EVNTL - не являются статистическими счетчиками и их значения сбросить невозможно, их сброс происходит только при определенных событиях.
Сброс счетчиков ST_XXX - не предусмотрен.


============================================================
===== ==CMD== Краткий справочник команд v1.01b (wv0_09) =====

Загрузка конфигурации пулов:
  [LOAD_TMP_CONFIG_V2_0]  - начало секции файла конфигурации пулов
  [LOAD_TMP_CONFIG_END]   - конец секции файла конфигурации пулов
 
  [CFG_NATPOLL_V2_0]      - начало секции конфигурации пула адресов
  [CFG_NATPOLL_END]       - конец секции конфигурации пула адресов
  формат строки пула адресов:
  [ [^<T>] [+<UG>] [&<E>] [*L(inear)|*H(ash)] [!<mark>] : ] [ <usr_ip_start> - <usr_ip_end> :] <nat_ip_start> - <nat_ip_end>
    ^ - trace_code for trace packets to msg: <T>-one char from 'A' to 'Z', default = '@'
    + - user_group <UG>='00'..'63': (must be 2 digits, use '01' not '1'), deafult = '00'
    & - nat_use <E>-one digit: '0'- use all NAT ip , '1'- exclude x.0 (move to x.1), '2'- exclude x.255 (move to x.254),
        '3'- both (1) and (2)), default = '0'
    * - nat_hash ip method : 'L' - linear, 'H' - jhash, default is: 'H'- for defaults user pool 'L'- for all other pools
    ! - mark (take rule only for <mark> marked trafic
      (if !0 - it the rule is ONLY for non marked trafic, if no !<mark> - rule is for ALL trafic), default - no  
 
  [CFG_NF9DEST_V2_0]      - начало секции конфигурации пула получателей NF9
  [CFG_NF9DEST_END]       - конец секции конфигурации пула получателей NF9
  формат строки пула получателей NF9:
  dest_ip : dest_port
 
  [CMD_CONFIG_TMPTOINA]   - скопировать TMP конфигурацию в INACTIVE
  [CMD_CONFIG_SWAP]       - поменять местами INACTIVE и ACTIVE конфигурации

-----

Установка параметров:
  [CMD_SET_PRM_N <param_name> = <param_value>]

Сброс в 0 групп счетчиков статистики:
  [CMD_RESET_CNT_PK]      - сброс счетчиков PK_XXX
  [CMD_RESET_CNT_FP]      - сброс счетчиков FP_XXX
  [CMD_RESET_CNT_HT]      - сброс счетчиков HT_XXX
  [CMD_RESET_CNT_OV]      - сброс счетчиков OV_XXX
  [CMD_RESET_CNT_NF]      - сброс счетчиков N9_XXX
  [CMD_RESET_CNT_ER]      - сброс счетчиков MM_XXX

Сброс в 0 счетчика seq отправленных Получателям NF9 пакетов :
  [CMD_RESET_NF9_SEQ]

Заморозка кольцевых буферов:
  [CMD_MESSAGE_FREEZE]    - заморозка буфера сообщений msg
  [CMD_TRACE_FREEZE]      - заморозка буфера логов пакетов TRACE trc
 
Настройка работы тестового IP:
  [CMD_TEST_IP_SET <user_ip> <nat_ip> +<UG> ^<T>]  
   <user_ip> - ip адрес ПК администратора (!!!должен быть доступен маршрут к <user_ip> с сервера!!!),
   <nat_ip>  - ip адрес NAT, работу которого мы хотим проверить,
   <UG>  - группа пользователей для которой мы проводим проверку - ВАЖНО правильно указать, т.к. для разных групп могут быть установлены разные лимиты сессий.
   <T>   - trace char - может использоваться для трассировки пакетов или быстрой отчистки тестовых сессий
  [CMD_TEST_IP_SET] - отключить тестовый ip

Настройка лимитов и порога warning для отдельных групп пользователей:
  [CMD_USGR_SET_MAX <UG> [m-|m+] [t<nnn>] [u<nnn>] [i<nnn>] [o<nnn>]]  - установка максимального числа сессий для группы пользователей
  [CMD_USGR_SET_WRN <UG> [m-|m+] [t<nnn>] [u<nnn>] [i<nnn>] [o<nnn>]]  - установка порога warning числа сессий для группы пользователей
    <UG>  - номер UG в формате +NN или 'ALL'. Команда с UG = ALL будет применена ко всем группам пользователей.
    <nnn> - число сессий для соответвующих протоколов: t-tcp, u-udp, i-icmp, o-other
            если вместо <nnn> указать 'D', то  будет использоваться  дефолтное значение USR_MAX_SS_XXX или USR_WRN_SS_XXX из /proc/net/ANAT/params
    m-|m+ - лексемы включения/выключения для группы вывода сообщений в буфер msg ('m-' = off, 'm+' = on) по умолчанию сообщения включены ('m+')
    
Блокировка или приостановка создания новых сессий:
  [CMD_NAT_BLOCK_ON  [<IP>] [+<UG>]]            - блокирует создание новых сессий на неопределенное аремя
  [CMD_NAT_BLOCK_OFF [<IP>] [+<UG>]]            - отменяет блокировку
  [CMD_NAT_PAUSE_ON   <TIME_S> [<IP>] [+<UG>]]  - приостанавливает создание новых сессий на <TIME_S> секунд    
  [CMD_NAT_PAUSE_OFF [<IP>] [+<UG>]]            - отменяет приостановку
    <IP> - USER IP - ip адрес пользователя
    <UG> - user group - номер группы пользователей
    <TIME_S> - длительность приостановки создания новых сессий в секундах

Остановка (сброс) активных сессий:
  [CMD_KILL_USER <U_IP> [p<PROTO>] [: <U_PORT>] [+<UG>] [^<T>]] - сбросить сессии пользователя с USER ip : USER port  = <U_IP> : U_PORT
  [CMD_KILL_NAT  <N_IP> [p<PROTO>] [: <N_PORT>] [+<UG>] [^<T>]] - сбросить сессии пользователей на NAT ip : NAT port  = <N_IP> : N_PORT
  [CMD_KILL_ALL [+<UG>][^<T>]]                       - сбросить сессии всех пользователей    
    <PROTO> - применить команду только к сессиям с указанным номером протокола допускается использовать  pT,pU,pI,pO - (TCP,UDP,ICMP,OTHER)  
    <UG>    - применить команду только к сессиям групп пользователей с номером UG = <UG>
    <T>     - применить команду только к сессиям с trace char = <T>

Статические сессии (STATIC_MAP) (порт mapping)    
  [CMD_STATIC_MAP_ADD p<PROTO> <user_ip> : <user_port> <nat_ip> : <nat_port> [+<UG>] [^<T>]] - добавить статическую связку   
  [CMD_STATIC_MAP_DEL p<PROTO> <user_ip> : <user_port>]                                      - удалить одну конкретную статическую связку
    <PROTO>                    - номер протокола, допускается использовать pT,pU - (TCP,UDP) или номер протокола
    <user_ip> : <user_port>  - ip адрес и порт на стороне клиента   
    <nat_ip>  : <nat_port>   - ip адрес и порт на стороне NAT
    <UG>                       - группа пользователей для сессии (по умолчанию +00)
    <T>                        - trace char - для сессии (по умолчанию ^@)
    
  [CMD_STATIC_MAP_DEL_ALL [p<proto>] [<user_ip>] [+<UG>] [^<T>]]    - удалить несколько или все статические связки
    <PROTO>    - применить команду только к сессиям с указанным номером протокола, в т.ч. допускается использовать  pT,pU,pI,pO - (TCP,UDP,ICMP,OTHER)      
    <user_ip>  - применить команду только к сессиям с указанным user_ip      
    <UG>       - применить команду только к сессиям групп пользователей с номером UG = <UG>
    <T>        - применить команду только к сессиям с trace char = <T>
-----    
Включение механизмов TRACE.
Включение/отключение TRACE для 'trace сhar':
  [CMD_TRACE_ON_<T>]  - включает  трассировку по 'trace сhar' для сессий с tc = <T>
  [CMD_TRACE_ON_ALL]  - включает  трассировку для сессий с любыми 'trace сhar'
  [CMD_TRACE_OFF_<T>] - выключает трассировку по 'trace сhar' для сессий с tc = <T>
  [CMD_TRACE_OFF_ALL] - выключает трассировку для сессий с любыми 'trace сhar'
 
Включение/отключение TRACE для 'пользователей:
  [CMD_TRACE_USER_ON {<U_IP> [+<UG>] | +<UG>} ] - включает  трассировку по пользователям с USER ip = U_IP и (или) с UG = <UG>
  [CMD_TRACE_USER_OFF]                          - выключает трассировку по пользователям
 
!!! Механизмы CMD_TRACE_ON_X и CMD_TRACE_USER_ON - работают независимо, то есть пакет попадет в трассировку если удовлетвоаряет любому из двух условий.

Включение/отключение TRACE для пакетов не имеющих сессий:
  [CMD_TRACE_OUTDROP_ON]   - включает  трассировку для исходящих пакетов для которых не удалось создать сессию
  [CMD_TRACE_OUTDROP_OFF]  - выключает трассировку для исходящих пакетов для которых не удалось создать сессию
  [CMD_TRACE_LOCFRWD_ON]   - включает  трассировку для входящих пакетов для которых не удалось найти сессию
  [CMD_TRACE_LOCFRWD_OFF]  - выключает трассировку для входящих пакетов для которых не удалось найти сессию
 
Настройка дополнительной фильтрации пакетов TRACE:
  [CMD_TRACE_FILTER_SET_P [p<pr> [- <pr_e>]] [s<pksz> [- <pksz_e>]] [dI|O|B] [rD|A|B]] - включает фильтрацию по протоколу, размeру пакетов, направлению и статусу
    p<pr>   [- <pr_e>]   - фильтр по диапазону протоколов, также допустимо pT - tcp, pU - udp, pI - icmp, pO - other протоколы.
    s<pksz> [- <pksz_e>] - фильтр по размеру пакетов
    dI|O|B               - фильтр по направлению (direction) dI - только входящие, dO - только исходящие, dB - входящие и исходящие
    rD|A|B               - фильтр по статусу (result) rD - только DROP'ed, rA - только ACCEPT'ed, dB - DROP и ACCEPT
    
  [CMD_TRACE_FILTER_SET_{U|N|D|S} [<ip> [- <ip_e>]] [: <port> [- <port_e>]] ]- включает фильтрацию по адресам и портам (USER, NAT, DEST и SESSION DEST)
    U|N|D|S              - определяет к каким адресам применять команду U - USER, N - NAT, D - DEST, S - SESSION DEST        
    <ip> [- <ip_e>]      - фильтр по диапазону ip адресов
    :<port> [- <port_e>] - фильтр по диапазону портов

Сброс дополнительных фильтров TRACE:    
  [CMD_TRACE_FILTER_SET_P]
  [CMD_TRACE_FILTER_SET_{U|N|D|S}]
 
Активация/деактивация (включение/отключение работы) дополнительного фильтра:
  [CMD_TRACE_FILTER_ON]
  [CMD_TRACE_FILTER_OFF]

Разрешение трассировки пакетов:
  [CMD_TRACE_START]
Остановка трассровки пакетов:
  [CMD_TRACE_STOP]

* Новые комманды в 1.01 (wv0_09)
  [CMD_RESET_CNT_ER]             - новая
  [CMD_STATIC_MAP_xxx ... ]     - новая
  [CMD_KILL_xxx ...]            - добавлено описание поля [p<PROTO>]
 
==============================================================
===== ==HOW_IT_WORK== Описание алгоритмов работы xt_ANAT =====
//TODO

===================================================================================================
===== ==METODICS== Методики работы с xt_ANAT и его настройка, борьба со спамероами и вирусней =====
//TODO

 

 

Запуск на 5.х ядрах и выше (есть готовые патчи от @vurd , см. ниже):

Скрытый текст

Тут мне  прислали попытку компиляции ANAT на последних версиях на 5.х ядре вот мои замечания, если что:

 

Ошибки:

1) %ld

%lld - это можно просто поправить изменив %ld на %lld, где просит компилятор.

 

2) proc_create

проблему с proc_create надо решить подобно этому:

https://github.com/dtrace4linux/linux/issues/143

(надо поменять типы, сократить поля и всё будет ок)

вызовов её много - ручной работы много, но она однообразная и не сложная

 

3) kernel_getsockopt

пока можно просто закомментить строчки с 527 по 541 в xt_ANAT_pc_nf9, но диагностика ошибок сокета и их лог работать не будут. Надо копать как в новых версиях ядра получать информацию об ошибках в сокете (видимо через sock_error или sock_getsockopt, но как оно в kernel mode будет)....

 

В общем если кто поправит - пришлите ваш вариант или советы.

Если кто-то захочет что-бы я сам глянул и поправил - вопрос решаемый, но не "бесплатно".

 

Если кто на 6.х пришлет лог ошибок - могу также глянуть!

 

====================================================================================

Утилиты anf_xxx для обработки Netflow пакетов ANAT:

 

anf_capd_0_06_public

https://disk.yandex.ru/d/XbCxikN5GLz-WQ

 

Документация:

Скрытый текст

0.0.06
Документация
    Набор утилит anf_xxx предназначен для сбора данных по Netflow (nf9) от модуля Advanced asymmetric CG NAT xt_ANAT (ANAT) и их последующей обработки.
    Сборка проекта:
        make clean && make all
        
    Примеры запуска
        ./anf_capd -h
        ./anf_capd -d ./tst -D
        ./anf_capd -d ./tst -p 3055 -b 127.0.0.1 -F 4000 -E

        ./anf_prcf -f ./tst/d00001_20240722-0425.anf -p
        ./anf_prcf -f ./tst/d00001_20240722-0425.anf -P
        ./anf_prcf -f ./tst/d00001_20240722-0425.anf -o ./tst/d00002_20240131-0425.anf -I     
        ./anf_prcf -f ./tst/old.anf -o ./tst/new.anf -I 324
        ./anf_prcf -f ./tst/d00001_20240722-0425.an  -o ./tst/d00001_20240131-0425.ank -e  
        
    === anf_capd ===
    Для приема данных по протоколу Netflow  используется утилита anf_capd запущенная в режиме демона (опция -D).
    anf_capd открывает на прослушивание UDP сокет и записывает полученные данные в файлы <fname>.anf (файл ANF) в рабочий каталог указанный в обязательной опции -d.
    Файлы ANF создаются с заданным интервалом (опция -t). В начале интервала создается файл <fname>.an (файл AN) в который производится непосредственная запись.
    По истечении интервала происходит завершение работы с файлом AN и его переименование в <fname>.anf и открывается новый файл <fname>.an.
    В файле ANF помимо данных Netflow сохраняются данные о пакете, а также специальный заголовок и футер для индикации состояния файла.
    Просмотреть информацию в файле ANF можно с помощью утилиты anf_fprc (описана ниже).
    Для диагностики состояния своей работы anf_capd также создает в рабочем каталоге текстовый файл w<ANF_ID>_capd.wsf (файл capd_WSF).
    Файл capd_WSF перезаписывается примерно каждые 15 секунд (см. anf_util.h: #define ANU_WSF_UPDATE_S) и позволяет контролировать состояние экземпляра демона anf_capd.
    На одном сервере может быть запущено несколько экземпляров демона anf_capd с разными рабочими каталогами или с разными ANF_ID (опция -I).
    ВНИМАНИЕ! Запуск нескольких экземпляров демона anf_capd с одновременно одинаковыми рабочими каталогами и ANF_ID может привести к непредсказуемым последствиям!
    Для проверки наличия уже запущенного экземпляра демона можно проверить наличие файла capd_WSF в каталоге и процесса (ps aux | grep PID) c PID из файла capd_WSF.
    
    Замечания:
    - При большой нагрузке в качестве рабочего каталога рекомендуется использовать диски с высокой скоростью записи (SSD или IN_MEMORY).
    - Утилита anf_capd может запускаться как в режиме демона так и в режиме консоли. Для диагностики ошибок рекомендуется её запуск в режиме консоли с опцией -E.
    - Для корректной работы anf_capd на источнике (ANAT) и приемнике (anf_capd) должны быть установлены одинаковые порты Netflow (опция -p) и FLOWSET_ID (опция -F).
    - По умолчанию для anf_capd указаны порт и FLOWSET_ID совпадающие с настройками по умолчанию используемыми в ANAT.
    - Посмотреть значения настроек по умолчанию, а также список всех доступных опций можно с помощью команды "$>anf_capd -h" (опция -h).
    - Можно собирать одним демон данные с нескольких серверов ANAT в один набор файлов ANF, но при этом рекомендуется использовать различные SOURCE_ID в Netflow.
    - если надо перезапустить демон anf_capd и при этом не потерять данные, можно поступить так:
        1) открываем новый поток nf9 с xt_ANAT на другой порт (меняем конфигурацию на лету);
        2) включить сбор nf9 другим (новым) экземпляром anf_capd с нового порта с новым ANF_ID или в другом рабочем каталоге;
        3) остановить (kill PID) старый экземпляром anf_capd
        4) отключить в xt_ANAT старый поток nf9 (если он больше не нужен).
        
    = ANF_ID =
    В заголовке файла ANF помимо прочих атрибутов есть специальный идентификатор ANF_ID который может быть задан при запуске anf_capd (опция -I).
    ANF_ID используется в двух целях: 1)для идентификации и разделения работы демонов (процессов) формирующих файлы ANF; 2)для формирования <fname> файла ANF.
    Изменение имени файла ANF не приводит к автоматическом изменению ANF_ID в заголовке файла, как и обратное. Изменить ANF_ID в заголовке можно с помощью anf_fprc.

    = <fname> =
    Формат имени файла ANF следющий:
    d<IIIII>_<YYYYMMDD>-<HHMM><SS>.anf где:
        <IIIII>    - 5 цифр которые являются дополненным нулями спереди ANF_ID
        <YYYYMMDD> - локальная дата на локальной машине в момент создания файла AN
        <HHMM>     - локальное время (часы, минуты) на локальной машине в момент создания файла AN
        <SS>       - локальное время (секунды) на локальной машине в момент создания файла AN, добавляется только если интервал (-t) меньше 60 секунд.
    
    === anf_fprc ===    
    anf_fprc - утилита для работы с файлами ANF (AN) и позволяет:
        - выводить данные из файлов в текстовом виде
        - проводить проверку целостности данных в файлах
        - частично восстанавливать поврежденные или неполные файлы, например, после некорректной остановки работы anf_capd (опция -o)
        - проводить фильтрацию данных при обработке по SOURCE_ID (опция -S)
        - заменять ANF_ID в заголовке нового файла (опция -I совместно с -o)
    Для запуска anf_fprc необходимо указать как минимум имя файла для обработки (опция -f), для формирования исправленного (нового) файла необходимо задать его имя (-o).
    Формат имени входящего (-f) и исходящего (-o) не имеют значение, за исключением использования опции -I c -о.
    Для вывода информации из пакетов nf9 в текстовом виде в stdout (консоль) используются следующие опции "печати":
        -p - выводить всю информацию"  (использование с другими опциями печати зависит от порядка их следования!!!)
        -e - выводить информацию с ошибками в данных
        -с - выводить информацию с корректными данными
        -i - выводить информацию о событиях (записях) nf9
        -k - выводить информацию о полученных пакетах nf9
        -r - выводить информацию из заголовка и футера файла ANF
    Для вызова anf_fprc из демонов или скриптов есть две дополнительные опции:
        -D - перенаправляет вывод ошибок в syslog, а не stderr (по умолчанию).
        -P - выводит (помимо согласно опций "печати") в конце в stdout специальный блок ANFENVIR с информацией для автоматической обработки результатов в скриптах.
    Формат и коды состояния и коды ошибок блока ANFENVIR можно найти в файле anf_fprc.h
        
    Замечания:
    - Для диагностики ошибок рекомендуется запуск в с опцией -E.
    - Посмотреть значения настроек по умолчанию, а также список всех доступных опций можно с помощью команды ">anf_fprc -h" (опция -h).
    - При формирование нового файла (-o) если файл получил изменения в футер в поле sz_repair (см. anf_data.h) будет записана длина исходного файла.
    
    
    = Текстовые коды ошибок в выводе anf_fprc в stdout (см. anf_fprc.с: anfp_ChErrInfo()) =
        case 0: return  "OK_NER";    //OK: NO ERROR
        case 10: return "HDRSIZ";    //ERROR: HEADER SIZE READ BYTE
        case 11: return "HDRVER";    //ERROR: HEADER INCORRECT VERSION
        case 12: return "HDRAID";    //ERROR: HEADER INCORRECT ANF_ID DATA
        case 13: return "HDRAIZ";    //ERROR: HEADER ANF_ID = 0
        case 20: return "FSGSIZ";    //ERROR: FOOTER FF SIGNATURE SIZE READ BYTE
        case 21: return "FSGSF1";    //ERROR: FOOTER FF SIGNATURE FSGSF1 NOT 0xFF..FF
        case 22: return "FSGSF2";    //ERROR: FOOTER FF SIGNATURE FSGSF2 NOT 0xFF..FF
        case 23: return "FSGSF3";    //ERROR: FOOTER FF SIGNATURE FSGSF3 NOT 0xFF..FF
        case 24: return "FSGSF4";    //ERROR: FOOTER FF SIGNATURE FSGSF4 NOT 0xFF..FF
        case 25: return "FSGNFN";    //ERROR: FOOTER FF SIGNATURE NOT FOUND
        case 30: return "RECSIZ";    //ERROR: RECORD SIZE READ BYTE
        case 31: return "RECPKH";    //ERROR: RECORD IS PKH (PACKET HEADER)
        case 32: return "RECFSG";    //ERROR: RECORD IS FSG (FOOTER SIGNATURE)
        case 33: return "RECIGN";    //ERROR: RECORD IS IGN (IGNORE EVENT VALUE = 0)
        case 34: return "RECUNK";    //ERROR: RECORD IS UNK (UNKNOWN EVENT VALUE)
        case 40: return "PKERCN";    //WARNING: PKT RECORD COUNT NOT EQUAL PKH HEADER VALUE
        case 50: return "FTRSIZ";    //ERROR: FOOTER SIZE READ BYTE         
        case 51: return "FTRGRB";    //ERROR: FOOTER SIZE TOO LONG (SOME GARBAGE AT THE END)         
        case 52: return "FTRCNT";    //ERROR: PACKETS AND RECORDS COUNTS NOT EQUAL FOOTER INFO VALUE         
        return "ERRUNK";             //ERROR: UNKNOWN ERROR

========================================================================================================
Вы можете использовать настоящее ПО исключительно в некомерческих целях.
Желающие отблагодарить автора или использовать код для коммерческих целей могут обратиться на почту: sdy@mail.ru

Ваш автор, Сербулов Дмитрий (aka SDY).

 

 ===============================================================================

Версии xt_ANAT с патчами от @vurd  для 5.x и 6.x ядер (данные об их работе у меня пока нет):

 

Share this post


Link to post
Share on other sites

Поправил код для возможности компиляции под 5-ые ядра.

 

4.19.67

make -C /lib/modules/4.19.67-nat/build/ M=/root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch modules CONFIG_DEBUG_INFO=y
make[1]: Entering directory '/usr/src/linux-headers-4.19.67-nat'
  CC [M]  /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.mod.o
  LD [M]  /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.19.67-nat'
sync
gcc -O2 -Wall -Wunused -fPIC -o libxt_ANAT_sh.o -c libxt_ANAT.c
gcc -shared -o libxt_ANAT.so libxt_ANAT_sh.o
rm libxt_ANAT_sh.o

 

5.10.0

make -C /lib/modules/5.10.0-21-amd64/build/ M=/root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch modules CONFIG_DEBUG_INFO=y
make[1]: Entering directory '/usr/src/linux-headers-5.10.0-21-amd64'
  CC [M]  /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.o
  MODPOST /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/Module.symvers
  CC [M]  /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.mod.o
  LD [M]  /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.10.0-21-amd64'
sync
gcc -O2 -Wall -Wunused -fPIC -o libxt_ANAT_sh.o -c libxt_ANAT.c
gcc -shared -o libxt_ANAT.so libxt_ANAT_sh.o
rm libxt_ANAT_sh.o

 

6.1.0 (тут не собирается)

make -C /lib/modules/6.1.0-23-amd64/build/ M=/root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch modules CONFIG_DEBUG_INFO=y
make[1]: Entering directory '/usr/src/linux-headers-6.1.0-23-amd64'
  CC [M]  /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.o
In file included from /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.c:290:
/root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT_pc_config.c:54: warning: "isdigit" redefined
   54 | #define isdigit(c) ('0' <= (c) && (c) <= '9')
      |
In file included from /usr/src/linux-headers-6.1.0-23-common/include/linux/string_helpers.h:6,
                 from /usr/src/linux-headers-6.1.0-23-common/include/linux/seq_file.h:7,
                 from /usr/src/linux-headers-6.1.0-23-common/include/linux/seq_file_net.h:5,
                 from /usr/src/linux-headers-6.1.0-23-common/include/net/net_namespace.h:191,
                 from /usr/src/linux-headers-6.1.0-23-common/include/linux/netdevice.h:38,
                 from /usr/src/linux-headers-6.1.0-23-common/include/net/sock.h:46,
                 from /usr/src/linux-headers-6.1.0-23-common/include/linux/tcp.h:19,
                 from /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.c:225:
/usr/src/linux-headers-6.1.0-23-common/include/linux/ctype.h:41: note: this is the location of the previous definition
   41 | #define  isdigit(c) __builtin_isdigit(c)
      |
In file included from /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.c:322:
/root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT_pc_nf9.c: In function axt_nf9_send_thr_done’:
/root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT_pc_nf9.c:787:45: error: struct task_struct has no member named state’; did you mean stats’?
  787 |                 if ( !(axt_nf9_send_thread->state & (EXIT_DEAD | EXIT_ZOMBIE) ) ) {
      |                                             ^~~~~
      |                                             stats
make[2]: *** [/usr/src/linux-headers-6.1.0-23-common/scripts/Makefile.build:255: /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch/xt_ANAT.o] Error 1
make[1]: *** [/usr/src/linux-headers-6.1.0-23-common/Makefile:2034: /root/compile/xt_anat/axt_NAT_v0_09_public_01_v5_patch] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.1.0-23-amd64'
make: *** [Makefile:11: xt_ANAT.ko] Error 2

 

Как опросить сокет на ошибки выяснить не удалось, поэтому этот кусок не будет работать в пятерке, но, как понимаю, он не то чтобы очень нужный.

 

http://www.ots-net.ru/files/axt_NAT_v0_09_public_01_v5_patch.tar.bz2

 

"Код написал, собрал, в работе не проверял, продавец хороший, рекомендую" :)

 

upd. Для >5.14 тоже поправил.

 

6.1.0

make -C /lib/modules/6.1.0-23-amd64/build/ M=/root/compile/xt_anat/axt_NAT_v0_09_public_01_v6_patch modules CONFIG_DEBUG_INFO=y
make[1]: Entering directory '/usr/src/linux-headers-6.1.0-23-amd64'
  CC [M]  /root/compile/xt_anat/axt_NAT_v0_09_public_01_v6_patch/xt_ANAT.o
  MODPOST /root/compile/xt_anat/axt_NAT_v0_09_public_01_v6_patch/Module.symvers
  CC [M]  /root/compile/xt_anat/axt_NAT_v0_09_public_01_v6_patch/xt_ANAT.mod.o
  LD [M]  /root/compile/xt_anat/axt_NAT_v0_09_public_01_v6_patch/xt_ANAT.ko
  BTF [M] /root/compile/xt_anat/axt_NAT_v0_09_public_01_v6_patch/xt_ANAT.ko
Skipping BTF generation for /root/compile/xt_anat/axt_NAT_v0_09_public_01_v6_patch/xt_ANAT.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-6.1.0-23-amd64'
sync
gcc -O2 -Wall -Wunused -fPIC -o libxt_ANAT_sh.o -c libxt_ANAT.c
gcc -shared -o libxt_ANAT.so libxt_ANAT_sh.o
rm libxt_ANAT_sh.o

 

http://www.ots-net.ru/files/axt_NAT_v0_09_public_01_v6_patch.tar.bz2

Share this post


Link to post
Share on other sites

Хм, надо попробовать будет. xt_NAT довольно успешно стоит, а тут еще и нетфлоу9...

Share this post


Link to post
Share on other sites

11 минут назад, ShumBor сказал:

Хм, надо попробовать будет. xt_NAT довольно успешно стоит, а тут еще и нетфлоу9...

Не буду хвастаться, но буду честен xt_NAT не очень хорошо написан, у него есть некоторые места которые прямо "дестабилизируют" систему,  если бы взгляд сразу не зацепился за такие места, то и писать ANAT я бы не стал. Я могу смело утверждать, что ANAT это практически другой уровень, хотя базируется на некоторых идеях xt_NAT.

xt_NAT - скорее любительский софт.

ANAT - гораздо ближе к профессиональному решению.

Share this post


Link to post
Share on other sites

Выложил также утилиты anf_xxx для работы с Netflow ANAT (в топе темы)

Ссылка (в будущем здесь не будет обновляться)

anf_capd_0_06_public:

https://disk.yandex.ru/d/XbCxikN5GLz-WQ

Share this post


Link to post
Share on other sites

Столкнулся с тем, что не все понимают, чем отличается CGNAT (Asymmetric NAT) от классического Symmetric NAT.

Нашел простенький материал на эту тему, так вот Asymmetric NAT CGNAT в терминах этой статьи - НАТ с Полным конусом (Full Cone).

Ссылка на статью с картинками:

https://asvk.cs.msu.ru/~bahmurov/networks_intro/2018/auntumn/Типы трансляции сетевых адресов кратко.pdf

 

В чем плюсы CGNAT (Asymmetric NAT) - это беспроблемная прозрачная работа сервисов peer-to-peer и экономия портов при их работе.

В чем минус - низкая безопасность (это не файрвол!).

А чтобы клиентам (приложениям) было проще понять, что оператор использует CGNAT была  выделена отдельная подсеть адресов: 100.64.0.0/10

 

Всем добра.

 

Выдержка из текста статьи (без картинок):

Скрытый текст

Типы трансляции сетевых адресов (NAT)

Схема работы NATа
Типы трансляторов сетевых адресов (NAT)
Трансляторы адресов подразделяются на 4 типа:
1. Полный конус (Full Cone)
2. Ограниченный конус (Restricted Cone)
3. Порт ограниченного конуса (Port Restricted Cone)
4. Симметричный (Symmetric)


В первых трех типах NATа разные IP-адреса внешней сети могут взаимодействовать с
адресом из локальной сети используя один и тот же внешний порт. Четвертый типа, для
каждого адреса и порта использует отдельный внешний порт.


NAT обычно не имеет статической таблицы соответствия адресов и портов. Отображение
открывается, когда первый пакет посылается из локальной сети наружу через NAT и
действует определенный промежуток времени (как правило, 1-3 минуты), если пакеты
через этот порт не проходят, то порт удаляется из таблицы соответствия. Обычно NAT
распределяют внешние порты динамически, используется диапазон выше 1024.


Полный конус (Full Cone)

При использовании NATа работающего по типу полного конуса внешний отображаемый
порт открыт для пакетов приходящих с любых адресов. Если кто-то из внешнего
Интернета хочет в этот момент отправить пакет клиенту, расположенному за НАТом, то
ему нужно знать только внешний порт через который установлено соединение. Например,
компьютер за NATом с IP-адресом 10.0.0.1 посылает и получает пакеты через порт 8000,
отображающийся на внешний IP-адрес и порт 212.23.21.25:12345, то любой в Интернете
может послать пакеты на этот 212.23.21.25:12345, и эти пакеты попадут на клиентский
компьютер 10.0.0.1:8000.


Ограниченный конус (Restricted Cone)
NAT, c ограниченным конусом, открывает внешний порт сразу после того как локальный
компьютер отправит данные на определенный внешний IP-адрес. Например, если клиент
посылает наружу пакет внешнему компьютеру 1, NAT отображает клиента 10.0.0.1:8000
на 212.23.21.25:12345, и внешний компьютер 1 может посылать пакеты назад по этому
назначению. Однако, NAT будет блокировать пакеты идущие от компьютера 2, до тех пор
пока клиент не пошлет пакет на IP-адрес этого компьютера. Когда он это сделает, то оба
внешних компьютера 1 и 2 смогут посылать пакеты назад клиенту, и оба будут иметь одно
и то же отображение через НАТ.


Порт ограниченный конус (Port Restricted Cone)
NAT с портом ограниченного конуса почти идентичен NATу с ограниченным конусом.
Только в этом случае, NAT блокирует все пакеты, если клиент предварительно не послал
наружу пакет на IP-адрес и порт того компьютера, который посылает пакеты клиенту.
Поэтому, если клиент посылает внешнему компьютеру 1 на порт 5060, то NAT только
тогда пропустит пакет к клиенту, когда он идет с 212.33.35.80:5060. Если клиент послал
наружу пакеты к нескольким IP-адресам и портам, то они могут ответить клиенту на один
и тот же отображенный IP-адрес и порт.


Симметричный (Symmetric)
Симметричный NAT кардинально отличается от первых трех в способе отображения
внутреннего IP-адреса и порта на внешний адрес и порт. Это отображение зависит от IP-
адреса и порта компьютера, которому предназначен посланный пакет. Например, если
клиент посылает с адреса 10.0.0.1:8000 компьютеру 1, то он может быть отображен как
212.23.21.25:12345, в тоже время, если он посылает с того же самого порта (10.0.0.1:8000)
на другой IP-адрес, он отображается по-другому (212.23.21.25:12346).
Компьютер 1 может отправить ответ только на 212.23.21.25:12345, а компьютер 2 может
ответить только на 212.23.21.25:12346. Если любой из них попытается послать пакеты на
порт с которого он не получал пакеты, то эти пакеты будут игнорированы. Внешний IP-
адрес и порт открывается только тогда, когда внутренний компьютер посылает данные
наружу по определенному адресу

 

Share this post


Link to post
Share on other sites

----------------------------------------------------------------------------------------------------------------------------------------

ВНИМАНИЕ!

Ввиду обнаружения мною выложенных кем-то исходников ANAT на других ресурсах от моего имени, я  хотел-бы всех предупредить:

я не размещал где либо (в т.ч. на гитхабе) исходные коды ANAT кроме моих ссылок на этом форуме.

Скачивая исходники из других источников вы можете получить не то, на что рассчитываете, в т.ч. "закладки".

----------------------------------------------------------------------------------------------------------------------------------------

Если что-то изменится - сообщу здесь.

 

З.Ы.

Любителям ЛГБТ  и 404 с гитхаба - я не обидчивый. Но условия лицензии не стоит нарушать.

Share this post


Link to post
Share on other sites

Всплыл момент с неполнотой документации по ANAT  по счетчику OV_MSLIM'.

 

Это раньше был счетчик MANY SESSION LIMIT (это устаревшее название, правильно сейчас было-бы USER WARNING SESSION LIMIT и кстати >1k в описании тоже - не верно).

Этот счетчик увеличивается на 1 когда число сессий у клиента в протоколе (UDP/TCP/ICMP/OTHER.) превысило параметр USR_WRN_SS_xxx по умолчанию 2024/2024/128/32. Он сам не сбрасывается, считается нарастающим итогом. Сбросить можно всю группу счетчиков OV.

Если он увеличивается, то скорее всего у кого-то вирусня или торент "анлим". Посмотреть у кого и что за трафик можно через буфер сообщений - событие  'W-ULIM'.

 

В следующих версиях (видимо) будет исправлено его описание при выдачи информации в консоле.

Share this post


Link to post
Share on other sites

В 24.07.2024 в 13:11, sdy_moscow сказал:

@Ivan_83 Лень мне напрягаться под правила всяких площадок. И тем более еще кормить ИИ на халяву.

Печально.

Выложили бы на гитхаб, не пришлось бы писать предупреждающее сообщение...

Share this post


Link to post
Share on other sites

48 минут назад, Morty сказал:

Печально.

Выложили бы на гитхаб, не пришлось бы писать предупреждающее сообщение...

Так на гитхабе и не зарегаться уже из России. Впрочем цели такой нет. С Яндекс диска всё качается без проблем. Проект не очень большой. Как буду свободен, добью и уже выложу на российской площадке Гита

Share this post


Link to post
Share on other sites

Тут задали вопрос (продублирую ответ):

В 24.11.2024 в 12:18, myth сказал:

Почитал про ANAT и чет вообще нихрена не понял из скудной документации. Пример конфига бы хоть. Ну и в чем плюсы от обычного ната?

Пример конфига есть в каталоге (архиве) с проектом. Сама документация по большому счету и есть в основном описание конфигурации и работы с настройками приложения.

 

Про плюсы:

1. Это решение для работы CGNAT (в теме есть ссылка на статью с описанием разницы)

2. Это решение оптимизировано под высокую производительность с учетом архитектуры процессоров Intel и их клонов.

3. Это решение предназначено для тех операторов у кого много абонентов за НАТом и где доступность сервиса должна быть 24х7.

4. Это ОЧЕНЬ стабильное решение, спроектированное с гарантированной производительностью с минимальной задержкой при обработке трафика!

4. Плюшки:

 - стабильная работа без зависаний и фризов (c xt_nat это было проблемой, что и заставило написать свой модуль)

 - стабильная работа c НЕСКОЛЬКИМИ потоками NETFLOW (в т.ч. для СОРМ)

 - изменение практически всех настроек "на лету" (без остановки/старта модуля) (полезно в первую очередь для изменения пулов адресов)

 - разнообразные встроенные средства  мониторинга как для алармов (различные счетчики) так и просмотр подозрительного трафика, лог ошибок, дропов и т.д.

 - различные функции для администратора (например можно тестировать работу через конкретный ИП)

 - функция portmaping

 - настраиваемая "на лету" индивидуальная политика NAT (выделение пулов адресов для спамеров, лимиты кол-ва сессий и т.п.) для разных групп пользователей

 - поддержка множественной работы с одного адреса не UDP|TCP|ICMP протoколов

 - и много еще разных мелочей, читайте документацию внимательно, задавайте вопросы в теме проекта

 

---------------------

И еще:

ANAT - это не биллинг и не система мониторинга. Это модуль ядра xtables главная задача которого ОЧЕНЬ быстро осуществлять NAT трансляции в соответствии с идеями CGNAT,  плюс туда добавлен еще ряд полезных для администратора функций.

 

ANAT  это далеко, точнее даже совсем не DPI, а скорее наоборот "дырка" в системе безопасности, в отличии от обычного NAT порой выполняющего роль файрвола.

 

Что такое CGNAT - кратко - это способ организовать максимально прозрачный NAT для клиентов и выжать по максимуму из IPv4.

Share this post


Link to post
Share on other sites

@sdy_moscowПотестил ваш модуль в сравнении с NAT на nft+flowtable для оффлоада. Результаты приятно удивили. При одном и том же трафике при работе через nft+flowtable загрузка ядер, на которых работает сетевая, в 3-5 раз выше, чем при работе через xt_ANAT. Огромная благодарность за данный модуль. Единственной проблемой стало то, что пришлось отключить GRO в настройках сетевой карты, т.к. на интерфейсе странно работает обработка "больших" пакетов, которые собраны из нескольких маленьких со стандартным mtu сетевой картой, а именно, часть таких пакетов дропается и в ответ на них генерится ICMP packet too big. В случае с nft GRO работает без проблем. Попробую поискать в вашем коде, что может влиять.

Share this post


Link to post
Share on other sites

39 минут назад, John_obn сказал:

@sdy_moscowПотестил ваш модуль в сравнении с NAT на nft+flowtable для оффлоада. Результаты приятно удивили. При одном и том же трафике при работе через nft+flowtable загрузка ядер, на которых работает сетевая, в 3-5 раз выше, чем при работе через xt_ANAT. Огромная благодарность за данный модуль. Единственной проблемой стало то, что пришлось отключить GRO в настройках сетевой карты, т.к. на интерфейсе странно работает обработка "больших" пакетов, которые собраны из нескольких маленьких со стандартным mtu сетевой картой, а именно, часть таких пакетов дропается и в ответ на них генерится ICMP packet too big. В случае с nft GRO работает без проблем. Попробую поискать в вашем коде, что может влиять.

На роутере GRO лучше отключать. Исторически на forwarding-е с ним вылезают баги. Зачем он вам? У вас же интернет-трафик? Обычный Internet mix? Транзитный трафик локальными сокетами обрабатывать не нужно.

 

Фрагментов в imix в худшем случае десятые доли процента, если конечно вас не насилуют DDoS-ом. А если насилуют, то никакой GRO не поможет.

 

Вот например как бывает с GRO на роутере:

 

https://patchwork.ozlabs.org/project/netdev/patch/73223229-6bc0-2647-6952-975961811866@gmail.com/

 

Вполне может быть, что и из NFT можно было бы выжать больше без GRO.

Share this post


Link to post
Share on other sites

Для чистого роутера GRO возможно и лишнее, но для NAT, да еще и conntrack, оно вполне себе годно. @John_obn Что за железо, особенно сетевой адаптер?

Share this post


Link to post
Share on other sites

5 часов назад, John_obn сказал:

@sdy_moscowПотестил ваш модуль в сравнении с NAT на nft+flowtable для оффлоада. Результаты приятно удивили. При одном и том же трафике при работе через nft+flowtable загрузка ядер, на которых работает сетевая, в 3-5 раз выше, чем при работе через xt_ANAT. Огромная благодарность за данный модуль. Единственной проблемой стало то, что пришлось отключить GRO в настройках сетевой карты, т.к. на интерфейсе странно работает обработка "больших" пакетов, которые собраны из нескольких маленьких со стандартным mtu сетевой картой, а именно, часть таких пакетов дропается и в ответ на них генерится ICMP packet too big. В случае с nft GRO работает без проблем. Попробую поискать в вашем коде, что может влиять.

Спасибо за отзыв, хоть кто-то что-то написал 🙂. А то что-то все молчат. Как я ни раз уже писал, ANAT спроектирован и написан мною под почти максимальную производительность на многоядерном процессоре с 64 байтной строкой кэша и развитой технологией кэширования. Конечно, всегда еще есть, что можно улучшить, но, думаю,  совсем не много.

 

Попробуйте еще попользовать фитчи типа мониторинга и логов - вам тоже понравится. Ну и можно спокойно нетфлоу поднимать на несколько приемников.

 

Что касательно GRO, тут: "ДА! ПРОБЛЕМЫ  ДОЛЖНЫ БЫТЬ!". Если стэк линукса сам такие пакеты не разберет на части перед обработкой в ядре (а он их не разберет насколько я понимаю), то с АНАТ будут проблемы. Также еще могут быть проблемы с теми сетевухами и драйверами, которые буферизируют трафик, отсылая в обработку ядру лишь заголовки пакетов, а не целиком пакет. К сожалению, живых "примеров" работы с таким трафиком под рукой не было, а поверхностный гуглеж их не дал. Документация же по ядру линукса настолько скудновата и устарела, что прям плакать хотелось во время возни с модулем,  а в сырцы погружаться так глубоко времени не было.

 

ПОЭТОМУ, ПРОСЬБА, если кто-то знает где почитать или посмотреть примеры работы с GRO и буферезацией на сетевых платах - напишите ссылки ну или хотя-бы названия настроек (вот про GRO написали - вроде даже нашел кое-что), почитаю и в след. версиях постараюсь исправить функционал.

А в остальном - пока-что эти продвинутые функции на сетёвках надо отключать.

 

(GRO) generic receive offload  - https://habr.com/ru/companies/vk/articles/314168/

 

Share this post


Link to post
Share on other sites

@John_obn Что касательно места которое надо "копать" для обработки GRO и иных фитчей трафика, то это, по моему сугубо авторскому мнению, ОДНА единственная функция в коде - точка входа обработки трафика axt_dnt_nat_tg в файле xt_ANAT_pc_donat.c.

Предположу, что надо, прочитать  какие-то флаги пакета и (или) запустить пакет в повторную обработку в разобранном виде, ну или лазить очень глубоко по его структуре, а может вызвать какие-то функции ядра для его подготовки к обработке. ЧЕСТНО, на сегодня, Я НЕ ЗНАЮ! Кто знает - пишите!

 

Логика алгоритма axt_dnt_nat_tg взята практически полностью из xt_nat, только была мною оптимизирована под новые струткутры данных, логирование и высокую производительность.

 

Share this post


Link to post
Share on other sites

2 часа назад, Savchenko сказал:

Есть один очень большой вопрос, сколько mpps удавалось получить с одного сервера на таком модуле? 

Я смело предположу, что он "выжмет" весь интерфейс "до дна" в мелких пакетах.... причем с миллионом трансляций. Размеры хэш таблиц только может придется подкрутить. Счетчики смотрите. Существенным значением влияющим на производительность является число новых трансляций в минуту. Вот тут могут возникнуть НЕБОЛЬШИЕ проблемы, теоретически - типа скорости выделения пулов и  объема памяти ядра линукс.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.