Re: Eine ipfw-Regel fuer mehrere Interfaces

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Wed, 1 Sep 2004 11:04:59 +0200 (CEST)

Markus <universe(at)truemetal.org> wrote:
> Ich habe auf mehreren (2-3) Interfaces Pakete fuer mehrere tausende
> IP-Adressen im lokalen Netz. Ich moechte fuer diese IP-Adresse die
> Pakete accounten, aber vermeiden dass ich fuer jede einzelne IP-Adresse
> 2-3 Regeln (eben je Interface eine) anlegen muss.
>
> Sowas wie
>
> ipfw add count ip from any to 192.168.0.111 in via fxp0,vlan0,em0
>
> geht leider nicht.
>
> Interner Traffic (z.B. von fxp1 zu vlan1) soll nicht accounted werden.

Die Syntax ist mit »or« (IPFW2), nicht mit Kommata.

Allerdings würde ich es in diesem Fall aus Effizienzgründen
anders lösen, nämlich mit einer »skipto«-Regel, denn das
ist erheblich effizienter: Bei Paketen, die nicht gezählt
werden sollen, werden die count-Regeln gar nicht erst
durchlaufen, und bei denjenigen, die gezählt werden sollen,
spart es immerhin ein Vergleichsmuster (der Interfaces).
Also ungefähr so:

ipfw add 10000 skipto 20000 all from any to any out
ipfw add 10001 skipto 20000 all from any to any not via fxp0 not via vlan0 not via em0
ipfw add 10002 count ip from any to 192.168.0.111 in
ipfw add 10003 count ip from any to 192.168.0.112 in
ipfw add 10004 count ip from any to 192.168.0.113 in
..
ipfw add 20000 ... # Hier geht's weiter.

Bei mehreren tausend IPs wäre es evtl. auch sinnvoll, die
Regeln weiter in Blöcke zu unterteilen. Mit obigem Regel-
satz würde er immer _alle_ Regeln durchlaufen. Wenn Du
z.B. nach /24-Subnets unterteilst, würde er nur maximal 256
Regeln durchlaufen (plus ein paar für die Verzweigungen).
Das würde dann etwa so gehen:

ipfw add 10000 skipto 20000 all from any to any out
ipfw add 10001 skipto 20000 all from any to any not via fxp0 not via vlan0 not via em0
ipfw add 10002 skipto 10100 ip from any to 192.168.0.0/24
ipfw add 10003 skipto 10400 ip from any to 192.168.1.0/24
ipfw add 10004 skipto 10700 ip from any to 192.168.2.0/24
..
ipfw add 10099 skipto 20000 all from any to any
ipfw add 10100 count ip from any to 192.168.0.1
ipfw add 10101 count ip from any to 192.168.0.2
ipfw add 10103 count ip from any to 192.168.0.3
..
ipfw add 10399 skipto 20000 all from any to any
ipfw add 10400 count ip from any to 192.168.1.1
ipfw add 10401 count ip from any to 192.168.1.2
ipfw add 10403 count ip from any to 192.168.1.3
..
ipfw add 10699 skipto 20000 all from any to any
ipfw add 10700 count ip from any to 192.168.2.1
ipfw add 10701 count ip from any to 192.168.2.2
ipfw add 10703 count ip from any to 192.168.2.3
..
ipfw add 20000 ... # Hier geht's weiter.

Du kannst natürlich auch nach /26 oder sonstwie untertei-
len. Die optimale Unterteilung richtet sich nach der An-
zahl der IPs, die accountet werden sollen. Wenn Du z.B.
5000 IPs hast, ergibt sich folgende Tabelle für die Anzahl
der zu durchlaufenden Regeln:

Teilung count-Regeln skipto-Regeln (Schnitt)
------------------------------------------------
/24 256 10
/25 128 20
/26 64 40
/27 32 80

Das Optimum läge also bei /26, wo im Schnitt insgesamt 104
Regeln durchlaufen werden müssen (vorausgesetzt daß die IPs
mit etwa gleicher Wahrscheinlichkeit auftreten). Das sind
50-mal (!) weniger, als wenn Du ganz ohne skipto und ohne
Unterteilung arbeitest, denn dann müßtest Du immer 5000
Regeln durchlaufen!

Es bietet sich natürlich an, die ganzen Regeln mit einem
kleinen Skript automatisiert zu generieren.

Gruß
   Olli

PS: Das ganze erinnert mich frappierend an die gute alte
BASIC-Programmierung. OK, nicht »gute«, aber alte. :-)

-- 
Oliver Fromme, secnetix GmbH & Co KG, Oettingenstr. 2, 80538 München
Any opinions expressed in this message may be personal to the author
and may not necessarily reflect the opinions of secnetix in any way.
"With sufficient thrust, pigs fly just fine.  However, this
is not necessarily a good idea.  It is hard to be sure where
they are going to land, and it could be dangerous sitting
under them as they fly overhead." -- RFC 1925
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Wed 01 Sep 2004 - 11:07:22 CEST

search this site