Ich habe eine dieser günstigen NAT-VMs, bei denen von außen nur ein kleiner Portbereich (z.B. 13401-13422) von außen erreichbar ist. Nun möchte ich gerne für verschiedene Dinge die Server der VM (SSH + Proxy) über die "normalen" Ports 22 u. 80 aus meinem Heimnetz ansprechen. Dazu hatte ich die Idee, die Pakete mittels iptables auf meinem Router auf den passenden Port "hinzubiegen". Also wenn ich an meinem PC eine SSH-Verbindung zur VM an Port 22 aufbaue, sollte der Router per NAT die Pakete an die VM an Port 13422 (SSH-Port der VM) weiterleiten.
So viel zur Theorie. Ich nutze einen Router von Asus mit Asuswrt-Merlin [1]. Das ist eine leicht angepasste Firmware, die einem den Zugriff auf die Config verschiedener Dienste (z.B. Dnsmasq, Cron oder eben iptables) gibt. Mein erster Versuch war diese Regel hier (ausgeführt auf dem Router; 1.1.1.1 soll die IP der VM sein):
Code: Alles auswählen
iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp --destination-port 22 -j DNAT --to-destination 1.1.1.1:13422
Woran das lag ließ sich mittels Wireshark relativ schnell herausfinden: Der PC schickt zwar eine Anfrage zu Port 22 des Servers, bekommt aber keinerlei Antwort. (Kann aber eine Verbindung aufbauen, zumindest wird diese nicht abgelehnt). Als Filter bei Wireshark hatte ich "ssh" eingestellt.
Nun wollte ich zuerst testen, ob die Portänderung korrekt umgesetzt wird. Dank Wireshark, ssh + tcpdump lässt sich Verkehr vom Router ins Internet relativ leicht überwachen [2]. Zur Überraschung wurde der Port sogar korrekt geändert: in den Router ging das Paket mit dem Zielport 22, heraus kam es mit 13422. Außerdem kam eine Antwort des Servers am Router an, wurde aber nicht an den Client weitergegeben.
Daher war der erste Versuch folgender (auch auf dem Router, zusätzlich zur Regel oben):
Code: Alles auswählen
iptables -t nat -I POSTROUTING -d 1.1.1.1 -p tcp --dport 13722 -j MASQUERADE
Ich habe mir das Problem so erklärt: In der Antwort des Servers steht noch der (für den Client) falsche Port 13422. Also wollte ich ein Source-NAT machen:
Code: Alles auswählen
iptables -t nat -A POSTROUTING -s 1.1.1.1 -p tcp --source-port 13422 -j SNAT --to-source 1.1.1.1:22
Ich bin ehrlich gesagt ziemlich ratlos...
Hat jemand eine Idee, warum das nicht geht?
Schonmal vielen Dank!
----------------------------
[1] https://asuswrt.lostrealm.ca/
[2] http://serverfault.com/a/530020