pf Frage: dedizierter Server soll Verbindungen an andere Server weitergeben

bsd4ever

Well-Known Member
Hallo,

ich habe ein Frage zu rdr/nat mit pf.
Und zwar möchte ich Verbindungen zu einem Port auf einem Server gleichzeitig an mehrere andere weiterleiten.
Diese "mehreren anderen" haben für sich wiederrum einen Dienst laufen, der als master/slave konfiguriert ist. Die Idee dahinter ist, dass diese Server parallel die Anfragen bekommen und das ja unter sich ausmachen, wenn einer nicht erreichbar ist, übernimmt der andere automatisch.
Ich habe das nun soweit konfiguriert, allerdings kommt keine Verbindung zu Stande. Die Zielrechner sind auch über re0 (internet, also kein lan) erreichbar. Was habe ich übersehen?


inet_if="re0"
rdr on $inet_if inet proto tcp from any to $dedserverextip port = 12345 -> $zielserver


pass in on $inet_if inet proto { tcp, udp } from any to $zielserver port 12345 keep state


später soll dann "zielserver" mehrere IPs beinhalten.


Viele Grüße!
 
Hi,
rdr kannst du nur von "Außen" testen, also nicht von der Maschine aus, auf der $inet_if liegt.
Weiterer Tipps: statt des Makros $zielserver gleich eine Tabelle nehmen.

Rob
 
Und 'forwarding' per sysctl anmachen.

Ausserdem wird das nicht so wirklich funktionieren ("unter sich ausmachen"), weil pf
weiter auch auf eine aus service/port gesehene IP weiterleiten wird (im round-robin).

Auf OpenBSD wuerde ich 'relayd' sagen.. weiss nicht, ob FreeBSD was vergleichbares hat -
ansonsten gaebe es noch 'haproxy'.
 
ich meine, freebsd darf gerne permanent an beide zielserver weiterleiten. wenn der eine weg ist, macht das ja nichts aus. wenn beide laufen, weiss der eine dass er nur slave ist und verarbeitet die ankommenden daten nicht;)
 
round robin bedeutet, doch, dass es abwechselnd an jeweils einen zielserver weitergegeben wird. ich möchte ja jederzeit an alle gleichzeitig. also einfach "round robin" weglassen, oder wie erreicht man das?

Grüße
 
Das ist IMHO nicht möglich, weil das schon gegen TCP spricht. Der Nutzer macht EINEN TCP Handschake (Layer4).
Dein momentaner Aufbau spricht eher für einen Hot Swap, also eine Maschine die Rumidled bis die Hauptmaschine ausfällt.
Es geht entweder nur mit round robin (einfachste möglichkeit, also dass ein Maschine ankommt, erhält einen Session Token für die erste Maschine und die Nächste Maschine erhält dann einen für die andere) oder einem lastabhängigen LoadBalancer was allerdings nicht ganz so leicht ist, weil es eine Intelligenz dahinter benötigen würde um zu entscheiden welche Maschine schon zuviel Last hat.
Weitere und gebräuchlichste Möglichkeit dass die Last verteilt wird... eine Frontend-Backend-System das ebenfalls durch Loadbalancer (meist RoundRobin) voneinander getrennt ist. Das liesse sich auch durch Virtuelle Maschinen erreichen.
Nur mit pf ist es meines Wissens nicht zu erreichen (edit.. zeigt mal wieder das ich noch nicht viel weiss: https://www.openbsd.org/faq/pf/pools.html). RoundRobin kriegt man auch mit nem Apachen hin.
 
ich habe das bisher lokal mit pfSense gemacht, als ZielIP einfach einen Alias eingetragen, in dem 2 Hosts stehen. funktioniert...
 
Guten Abend, nun habe ich mir das nochmals angeschaut. Also eigentlich hast du recht, mit TCP dürfte das garnicht funktionieren. Ich sehe auch immer abwechseln auf den ZielServern die tcp/http verbindung. auch ohne round-robin. Anders kann es ja auch garnicht funktionieren.. mhhh *ratlos*
 
Male wie du es haben möchtest und mit pfSense hast mal auf... account bei cacoo.com ist dafür z.B. recht praktisch.
Und überprüfe mal die Einstellung von pfSense... da die alles mögliche andere auch drin hat kann es schon sein, das es automatisch ein Roundrobin macht... aber bei pf selbst muss man halt noch zusätzliche Einstellungen machen. Die pfctl Kommandos funktionieren auch auf der pfsense... vielleicht gibt dort ein pfctl -sr was her das es erklären könnte.
 
Wenn dir ein Server ausfällt, ist jede zweite Verbindung dann auch nicht funktional. pf macht keine Healtchecks. Du möchtest einen Loadbalancer davor haben, der aktiv Healthchecks macht, ob der Server noch verfügbar ist. Wie @double-p schon erwähnte, kannst du dafür HAProxy nehmen (oder relayd, falls es das unter FreeBSD gibt; httpd lässt sich ja lt. hören/sagen auch ohne weiteres compilen).
 
Du kannst die Server sonst auch mit einem CARP-Setup versehen und machst den redirekt darauf. Wenn der eine ausfällt oder in Maintenance geht, übernimmt halt der andere. Ein Loadbalancer wäre allerdings flexibler.
 
Ich würde die Gelegenheit nutzen und HAProxy kennenlernen. Eines der besten Stücke Software, die es gibt.
 
Was ich mir dann immer denke, dass die HAProxy-Maschine ja dann wieder der SPOF ist und nicht ausfallen darf;)
Klar, man kann auch das wieder skalieren.. das ist dann aber ein Fass ohne Boden.
 
Wenn der Dienst entsprechend wichtig ist, dann würde ich das mit einem DNS Round Robin und floating IPs lösen. Sind beide HAProxy Instanzen da, so hält jede "ihre" Floating IP und macht dann Loadbalancing nach hinten zu den Applikationsservern. Ist einer der beiden HAProxys weg, so hält der verbleibende beide IPs.
 
Zurück
Oben