Jump to content

Recommended Posts

  • 4 weeks later...
  • Replies 152
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Posted
В 12.01.2021 в 22:57, pppoetest сказал:

Я немножко переписал, и стала совместима, но пришлось пожертвовать стоповым эвентом.

xt_NAT.c

Если вдруг кому нужно, вернул стоповый эвент и добавил для всяких сормов требуемые поля в экспорт

xt_NAT.c

  • 5 months later...
  • 1 month later...
Posted

Проблема: тестовый сервер, один клиент, ноутбук. Перестает натить, на наружном интерфейсе выходят пакеты с внутренним IP, как будто таймер какой протухает и все перестает работать. Если обновить страничку, или перезапустить пинг, опять натит. Когда не натит, в cat /proc/net/NAT/users пусто.

Пример: на клиенте ping dns.server -t, на наружном интерфейсе сервера вижу запросы с внутреннего IP, передергиваю патч у клиента и пинг пошел, на наружном интерфейсе пакеты с nat пула.

 

 

Posted

Юзаешь модуль со своими правками? Если так, то присмотрись к xt_NAT.c, строки 132-133,138-139. Ты убрал getrawmonotonic но не добавил getrawmonotonic64. Возможно причина где-то тут?

 

Хмм, похоже оно давно было депрекейтед, а теперь вообще недоступно. Если не ошибаюсь, использовать ktime_get_raw_ts64

  • 2 weeks later...
Posted (edited)

Да, который чуть выше выложил. этот NAS уже в проде на обычном iptables NAT. Скоро тестовый соберу, буду пробовать дальше. Скомпилировал нормально, обновил пост выше.

Edited by hRUst
Posted
В 28.01.2022 в 09:46, hRUst сказал:

Скоро тестовый соберу, буду пробовать дальше. Скомпилировал нормально, обновил пост выше

Я запустил в прод на 5.10 с ktime_get_raw_ts64 полторы недели назад, пока жалоб нет.

  • 1 year later...
  • 1 month later...
Posted

@pppoetest Приветствую, собрал xt_NAT с ссылки гита которую Вы кинули с поддержкой netflow 9 на debian 11.7.0 ядро 

5.10.0-22-amd64.  Вроде натит нормально клиентов, в proc/net/nat есть данные статистика, сессии, юзеры, но когда хочу отправить  потоки netflow на коллектор за счет netflow 9 вводя команду которая указана на гите "пул адресов нат , адрес коллектора и порт 2055" , но на коллектор ничего не прилетает , там запущен nfcapd с прослушиванием 2055 порта и по tcpdump тоже нет пакетов каких либо на этот порт от сервера где запущен xt_nat. Как понимаю у вас xt_nat долго стоит в проде и все прекрасно работает с netflow9 , подскажите в чем может быть дело, может надо какие то доп модули подзагрузить чтобы netflow 9 заработал на xt_nat?  

Posted
В 12.08.2023 в 13:41, vurd сказал:

Покажите что передаете модулую в опциях и что в дмесг после его загрузки


 

modprobe xt_NAT nat_pool=xx.xx.xx.xx-xx.xx.xx.xx
modprobe xt_NAT nat_pool=xx.xx.xx.xx-xx.xx.xx.xx nf_dest=127.0.0.1:2055 

dmesg | grep xt_NAT   
[   50.684198] xt_NAT: loading out-of-tree module taints kernel.
[   50.684310] xt_NAT: module verification failed: signature and/or required key missing - tainting kernel
[   50.685711] Module xt_NAT loaded
[   50.685718] xt_NAT DEBUG: IP Pool from xx.xx.xx.xx to xx.xx.xx.xx
[   50.685721] xt_NAT DEBUG: nat pool table mem: 4
[   50.685723] xt_NAT DEBUG: NAT hash size: 262144
[   50.685726] xt_NAT DEBUG: Users hash size: 65536
[   50.687613] xt_NAT DEBUG: sessions htable inner mem: 4194304
[   50.689106] xt_NAT DEBUG: sessions htable outer mem: 4194304
[   50.689191] xt_NAT DEBUG: users htable mem: 1048576
[   50.689192] xt_NAT DEBUG: nat pool table mem: 4

cat /proc/net/NAT/users  
192.168.0.10 ->  xx.xx.xx.xx (tcp: 21, udp: 51, other: 0)
Total users: 1

cat /proc/net/NAT/statistics  
Active NAT sessions: 73
Tried NAT sessions: 384
Created NAT sessions: 384
DNAT dropped pkts: 337
Fragmented pkts: 0
Related ICMP pkts: 0
Active Users: 1





