Forwarding von zwei Domains WAN-seitig zu zwei Servern auf der LAN-Seite

Started by nik-le, March 05, 2024, 10:04:39 PM

Previous topic - Next topic
Moin zusammen,

ich bin noch recht neu in der ganzen OPNsense Geschichte, also berichtigt mich gern, wenn ich schon von Anfang an was falsches sage :D

Also was ich vorhabe ist, zwei Domains (gehostet bei Strato), wir nennen sie jetzt mal domain1.de und domain2.de, durch die OPNsense auf zwei unterschiedliche, sich im LAN befindende Server zu leiten.
Hier mal ein ungefähres Netzdiagram:
             .---------.              .---------.
             | Domain1 |    Domains   | Domain2 |
             '----+----'              '----+----'
     domain1.de   |                        |   domain2.de
     A/AAAA       |      .----------.      |   A/AAAA
                  +------|  Strato  |------+
                         |  DynDNS  |
                         '----+-----'
                              |
                              | WAN (Telekom)
                              |
                              |
                         WAN  | PPPoE (IPv4/IPv6)
                         .----------.
                         | OPNsense |
                         '----+-----'
                         LAN  | 192.168.1.254/24
                              |
                              |
192.168.1.30/24 +------------+------------+ 192.168.1.35/24
domain1.loc     |                         | domain2.loc
            .----+----.               .----+----.
            | Server1 | lokale Server | Server2 |
            '---------'               '---------'


Der lokale Zugriff über Dnsmasq Host-Overwrites funktioniert tadellos.
Soweit ich das gelesen habe, müsste das alles mit nginx als reverse Proxy eigentlich funktionieren, jedoch mache ich vermutlich etwas bei der Konfiguration falsch. Ich habe hier folgenden Guide für verwendet: https://forum.opnsense.org/index.php?topic=19305.0.
Dabei habe ich das ACME erstmal weggelassen, da ich zunächst die Funktionalität auf HTTP testen wollte, bevor ich mich für die Domains um die Zertifikate kümmere.
Könnte da vielleicht schon der Fehler liegen?

OPNsense 24.1.2_1-amd64
FreeBSD 13.2-RELEASE-p10
OpenSSL 3.0.13
4 Kerne, 8192MB RAM, 28GB Platte
Virtualisiert auf Proxmox

Ich freue mich auf Antworten, Anregungen und natürlich eure Hilfe!
Beste Grüße

Hallo,

magst du uns vielleicht mit dem Fehlerbild erhellen, weiches du siehst?

Gute Idee (hab ich beim ganzen Ausgangslage erklären wohl vergessen)
Also die nginx Regeln nimmt er alle ohne Probleme an und ich kann auch die beiden Domains erfolgreich von außen anpingen. Port 80 und 443 sind in der Firewall freigegeben, Test-NetConnection sagt aber, dass nur der Port 80 funktionsfähig ist. Dabei habe ich aber die 443-Regel von der 80-Regel geklont.
Jedoch kann ich trotz dem offenen 80er Port nicht auf die internen Websites zugreifen.

Beste Grüße

Ok, aber bisher verstehe ich das Setup nicht.

Der nginx läuft auf OPNsense oder irgendwo dahinter? Und den Inhalt den nginx ausspielt, der kommt von irgendwo aus deinem LAN oder einem anderen Netzwerksegment von einem Server?

Da wäre die Frage, wie deine Regeln auf WAN aussehen, aber auch auf LAN, Gateways, Routen und vor allen Dingen, dein NAT Port-Forwarding. Oder bist du schon auf IPv6 only?

Der nginx läuft auf der OPNsense, der Inhalt soll von zwei Servern im LAN Segment kommen.


Regeln auf WAN Seite sind bis jetzt nur die ICMP und 80/443
Regeln auf LAN Seite die Standardregeln, welche automatisch erstellt worden sind.
Im NAT die Portweiterleitung ist die Anti-Aussperregel
Alles auch jeweils im Anhang nochmal zu sehen.


