Mittels Iptables Portforward zum Localhost

Vor ein paar Tagen kam ich auf die tolle Idee etwas mit den Iptables rumzuspielen. Dabei kam mir in den Kopf das ich doch von einem beliebigen Interface (z.b. eth0 oder tun0) auf das Loopback (lo) Interface ein Portforward aufsetzen könnte. Nach ein paar Tagen des Debuggings fiel die Lösung jedoch bescheiden aus.

Ich habe zwischen meinen Servern ein VPN Netz aufgebaut, damit diese besser untereinander kommunizieren können. Ich wollte nun vom tun0-Interface auf einen Port auf dem Localhost weiterleiten.

Nach dem Durchforsten einiger Tutorials und Büchern zum Thema Portforwarding, kam ich auf folgende Regeln:

sudo iptables -A PREROUTING -t nat -d 10.0.0.1 -p tcp --dport 50000 -j DNAT --to-destination 127.0.0.1:50001
sudo iptables -A FORWARD -p tcp -d 127.0.0.1 --dport 50001 -j ACCEPT 

Die erste Regel leitet alle Pakete mit dem Ziel 10.0.0.1:50000 nach 127.0.0.1:50001 um. Die zweite Regel lässt dann die Pakete mit dem Ziel 127.0.0.1:50001 durch.

Doch das wollte nicht ganz funktionieren. Nach einiger Zeit des Kopfzerbrechens fand ich dann auch eine Erklärung auf Stackoverflow (1. Antwort). Laut dem RFC 5735 darf bzw. kann kein Traffic nach 127.0.0.1 ge-DNAT-ed werden.

Die Lösung bestand dann darin, sich mittels

sudo apt-get install rinetd

rinetd zu installieren. Das Programm dient dann als kleiner Proxy zwischen 10.0.0.1 und 127.0.0.1. Dazu muss man einfach die entsprechenden Portweiterleitungen in die Konfigurationsdatei einfügen (/etc/rinetd.conf):

# bindadress    bindport  connectaddress  connectport
10.0.0.1    50000   127.0.0.1   50001 #Portforward

Danach muss man nur noch den Port 50000 mittels einer INPUT-Regel von außen zugänglich machen, und man hat sein Ziel erreicht.

~Sebastian