Модуль выгружал - загружал с опциями этими, сам сервер перезагружал. 

для теста отправлял и на Lo адрес тоже ничего не прилетает на nfcapd и в tcpdump ничего нет и на удаленный  хост если указать в nf_dest соответственно тоже ничего не прилетает, порты тоже менял вместо дефолта 2055.

Может я где-то мог допустить ошибку при настройке/установке модуля(модуль тоже переустанавливал), так как пока пробую переехать с freebsd ipfw nat на debian и провожу тесты, а с debian, к сожалению, пока особо не работал, но вроде все делал по инструкции с гита.
Может в iptables надо что-то добавить для передачи по порту 2055?

Posted

По коду модуля при загрузке его и включенном netflow вы должны видеть вот это

printk(KERN_INFO "xt_NAT NEL: add destination %s\n", print_sockaddr(&usock->addr));

В вашем логе dmesg я этого не вижу. По какой-то причине в модуль не переданы параметры. Сделайте явно

modprobe -r xt_NAT

modprobe xt_NAT блаблабла

И смотрим в дмесг снова.

 

Posted
53 минуты назад, vurd сказал:

По коду модуля при загрузке его и включенном netflow вы должны видеть вот это

printk(KERN_INFO "xt_NAT NEL: add destination %s\n", print_sockaddr(&usock->addr));

В вашем логе dmesg я этого не вижу. По какой-то причине в модуль не переданы параметры. Сделайте явно

modprobe -r xt_NAT

modprobe xt_NAT блаблабла

И смотрим в дмесг снова.

 


Нашёл свой косяк...
Я думал, что надо вместе
modprobe xt_NAT nat_pool=<Start IP>-<End IP>
и затем
modprobe xt_NAT nat_pool=<Start IP>-<End IP> nf_dest=127.0.0.1:2055

но по факту надо было просто прописать одной командой xt_NAT nat_pool=<Start IP>-<End IP> nf_dest=127.0.0.1:2055 и все.

Но смущает один момент, я начал получать потоки в nfcapd на удаленном сервере nfcapd -E -T all -p 2055 -l /nfcap-test
при чтение через nfdump 
nfdump -R nfcapd.202308141352  
вижу странный вывод, что во-первых, время не корректное, хотя на обоих сервера время правильное и вкл. ntp, и что в столбце X-Dst IP Addr:Port 0.0.0.0:0

Версия nfdump
nfdump -V
nfdump: Version: NSEL-NEL1.6.18

 

nfdump -R nfcapd.202308141352   
Date first seen          Event  XEvent Proto      Src IP Addr:Port          Dst IP Addr:Port     X-Src IP Addr:Port        X-Dst IP Addr:Port   In Byte Out Byte
1970-01-01 03:00:00.000 DELETE  Ignore TCP      192.168.55.55:5309  ->   64.233.165.138:443         xx.xx.xx.xx:5309  ->          0.0.0.0:0            0        0
1970-01-01 03:00:00.000 DELETE  Ignore TCP      192.168.55.55:5307  ->  142.250.150.198:443         xx.xx.xx.xx:5307  ->          0.0.0.0:0            0        0
1970-01-01 03:00:00.000 CREATE  Ignore UDP      192.168.55.55:54248 ->   64.233.165.104:443        xx.xx.xx.xx:54248 ->          0.0.0.0:0            0        0
1970-01-01 03:00:00.000 CREATE  Ignore UDP      192.168.55.55:59572 ->   108.177.14.198:443         xx.xx.xx.xx:59572 ->          0.0.0.0:0            0        0


В сам nfcapd прилетает 
 

Flow Record:  
 Flags        =              0x46 EVENT, Unsampled
 label        =            <none>
 export sysid =                 1
 size         =                96
 first        =                 0 [1970-01-01 03:00:00]
 last         =                 0 [1970-01-01 03:00:00]
 msec_first   =                 0
 msec_last    =                 0
 src addr     =     192.168.55.55
 dst addr     =    108.177.14.198
 src port     =             59572
 dst port     =               443
 fwd status   =                 0
 tcp flags    =              0x00 ........
 proto        =                17 UDP   
 (src)tos     =                 0
 (in)packets  =                 0
 (in)bytes    =                 0
 ip router    =        xx.xx.xx.xx
 engine type  =                 0
 engine ID    =                 0
 received at  =     1692010373229 [2023-08-14 13:52:53.229]
 src xlt port =             59572
 dst xlt port =                 0
 src xlt ip   =        xx.xx.xx.xx
 dst xlt ip   =           0.0.0.0
 nat event    =                 1: ADD
 ingress VRF  =                 0
 egress VRF   =                 0



