Re: Source Routing / ipfw

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Thu, 25 Nov 2004 14:44:53 +0100 (CET)

Richard Hirner <richard(at)hirner.at> wrote:
> Oliver Fromme schrieb:
> > Ob Du 83.64.231.2 oder 212.186.57.126 von außen anpingst,
> > ist völlig egal. Der Kernel such sich in seinem Routing-
> > Table das Interface mit der passenden Route zu der Adresse
> > heraus, wo er seine Ping-Antwort hinschicken soll (also
> > eine beliebige externe IP), und das ist in diesem Fall die
> > Default-Route (212.186.57.1). Die Ping-Antwort wird natür-
> > lich über das zugehörige Interface herausgeschickt (xl0),
> > und als Absender-IP wird die IP dieses Interfaces genommen
> > (212.186.57.126). Geht ja nicht anders. Deine fwd-Regel
> > spricht nie an, weil nie ein Paket mit der Source-Adresse
> > 83.64.231.2 erzeugt wird.
>
> Aha. Das ist eine Erklärung. Ich dachte, dass bei TCP und eigentlich
> auch bei ICMP die Zieladresse des 1. Pakets die Quelladresse des 2. sein
> sollte und der TCP/IP-Stack das auch so sieht.

Nein, das ist beides unabhängig voneinander. Meim Konstru-
ieren einer passenden Route interessiert sich der Kernel
nicht dafür, was für andere Pakete vorher auf welchem In-
terface und für welche Adresse angekommen sind (es ist so-
zusagen stateless). Der IP-Routing-Code arbeitet auf un-
terstem Level und weiß auch nichts von TCP-Connections o.ä.

> Wäre auch sinnvoll, oder?

Darüber könnte man streiten. Man kann genausogut argumen-
tieren, daß sich der Kernel gefälligst an die Routing-Ta-
belle zu halten hat. In den allermeisten Fällen ist das
schließlich das korrekte und erwünschte Verhalten. Und
vor allen Dingen ist es auf diese Weise erheblich einfa-
cher, ein deterministisches und vorhersagbares Verhalten
zu haben. Wenn der Kernel bei jedem rausgehenden Paket
erstmal erraten müßte, zu welcher Verbindung es wohl ge-
hören könnte, bzw. welche Pakete, die irgendwann vorher
empfangen wurden, das Herausschicken dieses Pakets ver-
ursacht haben mögen und somit das Source-Interface und
die Source-IP bestimmen, dann wird der ganze Routing-Code
um ein paar Dimensionen komplexer und unüberschaubarer.
Man würde sich damit mehr Probleme einhandeln als man löst.

Daher ist es besser, in den Fällen, wo man Source-Routing
braucht, dieses gezielt und deterministisch für genau diese
Fälle zu machen.

> > 2. Du kannst bestimmte Dienste (Daemonen) auf die Inode-
> > IP binden lassen (durch Konfiguration oder durch Ein-
> > sperren in ein jail). Dann gehen sie zwangsläufig mit
> > der von Dir festgelegten Source-IP raus. Du würdest
> > auf diese Weise also anhand des Dienstes festlegen,
> > welche IP verwendet wird. Du kannst z.B. einen sshd
> > auf 83.64.231.2:22 und einen auf 212.186.57.126:22
> > starten. Für Ping funktioniert dies natürlich nicht.
>
> Das wäre für mich genau ideal. Ich habe es gerade ausprobiert und einen
> Apache an 83.64.231.2:80 gebunden:
> tcp4 0 0 83.64.231.2.80 *.* LISTEN
> Dann von außen verbunden... nichts, funktioniert nicht. Muss ich da
> irgendwas Spezielles beachten?

Eigentlich nicht. Du brauchst natürlich trotzdem noch die
fwd-Regel. Schau mal mit »ipfw show« nach, ob dort Pakete
aufschlagen. Wenn das nicht hilft, guck mal mit tcpdump
nach, was wohin geht und woher kommt. Möglicherweise ist
bei Dir an anderer Stelle noch etwas falsch konfiguriert.

Ich habe selbst schon Source-Routing auf genau diese Weise
gemacht; das funktioniert.

Gruß
   Olli

-- 
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.
"A language that doesn't have everything is actually easier
to program in than some that do."
        -- Dennis M. Ritchie
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Thu 25 Nov 2004 - 14:45:32 CET

search this site