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

Assymetric NAT на Linux

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

 

Простейший сенсор, которым я проверял нетфло
 

#!/usr/bin/perl -w

use strict;
use IO::Socket;

#NetFlow port
my $port = 2055;

#Consts
use constant _MAXREAD           => 8192;

my %v9 = (
                              #Offset  Size
                _PROTO     => [0,      1],
                _SRC_PORT  => [1,      2],
                _SRC_IP    => [2,      4],
                _DST_PORT  => [3,      2],
                _DST_IP    => [4,      4],
                _NAT_IP    => [5,      4],
                _NAT_PORT  => [6,      2],
                _NAT_EVENT => [7,      1]
        );

# main datagram receive loop
my $_FLOWRECV9_LEN = 0;
my ($datagram, $version, $count, $i, $data, $sys_uptime, $unix_secs);
my (@flow, @rawdata);
my $socket_opened;
foreach (keys(%v9)) { $_FLOWRECV9_LEN += ${$v9{$_}}[1]; }

while(1){
  $socket_opened = 1;
  my $sock = IO::Socket::INET->new(LocalPort => $port, Proto => 'udp') or $socket_opened = 0;
  if ($socket_opened == 0) {
    select(undef, undef, undef, 5);
    next;
  }
  while ($sock->recv($datagram, _MAXREAD)) {
    ($version, $count, $sys_uptime, $unix_secs) = unpack("nnNN", $datagram);
    next if ($version ne 9);
    $count--;
    substr $datagram, 0, 64, '';
    for ($i = 0; $i < $count; $i++) {
      @flow = unpack("cnNnNNnc", substr($datagram, $i * $_FLOWRECV9_LEN, $_FLOWRECV9_LEN));
      my $src_addr = join '.', unpack 'C4', pack 'N', $flow[${$v9{_SRC_IP}}[0]];
      my $dst_addr = join '.', unpack 'C4', pack 'N', $flow[${$v9{_DST_IP}}[0]];
      my $nat_addr = join '.', unpack 'C4', pack 'N', $flow[${$v9{_NAT_IP}}[0]];
      print "ts: $unix_secs, proto: $flow[${$v9{_PROTO}}[0]], src $src_addr:$flow[${$v9{_SRC_PORT}}[0]], ";
      print "dst: $dst_addr:$flow[${$v9{_DST_PORT}}[0]], nat: $nat_addr:$flow[${$v9{_NAT_PORT}}[0]], event: $flow[${$v9{_NAT_EVENT}}[0]]\n";
    }
  }
}

 



Благодарю за скрипт для проверки.

Вот что имею в выводе
 

./sensornf9.pl
ts: 1692031769, proto: 1, src 192.168.55.10:4078, dst: 77.88.55.60:4078, nat: xx.xx.xx.xx:4078, event: 1
ts: 1692031799, proto: 1, src 192.168.55.10:4096, dst: 5.255.255.70:4096, nat: xx.xx.xx.xx:4096, event: 1
ts: 1692031815, proto: 6, src 192.168.55.10:39362, dst: 185.125.190.49:80, nat: xx.xx.xx.xx:39362, event: 1
ts: 1692031820, proto: 6, src 192.168.55.10:39362, dst: 185.125.190.49:80, nat: xx.xx.xx.xx:39362, event: 2
ts: 1692031822, proto: 1, src 192.168.55.10:4220, dst: 5.255.255.70:4220, nat: xx.xx.xx.xx:4220, event: 1
ts: 1692031824, proto: 1, src 192.168.55.10:4078, dst: 77.88.55.60:4078, nat: xx.xx.xx.xx:4078, event: 2
ts: 1692031826, proto: 1, src 192.168.55.10:4222, dst: 5.255.255.70:4222, nat: xx.xx.xx.xx:4222, event: 1
ts: 1692031830, proto: 1, src 192.168.55.10:4096, dst: 5.255.255.70:4096, nat: xx.xx.xx.xx:4096, event: 2
ts: 1692031849, proto: 1, src 192.168.55.10:4220, dst: 5.255.255.70:4220, nat: xx.xx.xx.xx:4220, event: 2
ts: 1692031984, proto: 1, src 192.168.55.10:4222, dst: 5.255.255.70:4222, nat: xx.xx.xx.xx:4222, event: 2
ts: 1692032109, proto: 1, src 192.168.55.10:5120, dst: 5.255.255.70:5120, nat: xx.xx.xx.xx:5120, event: 1
ts: 1692032115, proto: 6, src 192.168.55.10:41078, dst: 185.125.190.48:80, nat: xx.xx.xx.xx:41078, event: 1
ts: 1692032118, proto: 6, src 192.168.55.10:41078, dst: 185.125.190.48:80, nat: xx.xx.xx.xx:41078, event: 2