Покопался на форме в разделе ipt_netflow у людей это было на старой версии nfdump, но тут у меня новая версия nfdump.
 

Подскажите у тех кто использует этот модуль при отправке netflow 9 дата и время корректное и есть ли адреса в столбце X-Src IP Addr:Port? Спасибо.

 

Posted

С гита nfdump поставил версию последнюю nfdump-1.7.2 вместо 1.6.18


 

nfdump -V
nfdump: Version: 1.7.2-696f563 Options: NSEL-NEL Date: 2023-08-12 13:54:54 +0200


запустил и все равно одно и тоже
1970-01-01 03:00:00.000 время  и 0 на X-Src IP Addr:Port

 

в nfcapd показывает
 

 nfcapd -E -p 2055 -w /tmp/nfcap-test/
Verbose log level: 3
Add flow source: ident: none, IP: any IP, flowdir: /tmp/nfcap-test
Bound to IPv4 host/IP: any, Port: 2055
Init v1
Init v5/v7: Default sampling: 1
Init v9: Max number of v9 tags enabled: 105, default sampling: 1
Init IPFIX: Max number of ipfix tags enabled: 91, default sampling: 1
Startup nfcapd.
Process_v9: New v9 exporter: SysID: 1, Domain: 0, IP: xx.xx.xx.xx

Flow Record:
  Flags        =              0x01 EVENT, Unsampled
  Elements     =                 6: 1 2 12 20 22 25
  size         =               124
  engine type  =                 0
  engine ID    =                 0
  export sysid =                 1
  first        =                 0 [<unknown>.000]
  last         =                 0 [<unknown>.000]
  received at  =     1692020263687 [2023-08-14 16:37:43.687]
  proto        =                 1 ICMP
  tcp flags    =              0x00 ........
  ICMP         =               3.238 type.code
  in packets   =                 0
  in bytes     =                 0
  src addr     =     192.168.55.10
  dst addr     =     151.101.2.167
  ip exporter  =       xx.xx.xx.xx

снова поля first/last пустые , поэтому передает значения 1970-01-01 03:00:00.000 как в версии nfdump  1.6.18, но сути это не меняет.

Снял дамп через tcpdump и посмотрел в wireshark что прилетает от nat сервера на этот порт 2055 по netflow v9


 

User Datagram Protocol, Src Port: 59337, Dst Port: 2055
    Source Port: 59337
    Destination Port: 2055
    Length: 92
    Checksum: 0x7b88 [unverified]
    [Checksum Status: Unverified]
    [Stream index: 0]
    [Timestamps]
    UDP payload (84 bytes)
Cisco NetFlow/IPFIX
    Version: 9
    Count: 2
    SysUptime: 8155.520000000 seconds
    Timestamp: Aug 14, 2023 16:28:36.000000000 RTZ 2 (зима)
        CurrentSecs: 1692019716
    FlowSequence: 54
    SourceId: 0
    FlowSet 1 [id=0] (Data Template): 300
        FlowSet Id: Data Template (V9) (0)
        FlowSet Length: 40
        Template (Id = 300, Count = 8)
            Template Id: 300
            Field Count: 8
            Field (1/8): PROTOCOL
            Field (2/8): L4_SRC_PORT
            Field (3/8): IP_SRC_ADDR
            Field (4/8): L4_DST_PORT
            Field (5/8): IP_DST_ADDR
            Field (6/8): postNATSourceIPv4Address
            Field (7/8): postNAPTSourceTransportPort
            Field (8/8): natEvent
    FlowSet 2 [id=300] (1 flows)
        FlowSet Id: (Data) (300)
        FlowSet Length: 24
        [Template Frame: 1]
        Flow 1
            Protocol: ICMP (1)
            SrcPort: 1001
            SrcAddr: 192.168.55.10
            DstPort: 1001
            DstAddr: 151.101.2.167
            Post NAT Source IPv4 Address: xx.xx.xx.xx
            Post NAPT Source Transport Port: 2025
            Nat Event: NAT translation delete (Historic) (2)


Немного не пойму вывод в pcap в wireshark, но вроде он передает нужные шаблоны

Идеи пока закончились куда копать..

 

Posted
В 14.08.2023 в 19:46, pesvo сказал:

Идеи пока закончились куда копать..

 

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

#!/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";
    }
  }
}

 

Posted
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.

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.


×
×
  • Create New...