Re: IPFW-Frage

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Thu, 21 Nov 2013 16:37:04 +0100 (CET)

Peter Ross wrote:
> Hallo,
>
> ich bin gerade dabei, eine Firewall mit IPFW zu verschlimmbessern.
>
> Ein wenig hat mich die Manpage verwirrt:
>
> The via keyword causes the interface to always be checked. If
> recv or xmit is used instead of via, then only the receive or
> transmit interface (respectively) is checked. By specifying
> both, it is possible to match packets based on both receive and
> transmit interface, e.g.:
>
> ipfw add deny ip from any to any out recv ed0 xmit ed1
>
> okay, ich mache es mal andersrum, mit "pass":
> ipfw add pass ip from any to any out recv ed0 xmit ed1
>
> Muss ich trotzdem noch ein
>
> ipfw add pass ip from any to any in recv ed0
>
> hinzufuegen?
>
> Und dann, um ausszuschliessen, das jemand via ed0 direkt in die Frireall
> kommt (also nur Transit sol erlaubt sein), muss ich vorher ein
>
> ipfw add deny ip from any to me in recv ed0
>
> schreiben? Also alles zusammen:

Grundsätzlich spielen hier zwei Fakten eine Rolle:

1. Geroutete Pakete gehen _zweimal_ durch den IPFW-Regelsatz,
   einmal beim Hereinkommen und einmal beim Herausschicken.
   Will man sie durchlassen, muss beides erlaubt sein.

2. Beim Hereinkommen weiß IPFW noch nicht, was der Routing-
   Code später mit dem Paket anstellt, d.h. bei welchem
   Interface es später wieder herauskommt (wenn überhaupt).
   IPFW kann ja nicht in die Zukunft schauen. Daher kann
   bei hereinkommenden Paketen nur das "recv"-Interface
   geprüft werden, nicht das "xmit"-Interface. Letzteres
   geht nur bei Paketen, die auf dem Weg nach draußen sind.

Wenn Du bei gerouteten Paketen sowohl beim Hereinkommen als
auch beim Rausgehen das jeweilige Interfaces prüfen willst,
brauchst Du also zwei Regeln. Mit einer geht es nicht.

> ipfw add pass ip from any to any out recv ed0 xmit ed1
> ipfw add deny ip from any to me in recv ed0
> ipfw add pass ip from any to any in recv ed0

Die letzten beiden kannst Du zusammenfassen (vorausgesetzt,
es kommt später noch eine deny-default-Regel):

ipfw add pass ip from any to not me in recv ed0

> Sorry, das laesst mir gerade keine Ruhe, aber ich bin im Moment von der
> Konsole kilometerweit weg.. da "spielt" es sich schlecht;-)

Wenn man das remote macht, gibt es zwei Probleme: Erstens
bricht einem die ssh-Verbindung weg, wenn während des Flush,
der beim Neuladen der Regeln passiert, eine Ausgabe passiert.
Das Wegbrechen der ssh-Verbindung wiederum bewirkt, dass
ipfw(8) ein SIGHUP bekommt und die restlichen Regeln nicht
mehr lädt. Nicht gut. :-)

Die Lösung ist, die Ausgabe (auch stderr) in eine Logdatei
umzuleiten. Das sleep sorgt dafür dass nicht zufällig noch
gepufferte Ein-/Ausgaben im falschen Moment in die Quere kommen.

( sleep 3; /sbin/ipfw /etc/ipfw.conf; sleep 3 ) >/root/ipfw.log 2>&1

(Syntax für sh, zsh und bash.)

Das zweite Problem ist, dass sich in den Regeln immer mal ein
Fehler einschleichen kann und man sich aussperrt. Um das zu
umgehen, ist es das einfachste, sich einen temporäre Cronjob
nach folgendem Muster anzulegen:

MM HH * * * /sbin/ipfw add 1 allow ip from any to any

wobei HH:MM eine Uhrzeit ist, die etwa fünf Minuten in der
Zukunft liegt. Nicht vergessen, den Cronjob danach wieder zu
entfernen (und ggf. die IPFW-Regel 1, falls sie vom Cronjob
gesetzt wurde).

Man kann stattdessen auch at(1) nehmen:

echo /sbin/ipfw add 1 allow ip from any to any | at HH:MM

Nachteil ist, dass at(1) per Default nur alle fünf Minuten
nach Jobs schaut, d.h. die Granularität ist geringer (und
manchmal ist at ganz disabled, z.B. bei mir). Für diesen
Fall mag es aber genügen. Auch hier nicht vergessen, den
Job mit atrm(1) wieder zu entfernen, ebenso ggf. die IPFW-
Regel 1.

Gruß
   Olli

-- 
Oliver Fromme,  secnetix GmbH & Co. KG,  Marktplatz 29, 85567 Grafing
Handelsregister:  Amtsgericht Muenchen, HRA 74606, Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsreg.: Amtsgericht München,
HRB 125758, Geschäftsführer:  Maik Bachmann,  Olaf Erb,  Ralf Gebhart
FreeBSD-Dienstleistungen/-Produkte + mehr: http://www.secnetix.de/bsd
"If Java had true garbage collection, most programs
would delete themselves upon execution."
        -- Robert Sewell
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Thu 21 Nov 2013 - 16:37:15 CET

search this site