nuclight: (Default)
nuclight ([personal profile] nuclight) wrote2012-04-26 03:11 am
Entry tags:

IpfwNg

В честь 26 годовщины 26 апреля уволился с текущей работы и таки наконец начал проект http://wiki.freebsd.org/IpfwNg — хотя на работе FreeBSD и была основной системой, реальную возможность пилить ядро я так и не получил (хотя тот же NAT64 нам бы понадобился не через полгода, так через год). В ближайшие недели посижу дома и надеюсь сделать хотя бы скелет, который можно будет потом уже в свободное время потихоньку пилить — работы по проекту предстоит очень много.

Желающие обсудить по делу — велкам в каменты (хотя я туда еще не все наброски оформил).

[identity profile] http://users.livejournal.com/_dyr/ 2012-04-27 08:17 am (UTC)(link)
И ещё:
"
У меня сейчас задача довести до ума pf в рамках FreeBSD. В нём есть
масса неправильностей, которые связаны с быстрым портингом. Стояла
задача портировать минимальной ценой, то есть с минимальным вмешательством
в код, а ведь FreeBSD и OpenBSD значительно отличаются, многие места
требуют значительного вмешательства, для того, чтобы было сделано правильно.
Ну и самое главное - нам нужна многотредовость и сейчас её нет. Хочу
всё это довести до ума, и только потом что-то добавлять новое.
"

[identity profile] victor-sudakov.livejournal.com 2012-04-27 10:01 am (UTC)(link)
А для локально запущенных приложений pf rtable разве работает? А то в pf.conf(5) написано "Only effective before the route lookup happened, i.e. when filtering inbound." В такой позе и "ipfw setfib" работает.

А перекладыванием я сейчас как раз и пользуюсь, только ipfw fwd, а не pf. Но вот появилась новая фича с этими fib, захотелось попробовать.

[identity profile] http://users.livejournal.com/_dyr/ 2012-04-27 10:17 am (UTC)(link)
Для локальных не знаю.
ipfw fwd не работает же - он изменяет лишь ip, но кладёт в тот же интерфейс (в отличии от удобного route-to в pf):
pass out quick route-to ($ext_if_1 $ext_gw_1) from $nat_1 to any allow-opts no state
pass out quick route-to ($ext_if_2 $ext_gw_2) from $nat_2 to any allow-opts no state

[identity profile] victor-sudakov.livejournal.com 2012-04-28 04:11 am (UTC)(link)
> ipfw fwd не работает же - он изменяет лишь ip, но кладёт в тот же интерфейс

Как это не работает? "If ipaddr is not a local address, then the port number (if specified) is ignored, and the packet will be forwarded to the remote address, using the route as found in the local routing table for that IP."

А как бы на ipfw fwd делали policy routing, если бы клал только в тот же интерфейс? Или я Вас не понял?

[identity profile] http://users.livejournal.com/_dyr/ 2012-04-28 06:30 am (UTC)(link)
А вот фиг. Навскидку: kern/129036 (http://www.freebsd.org/cgi/query-pr.cgi?pr=129036&cat=kern), kern/122963 (http://www.freebsd.org/cgi/query-pr.cgi?pr=122963&cat=kern)

[identity profile] dadv.livejournal.com 2012-04-28 02:08 pm (UTC)(link)
Он кладет в нужный интерфейс, там есть лишь проблема с тем, что переписывание имени исходящего интерфейса в атрибутах пакета не происходит и ipfw продолжает "видеть" имя старого исходящего интерфейса. Но роутинг будет выполнен корректно на указанных next-hop всё равно.

[identity profile] dadv.livejournal.com 2012-04-28 02:08 pm (UTC)(link)
> ну и загрузка всех правил скопом must have.

Есть давным давно, ещё в 4.x было. ipfw sets.

[identity profile] dadv.livejournal.com 2012-04-28 02:12 pm (UTC)(link)
/me перечислял "грант" на счет glebius@ без юрлица - получал на себя "премию" и со своей карты кидал ему перевод :-)

[identity profile] sem-lj.livejournal.com 2012-04-28 02:14 pm (UTC)(link)
Это не то. Я про типа такого: ipfw -f

[identity profile] dadv.livejournal.com 2012-04-28 02:17 pm (UTC)(link)
И это есть.

[identity profile] sem-lj.livejournal.com 2012-04-28 02:17 pm (UTC)(link)
У нас есть самописная разработка ipfwsync. Она даже работает.
Если есть желание, я могу дать адрес автора, возможно удастся уговорить его выложить его куда нибудь.

[identity profile] sem-lj.livejournal.com 2012-04-28 02:30 pm (UTC)(link)
Я смотрю на какой то другой ipfw?
Вообще-то sets - это альтернативные наборы правил, которые можно *включать* и *отключать* по желанию.
Но загрузка в них происходит все так-же - по одному правилу.