Это говорит о том, что все передается ок? Вроде ts совпадают по времени.
Если да, то как тогда на коллекторе nfcapd и в выводе nfdump получать до конца нужные поля(X-Src IP Addr:Port) и правильный формат времени? Мне интересно кто то использует ли этот модуль xt_Nat также для передачи netflow 9 на сорм?

Изначально идея перехода с freebsd ipfw nat + shaper на debian нужна для отправки netflow 9 с NEL на СОРМ, потому что в freebsd нет сенсоров с отправкой NEL, так как этот модуль практически исполняет функцию cgnat, то хотелось бы его использовать нежели обычную связку iptables+ipt_netflow.

Share this post


Link to post
Share on other sites

1 час назад, pesvo сказал:

Мне интересно кто то использует ли этот модуль xt_Nat также для передачи netflow 9 на сорм?

Модуль шлёт только NEL, netflow транзита в нём нет в силу естественных причин. Но нашим особистам достаточно зеркала трафика и вот этого nel

Share this post


Link to post
Share on other sites

А никто не пробовал это сделать через eBPF?

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

Share this post


Link to post
Share on other sites

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

 

xt_NAT_doc.zip

Share this post


Link to post
Share on other sites

5 hours ago, sdy_moscow said:

Есть оно у меня переделанное полностью, с гораздо более стабильным кодом, с исправленными дырками

 

xt_NAT_doc.zip 18.42 kB · 15 downloads

Что-то не качает, 500 всё время..

Share this post


Link to post
Share on other sites

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

Что-то не качает, 500 всё время..

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

=====================================================================================================
===== 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

 

 

Share this post


Link to post
Share on other sites

On 4/10/2024 at 8:06 PM, sdy_moscow said:

Есть оно у меня переделанное полностью, с гораздо более стабильным кодом, с исправленными дырками

 

xt_NAT_doc.zip 18.42 kB · 15 downloads

ОГО масштабы O_O

Share this post


Link to post
Share on other sites

Добрый день!
Прочтение документации вызывает экстаз. Можно потестировать ваш модуль ? Или он у вас исключительно для внутренних нужд ? @sdy_moscow

Share this post


Link to post
Share on other sites

22 часа назад, ingvarrwvw сказал:

Добрый день!
Прочтение документации вызывает экстаз. Можно потестировать ваш модуль ? Или он у вас исключительно для внутренних нужд ? @sdy_moscow

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

Share this post


Link to post
Share on other sites

Очень серьезная работа. По NAT events, для сами знаете кого, вопрос тоже решался, смотрю. Подпишусь на тему. Очень интересно.

Share this post


Link to post
Share on other sites

Ок.

Уговорили, но так как чесать нет времени - выкладываю аз из. Претензии не принимаются! И Просьба сырцы не растаскивать по другим площадкам...

 

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

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

 

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

 

 

Share this post


Link to post
Share on other sites

32 минуты назад, sdy_moscow сказал:

@vurd @amasis @ingvarrwvw никто не стал пробовать?

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

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.