NAT Loopback / Hairpin Problem umgehen

jmar83

Member
Hallo zusammen

Aktuell habe ich das Problem dass mein ISP auf Glasfaser umgestellt hat, und das "Zugangsgerät" (Modem, Router, Access Point, Konverter nach DVB-C sowie analog-Telefonie) kann nur sehr begrenzt konfiguriert werden. Lokal komme ich gar nicht auf ein Web-GUI (kein einziger Port offen laut Port-Scan), jedoch kann ich über den Kunden-Account im öffentlichen Internet ein paar, allerdings sehr wenige, Einstellungen festlegen. (Z.B. den WLAN-Key)

Nun ist es auch so, dass dort "NAT Loopback" deaktiviert ist, und sich das nicht ändern lässt. Was heisst dass ich von Zuhause aus nicht auf die öffentliche IP-Adresse.

1. Der Glasfaser-Zugangsgerät hat die IP-Adressklasse 192.168.254.0/255.255.255.0
2. Dahinter ist mein bisheriger Router (Western Digital N750), den ich vorher (mit Kabel-Internetzugang übers Kabelmodem) eingesetzt habe. Dieser hat die IP-Adressklasse 192.168.1.0/255.255.255.0

Nun wurde mir vom ISP eine DMZ eingerichtet auf die IP 192.168.254.2. Deswegen habe ich auf den "WAN"-Ethernet-Port meines eigenen Routers die IP 192.168.254.2 statisch festgelegt. Was heisst dass ich dann sämtliche Port-Forwards am eigenen Router festlegen kann. Z.B. auf den Reverse Proxy, welcher auf dem Virtualisierungs-Hostsystem installiert ist, der Zugriffe nach Domain-Namen auflöst und dann an die ensprechende virt. Maschine weiterleitet - je nach Name halt. (Der Grund ist, weil ich nicht Port 80 für die eine, Port 81 für die Andere, sowie Port 82 für die dritte VM verwenden will!)

Also gibt es z.B. folgende Weiterleitungen

- Öffentliche Domain 1:80 -> 192.168.254.2 -DMZ-> 192.168.1.1 -Port Forward-> 192.168.1.21/VM Host/Reverse Proxy-> -Reverse Proxy-> 192.168.1.16 (Web Server 1)

- Öffentliche Domain 2:80 -> 192.168.254.2 -DMZ-> 192.168.1.1 -Port Forward-> 192.168.1.21/VM Host/Reverse Proxy-> 192.168.1.26 (Web Server 2)

- Alle Domains:3306 -> 192.168.254.2 -DMZ-> 192.168.1.1 -Port Forward-> 192.168.1.26 (MySQL)


Nun wurde mir zwar empfohlen, die öffentlichen Domain-Namen im privaten Subnetz zu den privaten, internen IPs aufzulösen. Allerdings will ich das nicht wirklich... habe ehrlich gesagt keine Lust, ständig ne VPN-, Tor- oder Handy-Internetverbindung aufzubauen um zu prüfen ob auf der öffentlichen IP x.x.x.x was läuft! (Daher bitte im bereits im Voraus, auf solche Ratschläge zu verzichten) Der weiteren zählt auch Google Analytics und statcounter.com mit, falls von einer fremden IP-Adressklasse (also nicht von meinem ISP) die Seite besucht wird. Dann wird wenigstens nicht mitgezählt, wenn ich am entwickeln und anschliessend am testen bin! Also solange ich zumindest zuhause bin! ;-)

Nun habe ich dazu folgenden Service unter /etc/init.d/fwrules mit bash-Skript "zusammengebastelt":

Code:
#!/bin/sh /etc/rc.common
# chkconfig: 5 9999 9999

START=9999
STOP=9999

start() {
set -x
rm /etc/init.d/public_ip.txt > /dev/null 2>&1
wget -qO- https://api.ipify.org > /etc/init.d/public_ip.txt
for IP in $(cat /etc/init.d/public_ip.txt);
do
  iptables -t nat -A PREROUTING -d $IP -m tcp -p tcp --dport 24 -j DNAT --to-destination 192.168.1.26:22;
  iptables -t nat -A PREROUTING -d $IP -m tcp -p tcp --dport 80 -j DNAT --to-destination 192.168.1.21:81;
  iptables -t nat -A PREROUTING -d $IP -m tcp -p tcp --dport 444 -j DNAT --to-destination 192.168.1.21:444;
  iptables -t nat -A PREROUTING -d $IP -m tcp -p tcp --dport 3306 -j DNAT --to-destination 192.168.1.26:3306;
  iptables -t nat -A PREROUTING -d $IP -m tcp -p tcp --dport 9000 -j DNAT --to-destination 192.168.1.21:9000;
  iptables -t nat -A PREROUTING -d $IP -m tcp -p tcp --dport 9001 -j DNAT --to-destination 192.168.1.21:9001;
  iptables -t nat -A PREROUTING -d $IP -m tcp -p tcp --dport 9002 -j DNAT --to-destination 192.168.1.21:9002;
  
  # POSTROUTING
  iptables -t nat -A POSTROUTING -d 192.168.254.2 -s 192.168.254.0/24 -j SNAT --to-source 192.168.1.1;
done
}

stop() {
  rm -f /etc/init.d/public_ip.txt > /dev/null 2>&1
  /etc/init.d/firewall stop
  /etc/init.d/firewall start
}

disable() {
  rm -f /etc/init.d/public_ip.txt > /dev/null 2>&1
  rm -f /etc/rc.d/K9999fwrules > /dev/null 2>&1
  rm -f /etc/rc.d/S9999fwrules > /dev/null 2>&1
  /etc/init.d/firewall stop
  /etc/init.d/firewall start
}

restart() {
  stop
  start
}

Ist das brauchbar so? Scheint zumindest zu funktionieren, allerdings bin ich ein wenig verunsichert über die Zeile unter "POSTROUTING"...

Hab ihr evtl. ein paar Tipps für mich? Bin mit der Sache ein wenig überfordert, diese iptables-Regeln habe ich irgendwo im Netz gefunden und mit curl das die öffentliche IP in eine Datei schreibt und einer for-Schleife welche diese wieder aus der Datei ausliest ausgestattet.

Gibt es irgendwelche Sicherheitsprobleme mit dieser Lösung?

Zusätzlich habe ich im Router-GUI (OpenWRT) die 3 Port Forwards noch "ganz normal" eingerichtet....

Meine Überlegung:

Code:
# iptables -t nat -A POSTROUTING -d 192.168.1.21 -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.1;
# iptables -t nat -A POSTROUTING -d 192.168.1.26 -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.1;
iptables -t nat -A POSTROUTING -d 192.168.254.2 -s 192.168.254.0/24 -j SNAT --to-source 192.168.1.1;
...statt dass ich 2 Einträge mache (wie auskommentiert), mache ich nur einen welcher auf den WAN-Port (DMZ) meines eigenen Routers zielt. Dort sind nämlich alle Ports (80,3306) auf EINER IP-Adresse.

Ist das korrekt so?

Der OpenWRT-Router mit 192.168.1.0/255.255.255.0 hat ja Zugriff darauf (also auf 192.168.254.0/255.255.255.0) da er sich "dahinter" befindet.

HTTPS über Port 444 (auch öffentlich 444) ist übrigens auch noch ein Thema...

Und Port 80 im öffentlichen Internet ist intern 81...
 
Top