Страница 1 из 1

ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 9:13:49
Alex Keda
сабж.
стандартный метод типа

Код: Выделить всё

${FwCMD} table $port add $ip
получается весьма медленный и ресурсоёмкий
файлы с таблицами большие

Код: Выделить всё

srv2# wc -l /root/scripts/db/table.*
   20113 /root/scripts/db/table.25.txt
    7186 /root/scripts/db/table.80.txt
   27299 total
srv2#     
а каждый адресок - это форк...

Код: Выделить всё

srv2# time /root/scripts/ipfw/ipfw.sh
14.104u 62.454s 2:10.61 58.6%   112+582k 7+0io 0pf+0w
srv2#    

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 9:25:24
Alex Keda
http://forums.freebsd.org/archive/index.php/t-5896.html
судя по всему невозможно =(

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 9:49:22
hizel
стой автолюбитель!
тебе на каком языке сделать?
C(Си) скомпилируешь?
удалять и смотреть надо?

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 9:54:50
Alex Keda
меня больше интересует возможность реализовать это штатно...
как патч к ipfw(8) - чтоб закоммитили и не таскать с собой пачку патчей

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 9:59:12
Alex Keda
пульнул заодно в рассылку.
http://lists.freebsd.org/pipermail/free ... 16487.html

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 10:06:26
ProFTP
как часто тебе нужно добавлять этот список в таблицу?

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

.. тебе надо добавить этот айпи в raw socket на python perl, hizel это писал ...

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 10:11:03
hizel
а вот так?

файл вида:

Код: Выделить всё

table 25 add 192.168.0.32
table 25 add 192.168.0.33
table 25 add 192.168.0.34
table 25 add 192.168.0.35
table 25 add 192.168.0.36

Код: Выделить всё

se@serv4 ~ >wc -l ip2.txt 
   65536 ip2.txt
se@serv4 ~ >sudo ipfw table 25 flush
se@serv4 ~ >sudo time ipfw /home/se/ip2.txt
        0.94 real         0.54 user         0.39 sys
se@serv4 ~ >sudo ipfw table 25 list | wc -l
   65536
не айс? все из коробки, просто файлики немного по другому писать

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 10:13:22
Alex Keda
вариант.
файлики переписать не проблема - хоть на ходу через временные - благо в sh(1) echo - функция встроенная и будет быстро =))

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 10:20:21
hizel
ipfw [-cfnNqS] [-p preproc [preproc-flags]] pathname

лучше preproc написать для предобработки :)

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 11:17:38
hizel
поражаюсь когда в рассылке кто-то отвечает ^_^

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 12:37:30
ProFTP
hizel писал(а):поражаюсь когда в рассылке кто-то отвечает ^_^
а ты же эти сиськи писал...

через perl, python оно будет быстрее

http://ss.lg.ua/node/591

Код: Выделить всё

#!/usr/local/bin/perl

use Socket;
use constant IPPROTO_RAW => 255;

$iaddr = inet_aton ('192.168.139.1');
$paddr = sockaddr_in (80, $iaddr); #80 - порт назначения

socket(SOCKET, PF_INET, SOCK_RAW, IPPROTO_RAW) or die "Can't open raw socket: $!\n";

$packet = undef;
$packet .= pack("C", 69);
$packet .= pack ("H2", '00');
$packet .= pack ("n", 28);
$packet .= pack ("n", 0);
$packet .= pack ("H4", '4000');
$packet .= pack ("C", 64);
$packet .= pack ("C", getprotobyname('udp'));
$packet .= pack ("n", 0);

$source_ip = '207.46.197.32';
$result_source_ip = undef;
for (split('\.', $source_ip)){   #разбиваем по точкам
	$result_source_ip .= pack ("C", $_)
}
$packet .= $result_source_ip;

$destination_ip = '192.168.139.1';
$result_destination_ip = undef;
for (split('\.', $destination_ip)){   #разбиваем по точкам
	$result_destination_ip .= pack ("C", $_)
}
$packet .= $result_destination_ip;

$packet .= pack ("n", 25); #порт источника
$packet .= pack ("n", 80); #порт назначения
$packet .= pack ("n", 8);
$packet .= pack ("H4", '0000');

while(){
	send(SOCKET, $packet, 0, $paddr) or die "Can't send packet: $!\n";
	sleep 1;  #поспим некоторое время, чтобы не сильно DoS'ить сеть.
}
тут нужно как-то поменять и отправить таблицу и ip

Код: Выделить всё

      s=socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

	

47

	

    if(s<0){ 

	

48

	

        PyErr_SetString(IPFWError, "socket fail");

	

49

	

        return NULL;

	

50

	

    }

	

51

	

    i = setsockopt(s, IPPROTO_IP, IP_FW_TABLE_ADD, &ent, sizeof(ent));

	

52

	

    if(i && errno != EEXIST){ // Allow add existent entry

	

53

	

        PyErr_SetString(IPFWError, "setsocket fail");

	

54

	

        close(s);

	

55

	

        return NULL;

	

56

	

    }

	

57

	

    close(s);

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 12:54:39
hizel
в данном случае это избыточное решение, Лис-у нужно из коропки и он его(решение) получил

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 13:01:33
ProFTP
hizel писал(а):в данном случае это избыточное решение, Лис-у нужно из коропки и он его(решение) получил
избычтоное - так избыточное, хрен с ним...

а этот скрипт на perl быстрее будет на много чем добавлять через ipfw?

может написать?

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 13:32:50
hizel
пиши, чо, разрешаю : )

Re: ipfw table - как можно быстро заполнить таблицы из файла

Добавлено: 2010-04-09 13:35:53
ProFTP
я написал

Код: Выделить всё

#!/usr/local/bin/perl

use Socket;
use constant IPPROTO_RAW => 255;


socket( SOCKET,AF_INET, SOCK_RAW, IPPROTO_RAW ) or die "Can't open raw socket: $!\n";


setsockopt(SOCKET, IPPROTO_IP, IP_FW_TABLE_ADD, '22') or die "Can't send packet: $!\n";
./perl2.pl
Can't send packet: Protocol not available




а что такое, вот это &ent, sizeof(ent)); ?
с

Код: Выделить всё

   i = setsockopt(s, IPPROTO_IP, IP_FW_TABLE_ADD, &ent, sizeof(ent));
use Socket; экспортирует существующие сишные функции /usr/include/linux/socket.h