Такая загрузка - это ужасно не удобно.

[identity profile] dadv.livejournal.com 2012-04-28 02:34 pm (UTC)(link)
> Я смотрю на какой то другой ipfw?

Просто надо внимательно читать man ipfw.

ipfw [-cfnNqS] [-p preproc [preproc-flags]] pathname
...
     To ease configuration, rules can be put into a file which is processed
     using ipfw as shown in the last synopsis line.  An absolute pathname must
     be used.  The file will be read line by line and applied as arguments to
     the ipfw utility.

[identity profile] sem-lj.livejournal.com 2012-04-28 02:45 pm (UTC)(link)
Это я читал. Это издевательство, которое ничем не лучше шел скрипта со строчками ipfw add ...

Попытаюсь быть экстрасенсом: ты предлагаешь это загружать в некий сет и при успехе делать swap с активным?

А почему эту возможность не добавить нативно? Что бы ipfw загружал правила в память, репортил ошибки, либо, если их нет, загружал опкоды уже в ядро?

[identity profile] http://users.livejournal.com/_dyr/ 2012-04-28 02:47 pm (UTC)(link)
Моей организации, боюсь, так будет даже сложнее. Как же, выдать мне премию, бухгалтерия сбесится %)

[identity profile] dadv.livejournal.com 2012-04-28 02:48 pm (UTC)(link)
> Это я читал. Это издевательство, которое ничем не лучше шел скрипта со строчками ipfw add ...

Тогда я не понял, что должно быть твоём "ipfw -f file"

> Попытаюсь быть экстрасенсом: ты предлагаешь это загружать в некий сет и при успехе делать swap с активным?

Разве это не очевидно?

> А почему эту возможность не добавить нативно? Что бы ipfw загружал правила в память, репортил ошибки, либо, если их нет, загружал опкоды уже в ядро?

Не вижу разницы с существующим сейчас функционалом: в файл пишем команды добавления в set 1, затем swap.

[identity profile] dadv.livejournal.com 2012-04-28 02:53 pm (UTC)(link)
Бухгалтерия не решает, кому давать премию, кому не давать, это не её компетенция.

[identity profile] sem-lj.livejournal.com 2012-04-28 03:10 pm (UTC)(link)
Ну в принципе, можно и левое ухо чесать правой ногой. Цель будет достигнута.

[identity profile] dadv.livejournal.com 2012-04-28 03:57 pm (UTC)(link)
Ничего хитровывернутого в описанной процедуре нет, всё весьма прямолинейно. В своём враппере над ipfw я вовсю использовал именно эту процедуру ещё на 4.11.

[identity profile] sem-lj.livejournal.com 2012-04-28 04:01 pm (UTC)(link)
Ключевое выражение "в своем враппере". Хорошо бы, что бы это было у всех.

[identity profile] dadv.livejournal.com 2012-04-28 04:06 pm (UTC)(link)
Надо понять и принять, что ipfw - низкоуровневый инструмент типа ассемблера (хотя уже и не машкодов) и не требовать от него большего. Правильный путь это писать высокоуровневые обертки над ним.

[identity profile] actika.livejournal.com 2012-05-01 12:39 pm (UTC)(link)
>новый файрвол должен быть statefull по умолчанию. таблиц state должно быть несколько в пределах нескольких fib (настраиваемо), т.е. что бы можно было сказать, что пакеты по пути em0/em1 организуют satet, не >пересекающеся с пакетами bge0/bge1 (мы не хотим видеть ответ на пакет, отправленный с интерфейса em0 на интерфейсе bge1).

Если вам так мила идеалогия IPTABLES поставьте себе линукс. Ненужно тянуть эту безумную модель в freebsd.

>у ipfw список правил со счетчиками -- они должны исполняться последовательно (что очень не эффективно)
На удафф в нетленки :-))

[identity profile] http://users.livejournal.com/_slw/ 2012-05-01 12:56 pm (UTC)(link)
iptables родился в твоем безумном мозгу

[identity profile] dadv.livejournal.com 2012-05-02 05:51 am (UTC)(link)
А не хотелось бы тебе для начала поразбираться с жуткими багами в существующем ipfw? Например:

#!/bin/sh

args="add 60001 count ip from any to { "

for i in `jot $1 1`
do
args="${args}127.0.0.$i or "
done
args="${args}127.0.1.1 }";

ipfw delete 60001
echo ipfw $args
ipfw $args


Для i386 запускаем скрипт с аргументом 122, для amd64 с аргументом 121. На 8.3 после этого наблюдаем бинарник /sbin/ipfw в состоянии running, жрущий все такты CPU, не убиваемый через kill -9. Любой последующий запуск ipfw - даже ipfw show - порождает второй такой же процесс. Перезагрузиться нормально такая система уже не в состоянии, только через выход в KDB и reboot там.

Page 2 of 8