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/_slw/ 2012-05-25 07:13 am (UTC)(link)
Вот без примеров непонятно, что ты имеешь в виду. То есть, для конструктивного продолжения нужно на чем-то предметном обсуждать, а не в общем. Ну как, воскресенье прошло, начеркал?..

попробую пробиться через жжшечку. много не успел, в купе попался спиногрых сверактивный -- мозг вынесен нах.

DEF Eth :=
     dst_mac := octets(6) format eth_addr
     src_mac := octets(6) format eth_addr
     ethtype := uint16 byteorder MSB format hex

DEF Eth := -- 802.1q
     dst_mac := octets(6) format eth_addr
     src_mac := octets(6) format eth_addr
     tpid := uint16 byteorder MSB format hex eq 8100
     tci := uint16 byteorder MSB is
        vid := uint:12
        cfi := uint:1
        pcp := uint:3;
     ethtype := uint16 byteorder MSB format hex

DEF IPoEth :=
     Eth(ethtype eq 0800)
     IP_hdr

DEF IP_hdr (size = ihl*4) :=
     octet is
        ihl := uint:4
        ver := uint:4 eq 4;
     tos := uint8;
     total := uint16 byteorder msb
     id := uint16 byteorder msb
     uint16 byteorder msb is
         frag_offset := uint:13
         flags := uint:3 is
            mf := uint:1
            df := uint:1
     ttl := uint8
     proto := uint8
     hdr_csum := uint16 byteorder msb
     ip_src := octets(4) format ipv4
     ip_dst := octets(4) format ipv4
     options := fill IP_options

DEF UDPoIP :=
     IP_hdr(proto eq 17)
     UDP_hdr

DEF UDP_hdr :=
     sport := uint16 byteorder msb
     dport := uint16 byteorder msb
     len := uint16 byteorder msb
     udpcsum := uint16 byteorder msb format hex


получилось не очень хорошо, но в первом приближении так. не описана фрагментация, но мне кажется с этим можно справиться (надо ввести понятие stream и написать как ip фрагменты складываются в stream, который суть ip пакет размером более mtu. поскольку файрволу не надо терминировать в терминах ядра на себе протоколы, то такой путь вроде как возможен и нормален. ну и udp после этого будет не стекированным над ip заголовком, а внутри ip stream. а tcp будет свой stream порождать)

Пример языка

[identity profile] nuclight.livejournal.com 2012-05-28 08:07 pm (UTC)(link)
Мнээ... Я ожидал не этого, которое в общем-то в стиле Капитана Очевидность, а куда более интересного - описания данных уже в payload, на примере FTP или лучше того же SIP. Нижний уровень интереса не представляет, его можно даже захардкодить (и фрагментацию) для скорости, черт с ним, ибо там пока всего 2 варианта, v4 и v6 (кстати iptables тоже базово поддерживает IP, а модулями уже то, что выше).

А вот то, что уровнем выше, и что ты проповедовал как замену хелперам, то более значимо повлияет на архитектуру, покажи лучше это.

[identity profile] http://users.livejournal.com/_slw/ 2012-05-28 08:37 pm (UTC)(link)
я не вижу принципиальной разницы. в конце концов ipv4 -- это payload езернета.
так же мне не очевидно, почему следует ip поддерживать базово, в смысле чем он отличается от pppoe, gre, ipip... ну и будет ли выйгрыш в скорости, поскольку при базовом разборе ip его разбирают целиком, а при таком варианте разбор возможно будет происходить только частично и только когда надо. в смысле этакие ленивые вычисления. это может довольно сильно усложнить "компилятор" (а может и нет), но вряд ли скажется на эффективности обработки. и мне кажется, что можно с нуля вот так все описать.

да, при этом потребуются некоторые примитивы: преобразование в текстовый вид и обратно 8/16/32 битных чисел, ipv4/6 (а при добавлении протоколов дополнительные примитивые -- asn1 для h.323, побайтовое-через-запятую представление для ftp -- это надо будет делать модулями с реализацией на си); для отслеживания сесиий -- хэши и деревья от комбинаций битовых полей, для nat -- мапинг битовых полей одной размерности в другую.

я напишу пример для sip, но не сегодня -- я его на память не помню и надо будет rfc в очередной раз освежать в памяти.

[identity profile] http://users.livejournal.com/_slw/ 2012-05-29 05:48 pm (UTC)(link)
пример положил сюда zxy.spb.ru/rules.ip.txt

вот как-то так
я синтаксисом не доволен, но хоть как-то так.