Ich fahre Dual-Stack IPv4/IPV6

Beste Grüße

Aha,

zunächst einmal fallen mir auf WAN einige Seltsamheiten auf:

IPv4 und IPv6 gehen auf Destination "WAN Netzwerk" das kann bei IPv6 in die Hose gehen, wenn du gar keine WAN IP hast. Das passiert nicht so selten, wenn du WAN auf DHCPv6 hast und vom ISP nur einen Präfix bekommst. Dann nutzt OPNsense die Globale Adresse von LAN als Absender und Empfänger. Hier würde ich einen Alias auf die WAN IP (4 und 6) Eintragen oder einfach "Diese Firewall".

Zweitens würde ich nur TCP Port 80 und 443 zulassen. Du lässt gerade alles von 1 bis 443 zu. In der Port Definition also bei Von und Bis jeweils 80 bzw. jeweils 443 eintragen. Dann steht da auch nur noch eine Zahl und kein "any - 80"

Ebenso würde ich nur TCP erlauben, kein TCP/UDP.


Danach heißt es debuggen. Verbinde dich per Port 80 und achte darauf, ob Pakete im WAN geblockt werden, die an Port 80 gehen und von dir kommen. Am besten jeweils 1x per IPv4 und IPv6 testen.

Falls nein -> Nginx ist dein Problem und sagt evtl. was im Log (meist Probleme beim Starten)
Falls ja -> Welche Regel blockt hier?

Nginx meldet ein 502 Bad Gateway, sollte die Verbindung dahinter nicht gehen, aber soweit müsstest du erst mal kommen.




OK also wenn du den Traffic auf der Sense annehmen willst, brauchst du auch keine Forwardings, also kein NAT. Das passt.
Gleiches würde statt Nginx auch für HAproxy gelten.

Ansonsten viel von dem was @Saarbremer schon schreibt:

* Die deutschen Namen muss ich teils raten, ich empfehle immer die FW auf englisch zu lassen. Deutsche Bezeichnungen haben eine Neigung unhandlich oder unpraktisch zu sein und wenn man nach Fehlern sucht wirds meist eng. Das nur vorab.
* WAN Netzwerk ist falsch, du willst wahrscheinlich WAN Adresse (wenn du nur eine IP auf dem WAN hast) oder "Diese Firewall" (müsste es auf deutsch heißen?). Korrekt(er) wäre aber WAN Adresse sehr wahrscheinlich.
* Ich würde die Regel auf dem WAN mit einem Port Alias "Web_Ports" o.ä. bestücken und zum Start - da du mit Port 80 anfangen willst - nur Port 80 eintragen. Dann kannst du problemlos später 443 hinzufügen wenns gebraucht wird und sparst dir eine Regel - und vor allem das Chaos mit den "Ports von-bis". Any-80 bzw. 443 ist da wie mein Vorredner schon schreibt nämlich falsch ;)
* ICMP4/6 würde ich auch auf "Echo Request" eingrenzen. Du möchtest - gerade bei IPv6 - NICHT einfach alle ICMP Subprotos freigeben, einige davon sind explizit nicht dafür gemacht im WAN zu stehen :)

Aber mit der Regel sollte dann der Traffic auch erlaubt sein. Ich würde auf der Regel dann das Logging noch anmachen und mal im Log schauen, ob Zugriff von extern dann auch sauber geloggt wird als "erlaubt", dann wäre der nächste Schritt der Nginx/Proxy und dessen korrektes Setup.

Ein 502 oder 503 sagt dann ggf. dass weiter im LAN was nicht läuft, aber erstmal soweit kommen :)

Cheers
"It doesn't work!" is no valid error description! - Don't forget to [applaud] those offering time & brainpower to help you!
Better have some *sense as no(n)sense! ;)

If you're interested in german-speaking business support, feel free to reach out via PM.

Danke für die vielen Hinweise!

