CGNAT umgehen mit Root-Server: Wie Absender-IP behalten bei eingehenden Requests?

Gemeinsam ins Internet mit Firewall und Proxy.
Antworten
alex0801
Beiträge: 208
Registriert: 16.10.2005 19:46:48
Wohnort: Rhein-Neckar-Kreis

CGNAT umgehen mit Root-Server: Wie Absender-IP behalten bei eingehenden Requests?

Beitrag von alex0801 » 03.12.2024 15:00:25

Hallo,

mein IP Tables wissen reicht nicht mehr aus um das in den Griff zu bekommen. Ich hoffe jemand kann weiterhelfen und erklären was fehlt, oder aufklären warum das nicht geht was ich da vor habe.

Aber von vorne, folgendes Szenario:

Privater FTTH Anschluss, leider mit CGNAT, d.h. keine öffentliche IPv4. Für meine Zwecke brauche ich aber unbedingt (neben IPv6) auch einen IPv4 Weg um "von unterwegs" daheim auf Dinge (leider auch Dinge, für die ein ReverseProxy nicht ausreicht) zuzugreifen.

Ich bekomme also vom ISP nur eine weitere private IPv4, die der ISP dann per NAT ins Internet routet.

Mein Plan (der auch grundsätzlich schon funktoniert):

Einen kleinen billigen Root-Server mieten. Der hat eine statische IPv4.
Dann meinen Router daheim anweisen eine Wireguard VPN Verbindung zum Miet-Server aufzubauen, und diesen geöffneten Tunnel nutzen, um die statische IPv4 meinen ausgewählten Diensten im Heimnetz zur Verfügung zu stellen.

Das Setup:

Heimnetz mit 192.168.200.0/24
FTTH Router (Mikrotik! keine Fritzbox o.ä.) auf IP 192.168.200.1

Miet-Server mit 87.x.y.z Public IPv4
Wireguard VPN Server mit IP 192.168.100.1 im Netz 192.168.100.0/24. Lauscht auf Verbindungen aus dem Internet.

Auf dem FTTH Router:
* ein Wireguard Peer auf IP 192.168.100.2, der sich mit dem WG-Server auf dem Miet-Server verbindet.
* Portforwarding von 192.168.100.2 TCP Port 33 zu z.B. 192.168.200.3 TCP Port 44


Folgendes läuft ohne Schwierigkeiten:

* Login auf dem Miet-Server und von dort ein Verbindungsaufbau zu 192.168.100.2 TCP Port 33. Am anderen Ende kommt das fehlerfrei bei 192.168.200.3 TCP Port 44 an. Absender-IP der dort ankommenden Anfragen: Korrekterweise 192.168.100.1. (ich komm ja direkt vom Miet-Server und gehe über Wireguard rein in mein Netz Zuhause)

Also alles bestens soweit. Aber ich bin damit noch nicht am Ziel angekommen.

Auf dem Miet-Server brauche ich, um von 87.x.y.z ins Wireguard-Netz zu kommen ebenfalls ein bisschen NAT:

Code: Alles auswählen

INET_IF="ens6"
WG_IF="wg0"
INET_IP="87.x.y.z"
WG_PORT="51820"
WG_SERVER="192.168.100.1"
WG_PEER="192.168.100.2"

iptables -t nat -A PREROUTING -p tcp -i $INET_IF '!' --dport 22 -j DNAT --to-destination $WG_PEER; 
iptables -t nat -A POSTROUTING -o $INET_IF -j SNAT --to-source $INET_IP
iptables -t nat -A PREROUTING -p udp -i $INET_IF '!' --dport $WG_PORT -j DNAT --to-destination $WG_PEER;
SSH Port 22 und der Wireguard Server verbleiben auf dem Miet-Server. _Alles andere_ wird weiter geleitet zu meinem Wireguard Peer. Das mit dem _alles_ ist zwar ein weng unsicherer, aber vor dem Miet-Server sitzt noch mal eine Firewall wo ich generell die Ports freischalten muss/kann.

Das Problem:

