iptables NAT Konfiguration, fehlt sourceNAT?

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.552
Hi,

ich habe einen Router, im localen Netz (192.168.5.x) einen Heimserver und auf dem Server mehrere VMs (über kvm) in einem internen Netz (192.168.122.x).

Nun möchte ich eine VM (192.168.122.153) über openVPN per NAT erreichen können. Dazu habe ich folgende iptables Regeln aufgestellt:
Code:
iptables -A PREROUTING -t nat -p udp -m udp --dport 25908 -j DNAT --to 192.168.122.153:25908
iptables -I FORWARD -p udp -m udp -s 192.168.5.0/24 -d 192.168.122.153 --dport 25908 -j ACCEPT
iptables -I FORWARD -p udp -m udp -s 10.135.28.0/24 -d 192.168.122.153 --dport 25908 -j ACCEPT
iptables -A PREROUTING -t nat -p udp -m udp --dport 26908 -j DNAT --to 192.168.122.153:26908
iptables -I FORWARD -p udp -m udp -s 192.168.5.0/24 -d 192.168.122.153 --dport 26908 -j ACCEPT
iptables -I FORWARD -p udp -m udp -s 10.135.28.0/24 -d 192.168.122.153 --dport 26908 -j ACCEPT

Normalerweise gehe ich mit dem PC über ein tap interface rein, für mein Handy brauche ich allerdings das tun interface und komme dann ins netz 10.135.28.x

Von meinem PC im lokalen Netz (192.168.5.3) klappt beides, per tun und per tap, wenn ich mich über lokal anmelde. Von außerhalb über dynDNS komme ich jedoch nicht rein. Im Router stehen die netsprechenden PortForward Regeln, damit anfragen auf port 25908 an mein Server weitergereicht werden, der dann nach oben stehenden NAT Regeln an die VM weiterreichen soll.

Ich kenne mich mit NAT leider noch nicht so aus, denke jedoch, dass es daran liegen muss. Kann ich sein das noch eine sourceNAT Regel rein muss? Wie müsste die heißen? destinationNAT kann ich mir vorstellen, alle Pakete an der Server, mit dem Zielport 25908 werden so modifiziert, dass die Zieladresse in die der VM umgeschrieben wird. Aber destinationNAT kann ich nicht mehr durchsteigen. Von den Paketen die zurückkommen weiß ich doch weder den Ursprungsport , noch den Zielport noch die Zieladresse. Wie kann ich die also in meiner Regel identifizieren?

Vielen Dank für eure Hilfe
 
SourceNAT brauchst du dann, wenn der Rückweg mit der ursprünglichen Quell-IP nicht klappen würde.

Beispiel:

Laptop hat die 192.168.5.123 und will zu computerbase.de. Die Pakete gehen zum Router und wenn er sie einfach so weiterschickt, bekommt computerbase Pakete mit Quelle 192.168.5.123. Das ist eine private IP und comouterbase kann nicht antworten. Daher macht der Router ein SNAT bzw masquerade und computerbase antwortet dem Router im WAN statt dem Laptop im LAN.

Auf deine Situation übertragen heißt das: Kennt die VM einen Rückweg ins 192.168.5.0 bzw. 10.135.38.0 ? Entweder per statischer Route oder per Default Gateway?

Wo genau läuft denn dein VPN überhaupt? In der VM, in einer anderen VM, auf dem Host oder auf einem anderen PC?
 
Danke für den Artikel, jetzt klappts. Ein paar Anmerkungen, falls noch mal jemand auf den Thread stößt:

Noch mal kurz zur Konfiguration:
Ich habe einen Server im internen Netz. Der ist hinter dem Router und von allen LAN Teilnehmern zu erreichen. Auf dem Server läuft die VM in einem separaten (virtuellen) Netzwerk. Gateway der VM ist der Server. Auf der VM läuft der openVPN Server

Hier die funktionierenden Regeln:
Code:
iptables -A PREROUTING -t nat -p tcp -m tcp --dport 25894 -j DNAT --to 192.168.122.153:22
iptables -I FORWARD -p tcp -m tcp -s 192.168.5.0/24 -d 192.168.122.153 --dport 22 -j ACCEPT
iptables -A PREROUTING -t nat -p udp -m udp --dport 25908 -j DNAT --to 192.168.122.153:25908
iptables -I FORWARD -p udp -m udp -m multiport -s 0.0.0.0/0 -d 192.168.122.153 --dports 25908,26908 -j ACCEPT
iptables -A PREROUTING -t nat -p udp -m udp --dport 26908 -j DNAT --to 192.168.122.153:26908

Erläuterung:

Die Regeln für das Netz auf tun0 '10.135.28.0/24' habe ich rausgenommen. Der TUN-Device wird ja geroutet und befindet sich im OSI Modell auf der Schicht 3 und damit eine Stufe über dem TAP-Device. Die Pakete passieren also gar nicht als '10.135.28.0/24' den Server sondern mit adressen im Netz '192.168.5.0/24' und '192.168.122.0/24' in meinem Fall.

Weiterhin trifft die filter Regel (FORWARD) mit 0.0.0.0/0 jetzt auf alle Quell-Adressen zu. Zuvor wurden Verbindungen von extern geblockt, da die Filterregel wie oben angegeben nur auf das lokale LAN zutraf.

Zu guter letzt noch ein Wort zum SourceNAT. Wie 'Raijin' geschrieben hat oder wie es auch im Artikel steht, ist SNAT nur notwendig, wenn der Rückweg sonst nicht klappt. Am bekanntesten ist das Problem der PCs hinter einem Router, die sich eine öffentliche IP teilen. Dank SNAT finden die Pakete zum Router zurück und versuchen nicht die unerreichbare lokale IP zu finden.
Mein Denkfehler bestand darin, dass ich mit DNAT die Ziel-Adresse jeweils verändere, die Quelle jedoch unberührt lasse. D.h. die Quell-Adresse entspricht der Adresse meines DynDNS Anbieters und ist damit weder in meinem lokalen Netz noch im Netz der VMs. Trotzdem ist jedoch die Route ohne NAT erreichbar, da die VM als Standard-Gateway meinen Server und der Server als Standard-Gateway meinen Router eingetragen hat. Vom Router sind die externen IPs dann erreichbar.

Vielen Dank für eure Hilfe
 
Zurück
Oben