Блокировка производится командой:ipfw add deny ip from "table(1)" to any via em0
/etc/load_table.sh:
#!/bin/sh
ipfw table 1 flush
cat /etc/block.txt | while read cnt ip; do
ipfw table 1 add $ip
doneформат /etc/block.txt: "cnt ip"
получем, например, из tcpdump лога атаки:tcpdump -n -i em0 udp and port 80 > ./tcpdump.log
cat ./tcpdump.log |cut -d' ' -f3|cut -d'.' -f1,2,3,4|sort|uniq -c |sort -r -n > /etc/block.txt
URL:
Обсуждается: https://www.opennet.ru/tips/info/1483.shtml
спец-интерфейс... не слишком красиво
А по мне довольно изящно.Правда в конце я бы все таки добавлял, а не замещал.
>А по мне довольно изящно.Правда в конце я бы все таки добавлял,
>а не замещал.да я, вобщем-то, о команде добавления в таблицу.
это ipfw - специнтерфейс.
Каждый ИПшник добавляеться _отдельным_ процессом ipfw.
Может на деле оно и пофигу, но все же технически не оптимально.Линух. Как аналогичный пример, модуль iptables recent.
# iptables -I INPUT -i w0 -m recent --name bad_guys --rcheck -j DROP
(clear - спец команда очистки таблицы. Опционально :)
# cat bad_guys.txt
clear
1.2.3.4
5.6.7.8
9.10.11.12# while read ip; do echo $ip > /proc/net/ipt_recent/bad_guys ; done < bad_guys.txt
(вот это все происходит в текущем процессе bash, без создания новых процессов)
(echo - встроенная команда bash, если кто не вкурсе ;)
можно посмотреть содержимое:# cat /proc/net/ipt_recent/bad_guys
src=1.2.3.4 ttl: 0 last_seen: 4358612828 oldest_pkt: 1 4358612828
src=9.10.11.12 ttl: 0 last_seen: 4358612828 oldest_pkt: 1 4358612828
src=5.6.7.8 ttl: 0 last_seen: 4358612828 oldest_pkt: 1 4358612828
кроме того, с этими таблицами recent модуля можно работать прямо из фаервола,
динамичиски пополняя ее или удаляя IP адреса ;)
- динамичиское добавление (пример из мана :)
# iptables -A INPUT -i w0 -p tcp --dport 139 -m recent --name bad_guys --set -j DROP
все, кто ломиццо на 139 порт автоматом попадают в black list- динамичиское удаление:
# iptables -A INPUT -i w0 -p udp --dport 34097 -m length --length 500 \
-m recent --name bad_guys --removeкто владеет тайным знанием, тот пошлет UDP пакет длинной 500 байт на спец порт и будет разблокирован :)
для остроты ощущений можно добавить проверку по содержимому пакета и т.д.Не флейма ради, но правды для, хоть пофлеймить и люблю ;)
Сильна ли BSD подобными средствами?
Их маны читать влом, да и вряд ли прочуствуешь все не попробовав.
А вот посмотреть готовых команд знающих людей - было бы нагляднее.
Это не unix-way, Nick.
>Это не unix-way, Nick.пардон, не согласен.
"Все - файл" - одно из утверждений UNIX-вейа.в iptables/recent таблица IPшников - файл. А в BSD - внутреняя сущность ipfw.
"Все - файл" - это plan9-way :). А unix-way - это решение сложных задач через множество простых средств.
>"Все - файл" - это plan9-way :)ну, фантазия у Вас на высоте.
1. Почитайте что такое UNIX: http://ru.wikipedia.org/wiki/Unix
......
"представление устройств и некоторых средств межпроцессного взаимодействия как файлов;"
.....Сеть - это средство межпроцессного взаимодействия когда процессы на разных компьютерах.
Таблица работы с адресами сети - отлично подходит под определение
"некоторых средств межпроцессного взаимодействия"2. Даже если это _и_ Plan9-way - не вижу проблем. Одно другому не мешает.
>А unix-way - это решение
>сложных задач через множество простых средств.а это тоже присутствует. Очень простые команды echo/cat - рулят таблицями IPшников.
Бинарь ipfw - тяжело назвать простым средством, ровно как и iptables.
Но тут пока так (хотя в идеале и iptables можно было бы заменить на управление через echo/cat).Но все же в BSD таблицами приходиться тоже управлять этим не совсем простым бинарем.
В линухе это делаеться простыми командами.Вы сами себе противоречите.
Блин, я фигею. Еще раз, популярнее:
легче и проще, а значит лучше, сделать код с простым функционалом "table add $ip", а все остальное делать внешними средствами, нежели лепить все что можно сделать скриптами в целевой код.
>Блин, я фигею. Еще раз, популярнее:
>легче и проще, а значит лучше, сделать код с простым функционалом "table
>add $ip", а все остальное делать внешними средствами, нежели лепить все
>что можно сделать скриптами в целевой код.я смотрю, мы с Вами на разных ядыках говорим...
по мне, так нет ничего проще впринципе, чем open(2)/read(2)/write(2)
в ядре же все тоже очень стандартно. Минимум кода:
static const struct file_operations recent_fops = {
.open = recent_seq_open,
.read = seq_read,
.write = recent_proc_write,
.release = seq_release_private,
.owner = THIS_MODULE,
};определяеться небольшая функция recent_seq_write (ну, для изменения таблиц) - 54 строки с определением. И там весь парсер.
Вот это я называю ПРОСТО.Поинересуйтесь структурой "ipfw table xxx" функций. Сколько нужно изменений в каких-то структурах если че-то нужно будет изменить?
Либо вы все же не о том...
Пожалуйста, коллега:/*
* This one handles all table-related commands
* ipfw table N add addr[/masklen] [value]
* ipfw table N delete addr[/masklen]
* ipfw table N flush
* ipfw table N list
*/
static void
table_handler(int ac, char *av[])
{
ipfw_table_entry ent;
ipfw_table *tbl;
int do_add;
char *p;
socklen_t l;
uint32_t a;ac--; av++;
if (ac && isdigit(**av)) {
ent.tbl = atoi(*av);
ac--; av++;
} else
errx(EX_USAGE, "table number required");
NEED1("table needs command");
if (strncmp(*av, "add", strlen(*av)) == 0 ||
strncmp(*av, "delete", strlen(*av)) == 0) {
do_add = **av == 'a';
ac--; av++;
if (!ac)
errx(EX_USAGE, "IP address required");
p = strchr(*av, '/');
if (p) {
*p++ = '\0';
ent.masklen = atoi(p);
if (ent.masklen > 32)
errx(EX_DATAERR, "bad width ``%s''", p);
} else
ent.masklen = 32;
if (lookup_host(*av, (struct in_addr *)&ent.addr) != 0)
errx(EX_NOHOST, "hostname ``%s'' unknown", *av);
ac--; av++;
if (do_add && ac)
ent.value = strtoul(*av, NULL, 0);
else
ent.value = 0;
if (do_cmd(do_add ? IP_FW_TABLE_ADD : IP_FW_TABLE_DEL,
&ent, sizeof(ent)) < 0)
err(EX_OSERR, "setsockopt(IP_FW_TABLE_%s)",
do_add ? "ADD" : "DEL");
} else if (strncmp(*av, "flush", strlen(*av)) == 0) {
if (do_cmd(IP_FW_TABLE_FLUSH, &ent.tbl, sizeof(ent.tbl)) < 0)
err(EX_OSERR, "setsockopt(IP_FW_TABLE_FLUSH)");
} else if (strncmp(*av, "list", strlen(*av)) == 0) {
a = ent.tbl;
l = sizeof(a);
if (do_cmd(IP_FW_TABLE_GETSIZE, &a, (uintptr_t)&l) < 0)
err(EX_OSERR, "getsockopt(IP_FW_TABLE_GETSIZE)");
l = sizeof(*tbl) + a * sizeof(ipfw_table_entry);
tbl = malloc(l);
if (tbl == NULL)
err(EX_OSERR, "malloc");
tbl->tbl = ent.tbl;
if (do_cmd(IP_FW_TABLE_LIST, tbl, (uintptr_t)&l) < 0)
err(EX_OSERR, "getsockopt(IP_FW_TABLE_LIST)");
for (a = 0; a < tbl->cnt; a++) {
printf("%s/%u %u\n",
inet_ntoa(*(struct in_addr *)&tbl->ent[a].addr),
tbl->ent[a].masklen, tbl->ent[a].value);
}
} else
errx(EX_USAGE, "invalid table command %s", *av);
}
да, размер кода очень похож.
НО.Это всего-лишь user-level тулза. Ей еще нужно поведать полученную команду ядру через
интерфейс ioctl/ipfw. А в ядре еще нужен код, чтобы принять и проверить эту команду.В iptables/recent эта функция-парсер - уже внутри ядра и складывает отпаршенные ИПшники
сразу в свой внутренний массив.Вот ЭТО я называю оптимальность.
А касательно гибкости: если нужно добавить еще одну команду работы с таблицами, например... ээээ... удалить все ИПшники, которые попадают в заданную сетку ;)
Для iptables это было бы еще несколько строк кода в парсере ядра и все.
А формат вот такой:
# echo del 72.56.84.0/24 > /proc/......
В ipfw придеться править и бинарь, и заголовки и ядро...Все еще не видите преимуществ универсального UNIX-подхода iptables? ;)
>да, размер кода очень похож.
> НО.
> Это всего-лишь user-level тулза. Ей еще нужно > поведать полученную команду ядру через
> интерфейс ioctl/ipfw. А в ядре еще нужен код, > чтобы принять и проверить эту команду.мда это глупо конечно мерится так ), но что касается добавления:
выше приведенная table_handler + do_cmd 19 строк +
функции ядра add_table_entry - 26 строк.
всё.> В iptables/recent эта функция-парсер - (!)уже(!) > внутри ядра и складывает отпаршенные ИПшники
> сразу в свой внутренний массив.
> Вот ЭТО я называю оптимальность.Вот об этом я и говорил: в ядре находятся не нужные вещи. И на мой взгляд это - совсем не оптимальность.
> А касательно гибкости: если нужно добавить еще > одну команду работы с таблицами, например... > ээээ... удалить все ИПшники, которые попадают в > заданную сетку ;)
Ну и нафига пихать это в ядро?
Поймите же идею: гибкость должна создаваться внешними средствами.
Ок, согласен. В плане "каждый делает свою мальнькую работу" это несколько не UNIX-way.Зато это много проще в реализации, да и Plan9-way тоже неплохо ;)
если даже не лучше чем UNIX-way :)
Оригинала от создателей найти не удалось, но вот почитайте:UNIX history embeds the UNIX way with the notion of software tools, also the title of a work by UNIX gurus Brian Kernighan and P.J.Plauger, as a key concept - small, well designed text-based tools operating from the command line which do one job very well and can readily be connected to satisfy more complex tasks.
>Оригинала от создателей найти не удалось, но вот почитайте:
>
>UNIX history embeds the UNIX way with the notion of software tools,
>also the title of a work by UNIX gurus Brian Kernighan
>and P.J.Plauger, as a key concept - small, well designed text-based
>tools operating from the command line which do one job very
>well and can readily be connected to satisfy more complex tasks.Да, я это читал
ну, по этому критерию команде echo 5 с плюсом,
ну а ядру чуть меньше ;))зато все равно, ИМХО, подход у iptables лучше
>зато все равно, ИМХО, подход у iptables лучшеЯ бы не стал дальше спорить после такого утверждения.
Когда человек в споре хочет прийти не к истине ("истина рождается в споре", а просто к удовлетворению своих желаний ("iptables/linux все равно лучше/круче"), то адекватности тут можно не ждать.По теме:
Всунуть все ip адреса в таблицу за один проход можно командой:
ipfw [-cfnNqS] [-p preproc [preproc-flags]] pathnameКак я понял из мана, в файл "pathname" запихиваются команды ipfw.
>Я бы не стал дальше спорить после такого утверждения.
>Когда человек в споре хочет прийти не к истине ("истина рождается в
>споре", а просто к удовлетворению своих желаний ("iptables/linux все равно лучше/круче"),
>то адекватности тут можно не ждать.я уже пришел к истине - и утверждал это.
Если вы ставите истинность моей истины (;) под сомнение - давайте контраргументы моим доводам, которые ПРИСУТСТВУЮТ наряду с утверждением "iptables лучше". Ничего противоестественного не вижу.
Я хочу истину и вижу ее в netfilter'е. Свои взгляды я изложил.
Извольте оспорить, а не просто сказать "он сказал 'iptables лучше' - значит он неправ!"
>По теме:
>Всунуть все ip адреса в таблицу за один проход можно командой:
>
>ipfw [-cfnNqS] [-p preproc [preproc-flags]] pathname
>
>Как я понял из мана, в файл "pathname" запихиваются команды ipfw.а вот тоже по теме: сделать это можно лишь командой ipfw, в чем собственно и наблюдаеться
минус спец-интерфейса.
Ну и не удержусь от ответного камуЖка в ваш огород."Just for fun" by Торвальдс:
"Уродство, когда для любого действия у системы есть специальный интерфейс. В Unix - все наоборот. Она предоставляет строительные блоки, из которых можно создать что угодно. Вот что такое стройная архитектура."
Извлечь/Добавить IP адреса в ipfw table можно лишь через спец-интерфейс... ;)))
А если следовать UNIX-way здесь - то самое простое действие для того чтобы увидеть список адресов - это сделать cat из файла, а вот файлом может быть уже что и посложнее чем plain файл. Или есть что-то более простое в UNIX определениях?iptables/recent как раз это и есть, самое простое, без спец интерфейса ;)
>iptables/recent как раз это и есть, самое простое, без спец интерфейса ;)Спец-интерфейс всё таки есть. Скрырый. Для сравнения, что помещаем в bad_guys? IP only. Что имеем по cat /proc/net/ipt_recent/bad_guys? Совсем не IP...
Ой, блин, держите меня...
cat /dev/random > /proc/net/ipt_recent/bad_guys
И где будет тормозить? В ядре :)
Класс.Время собирать камни?
>>iptables/recent как раз это и есть, самое простое, без спец интерфейса ;)
>
>Спец-интерфейс всё таки есть. Скрырый. Для сравнения, что помещаем в bad_guys? IP
>only. Что имеем по cat /proc/net/ipt_recent/bad_guys? Совсем не IP...деревня...
при помещении ИП в список, мы помещаем не тока сам ИП, но и ВРЕМЯ помещения.
Так вот списки этих добавлений для каждого ИП мы и храним
>деревня...Ну-ну.
>при помещении ИП в список, мы помещаем не тока сам ИП, но и ВРЕМЯ помещения.
>Так вот списки этих добавлений для каждого ИП мы и хранимЕщё раз и медленно. Попробуйте подумать над этим.
cat somefile > /proc/net/ipt_recent/bad_guys отправляет в /proc/net/ipt_recent/bad_guys именно IP и ничего более. Все остальные данные рядом с IP во внутреннюю таблицу помещаются кодом, ответственным именно за ИНТЕРФЕЙС. Интерфейс между внешним миром и внутренними структурами.
В случае же отсутствия интерфейса, в случае с cat, никаких других данных в таблицу, кроме IP помещаться не должно. Или мы будем должны помещать IP, ВРЕМЯ, etc. Что и будет называться "прямой доступ к внутренним структурам", без интерфейса.
В связи с этим, выглядит как минимум странно фраза "iptables/recent как раз это и есть, самое простое, без спец интерфейса ;) "
ИМХО бардак в голове. Вместо "простой интерфейс" говорят "без спец интерфейса". Отсюда и спор раздули.
>Ещё раз и медленно. Попробуйте подумать над этим.
>
>cat somefile > /proc/net/ipt_recent/bad_guys отправляет в /proc/net/ipt_recent/bad_guys именно IP и ничего более. Все остальные данные рядом с IP во внутреннюю таблицу помещаются кодом, ответственным именно за ИНТЕРФЕЙС.
>Интерфейс между внешним миром и внутренними структурами.неа. За интерфейс тут отвечает VFS :)
open(2)
read(2)
write(2)
close(2)Вот ЭТОТ интерфейс тут использован. Т.е. обычный, файловый.
>В случае же отсутствия интерфейса, в случае с cat,
не обижайся, плз, но я ж говорил: "деревня"...
ЛЮБОЕ взаимодействие происходит через какой-нибудь интерфейс :)>никаких других данных
>в таблицу, кроме IP помещаться не должно.Если модуль преследует собой цель хранить лишь ИП адреса - то да, не должно.
Но у нас модуль, который хранит их и предоставляет еще некий функционал.
(если не нравяться timestamps - их количество можно свести к минимуму - 1)
>Или мы будем должны помещать IP, ВРЕМЯ, etc. Что и будет называться "прямой доступ к
>внутренним структурам", без интерфейса.без каментов про "без интерфейса"...
Также не понял связи между интерфейсом и набором помещаемых данных в список.
>В связи с этим, выглядит как минимум странно фраза "iptables/recent как раз
>это и есть, самое простое, без спец интерфейса ;) "VFS - более чем _не_ специальный интерфейс. Без него не бывает линуха (говорим о современных версиях). За сим и вещаю, что взаимодействие источника списка ИПшников
(прога cat) и ядра происходит без специального интерфейса (но, безусловно, _с_ интерфейсом!!!), а через VFSные вызовы open()/RW()/close()ipfw же работает с ядром при помощи своего _СПЕЦИАЛЬНОГО_ набора ioctl() запросов.
Выходит, что с ipt_recent таблицами может работать практически любой процесс, способный
открывать/писать/читать файл, а с ipfw таблицами лишь специально "обученные" проги
(ну, вроде этого же ipfw. немного тавталогии...)Доступно?
>ИМХО бардак в голове.
Ну, бардак вытряхивай и читай маны. Они рулят.
>Вместо "простой интерфейс" говорят "без спец интерфейса".Ну, не сказал бы, что ioctl(IP_FW_<GET/ADD>,... ) - это "сложный" интерфейс :)
он то простой. Тока вот и VFS интерфейс тоже весьма прост.
Но. Суть _именно_ в том, что один из них _специальный_ (т.е. только для каких-то вещей),
а другой - нет, т.е. справедливо сипользовать выражение "без специального интерфейса",
говоря о работе с ipt_recent.
А это доступно?>Отсюда и спор раздули.
Как видишь, не совсем...
>неа. За интерфейс тут отвечает VFS :)
>open(2)
>read(2)
>write(2)
>close(2)
>
>Вот ЭТОТ интерфейс тут использован. Т.е. обычный, файловый.Ага, со здоровенным промежуточным слоем в виде VFS. Нихрена не оптимально.
>>В связи с этим, выглядит как минимум странно фраза "iptables/recent как раз
>>это и есть, самое простое, без спец интерфейса ;) "
>
>VFS - более чем _не_ специальный интерфейс. Без него не бывает линуха
>(говорим о современных версиях). За сим и вещаю, что взаимодействие источника
>списка ИПшников
>(прога cat) и ядра происходит без специального интерфейса (но, безусловно, _с_ интерфейсом!!!),
>а через VFSные вызовы open()/RW()/close()
>
>ipfw же работает с ядром при помощи своего _СПЕЦИАЛЬНОГО_ набора ioctl() запросов.То же, абсолютно то же делает сам iptables со своими правилами - он, как и ipfw, текстовый вид преобразует к getsockopt()/setsockopt(). Да, кстати, кое-кому не мешало бы подучить матчасть - ioctl() не используется ни в ipfw, ни в iptables.
>[оверквотинг удален]
>
>Доступно?
>
>>ИМХО бардак в голове.
>
>Ну, бардак вытряхивай и читай маны. Они рулят.
>
>а другой - нет, т.е. справедливо сипользовать выражение "без специального интерфейса",
>говоря о работе с ipt_recent.
>А это доступно?См. выше. Имеем, что в случае iptables появляется уже как минимум ДВА интерфейса - один опциями сокета у iptables, другой через текстовый файл. Который ведет к ДУБЛИРУЮЩЕМУСЯ коду в ядре, мало того, что задействует тормозной VFS, и обрабатывает далеко не все ошибки, которые должен был. Это называется стройная архитектура по Торвальдсу, ы? Это как раз бардак в голове, ведущий к бардаку в ядре.
Если бы автор модуля ipt_recent не выпендривался, а встроился в _уже_ _имеющийся_ интерфейс "специально обученного" iptables (заметим, он уже существует, и никуда от него не деться), то кроме сокращения лишнего кода и общего улучшения качества (использования парсера и проверщика ошибок самих таблесов) стало бы возможным использовать дополнительные фичи - например, единовременный штатный таблесовский COMMIT кучи правил разом, то есть оно стало бы работать куда быстрее на больших объемах.
В результате подход ipfw (и основного iptables) весьма вписывается в unix-way - средство, умеющее делать свою работу, и делать ее хорошо, имеет наружу текстовый интерфейс для других программ, в результате работа по теме сконцетрирована где надо, а не повторяется каждым автором много раз, тем более в ядре, где цена ошибок и скорости куда более высока.
Да, и как уже отмечалось, у ipfw есть препроцессоры, так что, быстро загнать файл с айпишником на строку, не форкая на каждый по процессу, весьма просто:
cat file.txt | awk '{print "table 1 add " $0}' | ipfw -p cat - /dev/null
>Ой, блин, держите меня...
>cat /dev/random > /proc/net/ipt_recent/bad_guys
>И где будет тормозить? В ядре :)
>Класс.
>
>Время собирать камни?да хоть разбирай, хоть собирай...
cat /dev/urandom > /dev/sda
или с винтом уже не смешно?
Ну всё, сдаюсь...
Трудно объяснять идеологическую разницу между классами С++ и структурами данных со скрытыми методами присвоения (a la borland с++ builder). Надоело уже, Вы, Nick, не первый, и, увы, не последний :(Кстати, мой пример с random тоже тихо так пустили по-боку - неудобный он всё же, правда?
>Ну всё, сдаюсь...
>Трудно объяснять идеологическую разницу между классами С++ и структурами данных со
>скрытыми методами присвоения (a la borland с++ builder). Надоело уже, Вы,
>Nick, не первый, и, увы, не последний :(ах вон ты как мыслишь.
для тебя все, что записывает ИПшник, принимая его на входе и аж до записи во внутрений хеш - один кусок. Ну звыняй. На практике (в ядре) такие абстракции не живут. Тут нужно понимать, что методы тоже состоят из N компонент и методы взаимодествия между ними.
>Кстати, мой пример с random тоже тихо так пустили по-боку - неудобный
>он всё же, правда?ну так разуваем глаза и читаем мой ответ от 2 го(!!) ноября на этот random:
(приведу ссылку для пущей уверенности)https://www.opennet.ru/openforum/vsluhforumID3/38720.html#22
а суть моего ответа проста: если рут начитает творить х-ню - то это уже не проблема системы или ядра.Ну а даже если спустиццо к идиотизму твоего примера - то я его пусканул, чисто поржать и тебе дать поржать.
Причем, заюзал не /dev/random, который, кстати, может ничего и не выдать, если random pool пуст, а /dev/urandom, который всегда че-то выдает, но менее качественное.# cat /dev/urandom > /proc/net/ipt_recent/DEFAULT
..... ну cat начал жрать проц.... подождал наццать секунд пока не надоело
потом смотрим в /proc/net/ipt_recent/DEFAULT
# cat !$
cat /proc/net/ipt_recent/DEFAULT
src=227.0.0.0 ttl: 0 last_seen: 4306263113 oldest_pkt: 1 4306263113
src=54.0.0.0 ttl: 0 last_seen: 4306263113 oldest_pkt: 1 4306263113
src=3.0.0.0 ttl: 0 last_seen: 4306263113 oldest_pkt: 2 4306263113, 4306263113
src=36.0.0.0 ttl: 0 last_seen: 4306263113 oldest_pkt: 1 4306263113
src=190.0.0.0 ttl: 0 last_seen: 4306263113 oldest_pkt: 1 4306263113
src=238.0.0.0 ttl: 0 last_seen: 4306263113 oldest_pkt: 1 4306263113
......# wc -l /proc/net/ipt_recent/DEFAULT
100 /proc/net/ipt_recent/DEFAULT
собсно, лимит количества ИПшников был 100 на одну таблицу (по умолчанию)
(на практике юзаю лимит в миллионы IPs)
так что, таблица просто прокручивалась и все.обидно, да ? :)
># cat !$
>cat /proc/net/ipt_recent/DEFAULT
>src=227.0.0.0 ttl: 0 last_seen: 4306263113 oldest_pkt: 1 4306263113
>src=54.0.0.0 ttl: 0 last_seen: 4306263113 oldest_pkt: 1 4306263113
>собсно, лимит количества ИПшников был 100 на одну таблицу (по умолчанию)
>(на практике юзаю лимит в миллионы IPs)
>так что, таблица просто прокручивалась и все.
>
>обидно, да ? :)Обидно, конечно :) где Вы такой urandom взяли, что голимые IP на выходе есть :) Я тоже хочу такую траву. Другу подарю :) пусть проверку входных данных отлаживает :)
>ах вон ты как мыслишь.
>для тебя все, что записывает ИПшник, принимая его на входе и аж до записи во внутрений хеш >- один кусок. Ну звыняй. На практике (в ядре) такие абстракции не живут. Тут нужно >понимать, что методы тоже состоят из N компонент и методы взаимодествия между ними.:) Вот это уже интересно... я программис, ООП моя стезя; как я мыслю, уже сказал. И как программист, я вижу, что сущность ipfw - более целостна с точки зрения взаимодействия cli c подсистемой, чем iptables.
Ок, давай на том и подвяжем :)а трава с IPшниками - ну а че, хреново, но отпарсили :)
В конце концов ни это, ни выброс с ошибкой не делают сему эксперименту чести :)
(но парсер могли бы и подучить, конечно)
2Nick:
> я уже пришел к истине - и утверждал это.
> Если вы ставите истинность моей истины (;) под сомнение - давайте контраргументы моим доводам, которые ПРИСУТСТВУЮТ наряду с
> утверждением "iptables лучше". Ничего противоестественного не вижу.
> Я хочу истину и вижу ее в netfilter'е. Свои взгляды я изложил.
> Извольте оспорить, а не просто сказать "он сказал 'iptables лучше' - значит он неправ!"Да, iptables лучше.
Свободен.Т.к. мой предыдущий пост засел глубоко в топике посреди оффтопа, повторю совет:
Всунуть все ip адреса в таблицу за один проход можно командой:
ipfw [-cfnNqS] [-p preproc [preproc-flags]] pathnameКак я понял из мана, в файл "pathname" запихиваются команды ipfw.