Om at compile firewall rulesets til C

From: Jesper Louis Andersen (none@jlouis--mongers.org.lh.bsd-dk.dk)
Date: Sat 20 Dec 2003 - 03:56:12 CET


From: "Jesper Louis Andersen" <none@jlouis--mongers.org.lh.bsd-dk.dk>
Date: Sat, 20 Dec 2003 03:56:12 +0100
To: bsd-dk@bsd-dk.dk
Subject: Om at compile firewall rulesets til C

Det er sent og jeg kan alligevel ikke sove, saa jeg vil forulempe
resten af tilhoerende med en mail.

I Torsdags var Flemming ''Batmule'' Jacobson, Poul Henning Kamp og
jeg taget til SSLUG-moede for at se hvad der skete ovre paa den anden
side af andedammen. Grundet sygdom fra den oprindelige foredragsholder,
saa kom Flemming til at holde et lille oplaeg om FreeBSD's ipfw
firewall overfor en flok linuxfolk. Ganske hyggeligt. Der var dog et
par tangenter, som jeg godt kunne taenke mig at faa styr paa:

PHK hintede paa et tidspunkt om at raa ''per packet'' rule processing
skulle vaere hurtigere end stateful inspection. Jeg kender ikke tal
fra ipfw, men i tilfaeldet med PF fra OpenBSD gaar det rent faktisk
hurtigere at lave stateful inspection [1]. OpenBSD benytter internt
bare en struct af src/dst ip, src/dst port og protokolnummer,
ordnet leksikografisk og gemt i et balanceret binaert soegetrae
(Red-black, hvis nogen er interesserede). Det sikrer O(lg n) lookup-
time. Igen er jeg ikke klar over hvad der sker internt i ipfw, men
hvis man benytter enten trees eller hash-tables, saa burde tiden ikke
vaere meget daarligere. Benytter man hashtables, skal man dog nok
overveje at lave et tree i hver bucket, da man ellers som angriber
kan smadre hashtabellen ved velvalgte connection-spoofs.

Den leksikografiske ordning kraever maksimalt 5 conditionalchecks
per knude. Modulo cache-miss skal der virkeligt vaere fart paa, hvis
man kan klare sig hurtigere igennem et regelsaet.

Saa var der lige den om at omskrive rulesets til C. Det er aabentbart
gjort for ipfw, men koden er ikke i en tilstand der kan udgives. Det
ser ud til at IPF faar denne feature med 4.0-releasen:

+---
generates C code from filter rules to compile in or load as native
machine code.
+---

(Sakset fra HISTORY i beta-udgaven).

Og ja, jeg gaar stadig med en ide om at lave et lille program der
som input tager et regelsaet og som output producerer et trae man
kan smide pakken igennem. Det giver reelt set en KMP-matcher for
regelsaettet og saa kommer der nok en del fart paa. Det skulle
gerne kunne give meget mere end hvad en person kan optimere i
haanden, hvad openbsd's PF kan levere med skip-steps. Desuden
skulle det semantisk have samme betydning som det oprindelige
regelsaet og her er det nok sikrere at have et program der ved
hvad det goer, en et menneske der laver fejl.

[1] http://www.benzedrine.cx/linuxforum/

-- 
j. 



This archive was generated by hypermail 2b30 : Wed 15 Nov 2006 - 18:24:34 CET