pf - redirect

Amathar

Member
Hallo,

ich habe ein pf config Problem im Zusammenhang mit einem route-to Kommando.
Hintergrund: Die obsd fw hat eine default route Richtung externe Firewall über die sämtlicher Verkehr zum Internet geroutet wird.
Für ein Projekt soll der Verkehr eines Server per route-to einen anderen Weg zum Internet nehmen. Dazu habe ich folgende pf Rule gebaut:

pass in quick on $if_dmz from <dmz_fw_redirect_clients> to ! <all_uwh> route-to ($if_newras $gwnewras_int ) tag NEW_GWRAS

Das ganze funktioniert in soweit gut, daß z.B. pings von dem Server über dieses route-to Kommando an das passende Interface geroutet werden, das Ping Ziel im Internet auch erreicht wird und alles ist schön.
Dieses Verkehr ist outgoing also initiiert von dem Server.

Mein Problem ist Verkehr der vom Internet initiiert ist. Wenn ich also ein Ping aus dem Internet zu diesem Server sende, nimmt dieses ping den richtigen Weg zu dem host (per tcpdump auf dem Interface $if_dmz geprüft) und der host antwortet auch auf das Ping (ebenfalls geprüft), aber dieses Paket wird *nicht* an das Interface $if_newras gesendet, sondern es greift die default route auf der openbsd fw.

Diese pass in quick rule scheint also für dieses Ping Antwortpaket nicht zu greifen.
Was ist da falsch?

Danke
 
Hm, ich habe eine ähnliche Konfiguration am Laufen. Deshalb frage ich mich, warum du "pass in" machst und nicht "pass out"?
 
Hmm, entweder stehe ich auf dem Schlauch, oder ich vestehe nicht, warum es ein out sein sollte.

Also das icmp Paket kommt aus dem Internet über $if_newras rein. Die Rule dazu:
pass in on $if_newras all tag NEWRAS
Dann geht das Paket über das Interface $if_dmz an den Host. Passende Rule dazu:
pass out quick on $if_dmz inet proto icmp from any to $dmz_net icmp-type 8 code 0
Dann genriert der host ein icmp Antwort Paket. Dieses Paket kommt noch über $if_dmz wieder rein und sollte (was dann nicht geht) über die o.g. Rule an $if_newras geroutet werden.
Für $if_newras gibt ne Rule pass out quick on $if_newras
Hinter $if_newras verbirgt sich eine andere Firewall, die sämlichen Outgoing Traffic managed, also ist diese pass out quick rule ok.

Also von der Logik her.. Warum brauche ich eine pass out Rule? Ich dachte diese pass in Rule sorgt dafür, daß das icmp Antwortpaket ans richtige Interface kommt.

Dein Vorschlag wäre also sowas?
pass out quick on $if_newras from <dmz_fw_redirect_clients> to ! <all_uwh> route-to ($if_newras $gwnewras_int ) ...
 
Ok. du hast mehrere Regeln, ich dachte das ist deine komplette pf.conf.

Ich stelle mir das so vor: Ein Internetrechner pingt diesen Projektserver an. Die Firwallregel sagt: Schick das Paket über das $if_dmz an den Host. Das Antwortpaket von diesem Server sagt der Firewall "ich will ins Internet". Die Firewall sagt: "Gut, dann geh übers Standardgateway". Deswegen hätte ich eine Regel gebaut, die jeglichen Verkehr vom Projektserver über den anderen Weg ins Internet schickt.

Kurz gesagt ein "pass out von Projektserver zu Internet rout-to anderer-weg".
 
Ok, Deine Vorstellung ist ja nicht falsch.
Wie wäre dann die Rule zu Deiner Idee? So wie oben von mir beschrieben?
Danke
 
ich zeige dir meine Regel (ist allerdings für FreeBSD, also eine ältere Version von pf). Die Variablen (?) musst du durch deine ersetzen:

pass out quick on $int route-to ($int $ext_if) from $int_if to !$int_net keep state

int_if ist bei mir die IP des Gerätes, das über einen anderen Weg raus soll
ext_if ist bei mir der andere Weg
int ist bei mir die Netzwerkkarte über die der Traffic läuft
int_net ist bei mir das gesamte Subnetz (dieser "lokale" traffic soll ja nicht ins Internet)
 
Für die Nachwelt: In der manpage ist zu finden:
"The route-to option routes the packet to the specified interface with an optional address for the next hop. When a route-to rule creates state, only packets that pass in the same direction as the filter rule specifies will be routed in this way. Packets passing in the opposite direction (replies) are not affected and are routed normally."

Daher habe ich noch ne Rule eingebaut, welche die replies passend routet:
pass in on $if_newras all reply-to ($if_newras $gwnewras_int)

Habe es noch nicht ausgiebig getestet, aber ein ping aus dem Internet zu dem host funktioniert, was vorher nicht der Fall war.
 
Zurück
Oben