Wenn ich aus dem Internet von IP 4.3.2.1 eine Verindung zu 87.x.y.z TCP Port 33 aufbauen will, kommt am Zielhost nach all dem NAT und Portforwarding nur noch ein TCP SYN an. Das heißt aber auch, ich bin schon durch folgende Systeminstanzen durch:

* externe Miet-Server Firewall, direkt beim Anbieter des Servers
* IP Tables Firewall des Miet-Servers
* Wireguard Tunnel bis nach Hause zu meinem Router
* Firewall/Portforwarding auf dem Router
* Netzwerk bis hin zum Zielserver im Heimnetz.

Die Verbindung lässt sich nicht aufbauen. Als Absender-IP sehe ich am Zielsystem 4.3.2.1 ... Und ich sehe, dass der Ziel-Server versucht ein SYN-ACK zu senden. Aber das geht wohl schief. Vermutlich nimmt das SYN-ACk Paket nicht den selben weg zurück?


Ich hab dann ein wenig experimentiert.
Wenn ich in der Firewall IP Tables Einstellung noch folgende Regel einfüge:

Code: Alles auswählen

iptables -t nat -A POSTROUTING -o $WG_IF -j SNAT --to-source $WG_SERVER
dann klappt der Verbindungsaufbau. Hab mich schon gefreut es doch hinbekommen zu haben. Aber: Damit hab ich natürlich auf dem Miet-Server ins Wireguard-Interface rein hart die Absender-IP des Wireguard Servers eingetragen. Am Zielsystem sehe ich dann nicht mehr, wo die Anfrage wirklich her kam. Das ist für meinen Anwendungszweck richtig blöd. Ich muss am Zielsystem (192.168.200.3) schon sehen, von welcher IP die Anfrage kam. Das "ganze Internet" hinter der IP des Wireguard-Servers verstecken ist keine Lösung.

Was ich schon probiert habe:

Statt den zwei "SNAT" Regeln, einfach Masquerade-Regeln:

Code: Alles auswählen

iptables -t nat -A POSTROUTING -o $WG_IF -j MASQUERADE
iptables -t nat -A POSTROUTING -o $INET_IF -j MASQUERADE
Aber die bewirken, wer hätt's gedacht, im Endeffekt das selbe. Alles was rein kommt bekommt die IP des Miert-Server WG-Interfaces (also 192.168.100.1) und alles was raus geht die IP des WG Peers (also 192.168.100.2).

Die Frage die sich mir stellt: Wie bewerkstellige ich es, dass ich bei eingehenden Verbindungen nach all dem Port-Forwarding noch sehe, wo der Request wirklich her kommt?

Sehe aktuell zwei Möglichkeiten:

1. Ich bin zu blöd für IP Tables resp. meiner Router-FirewallPortforwarding Einstellung und ich muss da was anderes einstellen/anpassen.
2. Durch dieses doppelte NAT (einmal bei mir im Router und einmal auf dem Miet-Server) geht das was ich vor habe gar nicht.

Kann mich jemand mit Ahnung bitte erleuchten?

Gruß
Alex

mludwig
Beiträge: 807
Registriert: 30.01.2005 19:35:04

Re: CGNAT umgehen mit Root-Server: Wie Absender-IP behalten bei eingehenden Requests?

Beitrag von mludwig » 03.12.2024 17:29:39

Soviel NAT, dass wird ja kompliziert. Ich würde ja von außen ebenfalls eine VPN Verbindung zum root-Server aufbauen, und der muss dann die Anfrage zu dir nach Hause routen. Ohne NAT!

Das heisst dein Root-Server muss die Route setzen zu deinem Heim-Netz.

Code: Alles auswählen

ip route add 192.168.200.0/24 via 192.168.100.2
Der Rückweg muss auch funktionieren, also auf dem GW im Heimnetz die Route für das Netz deines Clients setzen (via root-Server)
Und dein Client brauch ebenfalls das Routing zu deinem Heimnetz über das VPN zum Root-Server.

Dann sollte das ohne NAT nur durch die zwei VPN Verbindungen laufen.

Benutzeravatar
cosinus
Beiträge: 4202
Registriert: 08.02.2016 13:44:11
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Bremen

