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;
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
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
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