Страница 1 из 1
ipfw table - как можно быстро заполнить таблицы из файла
Добавлено: 2010-04-09 9:13:49
Alex Keda
сабж.
стандартный метод типа
получается весьма медленный и ресурсоёмкий
файлы с таблицами большие
Код: Выделить всё
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
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
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