Re: CGNAT umgehen mit Root-Server: Wie Absender-IP behalten bei eingehenden Requests?

Beitrag von cosinus » 04.12.2024 00:05:56

alex0801 hat geschrieben: ↑ zum Beitrag ↑
03.12.2024 15:00:25
Privater FTTH Anschluss, leider mit CGNAT, d.h. keine öffentliche IPv4. Für meine Zwecke brauche ich aber unbedingt (neben IPv6) auch einen IPv4 Weg um "von unterwegs" daheim auf Dinge (leider auch Dinge, für die ein ReverseProxy nicht ausreicht) zuzugreifen.
Unterwegs gibt es kein IPv6? Und auch dann keine Möglichkeit per Tunnelbroker IPv6 bereitzustellen?
Mit CGNAT sehe ich jedenfalls keine reelle Chance.

alex0801
Beiträge: 208
Registriert: 16.10.2005 19:46:48
Wohnort: Rhein-Neckar-Kreis

Re: CGNAT umgehen mit Root-Server: Wie Absender-IP behalten bei eingehenden Requests?

Beitrag von alex0801 » 04.12.2024 08:21:36

@mludwig

Ja, das ginge. Zumindest solange ich dafür VPN nutzen will.
Wenn ich Web-Services bereitstellen will, dann klappt das nicht mehr :-(

@cosinus
Doch, aber eben nicht immer und überall. Gibt (leider) noch zahlreiche Internetanbindungen da draußen, die kein IPv6 anbieten oder eingerichtet haben.

Benutzeravatar
bluestar
Beiträge: 2419
Registriert: 26.10.2004 11:16:34
Wohnort: Rhein-Main-Gebiet

Re: CGNAT umgehen mit Root-Server: Wie Absender-IP behalten bei eingehenden Requests?

Beitrag von bluestar » 04.12.2024 09:06:54

Wenn du die Absender-IP beibehalten willst, dann hast du zu Hause auf deinem Server das Problem, dass dein Antwort-Paket nicht über deinen Tunnel seinen Weg zurück ins Internet nimmt, sondern über das Default-Gateway (deinen lokalen Internet-Anbieter) und das funktioniert natürlich nicht.

Ich würde dir im Bezug auf Web-Services zu folgendem Konstrukt raten, du installierst auf deinem Root-Server einen HTTP Proxy (z.B. Traefik) und leitest damit die Requests auf deine interne(n) IPs weiter, dann kommen für deinen Server zu Hause die Anfragen von der IP des Root-Servers, der Proxy setzt jedoch die korrekte Absender IP im Header (X-Forwarded-For:).

Alternativ müsstest du deinem Server beibringen, dass er Pakete die über den Tunnel reinkommen markiert (iptables mark in Forwarding chain) und das er markierte Pakete über eine alternative Routing-Tabelle zurück in den Tunnel und darüber wieder zurück ins Internet routet.

Benutzeravatar
cosinus
Beiträge: 4202
Registriert: 08.02.2016 13:44:11
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Bremen

Re: CGNAT umgehen mit Root-Server: Wie Absender-IP behalten bei eingehenden Requests?

Beitrag von cosinus » 04.12.2024 18:20:33

alex0801 hat geschrieben: ↑ zum Beitrag ↑
04.12.2024 08:21:36
@cosinus
Doch, aber eben nicht immer und überall. Gibt (leider) noch zahlreiche Internetanbindungen da draußen, die kein IPv6 anbieten oder eingerichtet haben.
Weiß ich - genau für den Fall könntest du doch dann über einen Tunnelbroker IPv6 bereitstellen oder ist das zu umständlich?
Alternative: Portmapper einrichten, damit wenn du unterwegs bist aber nur IPv4 hast, über eine Übersetzung in deinen per IPv6 bereitgestellten Server kommst -> https://www.datamate.org/aus-ipv4-in-ip ... lfunknetz/

Ist aber schon ne Frechheit wie das mit den Providern zusammenspielt. Die einen können kein echtes IPv4 mehr bereitstellen, die anderen whren sich mit Händen und Füßen gegen IPv6. :evil: Lese ich auch immer wieder bei heise. :x
Bei de ganzen anderen Überlegungen sieht man sehr deutlich, was uns die IPv6-Hater eingebrockt haben. Clientseite IPv4-Only, Gegenseite IPv6 aber nur CGNAT mit IPv4. Unfassbar dämlich. :facepalm:

alex0801
Beiträge: 208
Registriert: 16.10.2005 19:46:48
Wohnort: Rhein-Neckar-Kreis

Re: CGNAT umgehen mit Root-Server: Wie Absender-IP behalten bei eingehenden Requests?

Beitrag von alex0801 » 05.12.2024 08:19:12

@bluestar

Das mit dem markieren hab ich mir gestern schon angeschaut. Klingt logisch, aber irgendwie wollte es nicht funktionieren. Muss das nochmal in Angriff nehmen.

@cosinus

Ich könnte da ebenfalls im Strahl k*tzen. IPv6 würde das leben so viel einfacher machen.
Quasi jeder der sich irgendwo einwählt und IPv6 bekommt, bekommt eine 22 stellige Anzahl an IPv6 Adressen. Die Provider werfen ja gerade so um sich mit mit Adressen (wenn sie denn überhaupt IPv6 mitmachen). Aber auch dann: täglich wechselndes Prefix. WTF?!
Haben die alle denn den Schuss nicht gehört?
Okay, mit dynamischen IPv6 Adressen kann man ja recht bequem umgehen. Aber dieses CGNAT Thema... ist sowas von unnötig. Das gepaart mit einem "außer Haus" Internet-Anschluss der kein IPv6 kann... :evil:

Und dann die ganzen Firmen die IPv6 per-se nicht beachten. "Machen wir nicht, viel zu kompliziert". Aber dann mit DHCP Problemen und zu kleinen IPv4 Adresspools rumkotzen, das ganze NAT geraffel nicht auf die Reihe bekommen etc. etc. etc. pp.

Bei meinen drei letzten Arbeitgebern gab's einfach kein IPv6. Einfach überhaupt nicht. :evil: Wie kann man nur ...

Nun ja, danke für die Antworten. Die Sache mit dem "markieren" scheint die Lösung zu sein. Ich muss es nur noch in meiner Konstellation hinbekommen.

[update]
Sorry, vor lauter Rage modus" den portmapper ganz vergessen. Sieht interessant aus. Schau ich mir auch noch an. Könnte das leben durchaus auch vereinfachen und mein setup auf "ipv6 only" halten...

Benutzeravatar
bluestar
Beiträge: 2419
Registriert: 26.10.2004 11:16:34
Wohnort: Rhein-Main-Gebiet

Re: CGNAT umgehen mit Root-Server: Wie Absender-IP behalten bei eingehenden Requests?

Beitrag von bluestar » 05.12.2024 09:18:24

alex0801 hat geschrieben: ↑ zum Beitrag ↑
05.12.2024 08:19:12
Sorry, vor lauter Rage modus" den portmapper ganz vergessen. Sieht interessant aus.
Du könntest auf deinem Miet-Server auch einen eigenen Portmapper Dienst laufen lassen um, dann hast du das Ding unter deiner Kontrolle.

Benutzeravatar
cosinus
Beiträge: 4202
Registriert: 08.02.2016 13:44:11
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Bremen

Re: CGNAT umgehen mit Root-Server: Wie Absender-IP behalten bei eingehenden Requests?

Beitrag von cosinus » 05.12.2024 11:24:28

alex0801 hat geschrieben: ↑ zum Beitrag ↑
05.12.2024 08:19:12
Okay, mit dynamischen IPv6 Adressen kann man ja recht bequem umgehen. Aber dieses CGNAT Thema... ist sowas von unnötig. Das gepaart mit einem "außer Haus" Internet-Anschluss der kein IPv6 kann... :evil:
Die Provider sehen sich ja bestätigt, weil es viele Ewiggestrige gibt, die meinen wie unnötig IPv6 sei, was aber nur ne Ausrede ist. Ich glaube die haben einfach nur keine Lust sich mit IPv6 zu beschäftigen. Sieht man auch wunderschön regelmäßig bei heise.de :D

Antworten