Die WAN-Regeln sind jetzt auf "This Firewall" umgestellt und die Ports angepasst (gleich mit Port-Alias und Content: 80). Ich habe mich selbst schon gewundert woher das any kommt, hatte da einen Knick im Denken, ich dachte da geht's um Quell- und Zielport, wer lesen und nachdenken kann ist klar im Vorteil.  ::)

Ich habe den ICMP aufgetrennt und nur noch "Echo Request" freigegeben.

Versuche ich mich nun zu verbinden auf Port 80 macht mir mein Browser einen Strich durch die Rechnung... Chrome und Edge lassen es gar nicht zu auf http://domain1.de zu gehen und setzen selbst https:// davor, und Firefox wir weitergeleitet auf :4443 (OPNsense Dashboard Port), welcher dann einen DNS Rebind attack anzeigt.

Test-NetConnection bestätigt mir jedoch, dass der Port 80 geöffnet sei.

Firewall kann ich denke ich mal ausschließen, da ich in den Logs von nginx nachgesehen habe:
2024-03-06T16:11:36 Emergency nginx 2024/03/06 16:11:36 (emerg) 14371#100347: still could not bind()
2024-03-06T16:11:36 Emergency nginx 2024/03/06 16:11:36 (emerg) 14371#100347: bind() to 0.0.0.0:80 failed (48: Address already in use)
2024-03-06T16:11:36 Emergency nginx 2024/03/06 16:11:36 (emerg) 14371#100347: bind() to 0.0.0.0:80 failed (48: Address already in use)
2024-03-06T16:11:36 Emergency nginx 2024/03/06 16:11:36 (emerg) 14371#100347: bind() to 0.0.0.0:80 failed (48: Address already in use)
2024-03-06T16:11:36 Emergency nginx 2024/03/06 16:11:36 (emerg) 14371#100347: bind() to 0.0.0.0:80 failed (48: Address already in use)
2024-03-06T16:11:36 Emergency nginx 2024/03/06 16:11:36 (emerg) 14371#100347: bind() to 0.0.0.0:80 failed (48: Address already in use)
2024-03-06T16:11:36 Debug nginx NGINX setup routine completed.
2024-03-06T16:11:36 Debug nginx NGINX setup routine started.

Ich vermute der Fehler liegt noch in der nginx Konfig.
Also erstmal hier angreifen.
Ich schaue mal was ich über die tolle Googlemaschine so alles dazu finde und melde mich, wenn ich etwas rausgefunden habe.
Falls einer von Euch den Fehler bereits kennt und schneller helfen kann, nehme ich das natürlich auch sehr gerne an!

Danke!
Beste Grüße

Bei dir läuft ein anderer Dienst auf Port 80 vermutlich die Webgui von Opnsense.

Kannst du in der Shell mit
sockstat -ln | grep 80

herausfinden, bzw.

sockstat -ln | grep 443

für https.

Kommt output, steht da welcher Prozess den Port nutzt.


Port 80:
0        lighttpd   16792 9  tcp4   *:80                  *:*
0        lighttpd   16792 10 tcp6   *:80                  *:*

Vermutlich das Webgui, da die selbe pid und command beim 4443 stehen. Hierauf läuft das Webgui mit https, damit ich den Port 443 frei bekomme.


Port 443 ist frei.


Beste Grüße


Super!
Damit läuft nginx richtig hoch, und jetzt fühle ich mich von meinen Browsern ver******...


Mozilla macht gar keine Probleme, http://domain1.de sowie http://domain2.de verweisen genau auf die richtigen Server. (von "innen" als auch von "außen")
Alles was auf Chromium basiert will mir unter keinen umständen http:// über eine öffentliche Domain zulassen.

Und da ist es egal, ob ich Android oder Windows verwende.

ABER meine Frage ist damit zunächst beantwortet  ;D

Danke an alle Helfer!

Jetzt geht's an den nächsten Gegner, https :D

Beste Grüße