Dieser Artikel ist eine Anleitung wie man auf mit iptables eine Portweriterleitung einrichtet.
In unserem Fall wollen wir den Webserver einer virtuellen Maschine aus dem Internet erreichbar machen. Da wir im Regelfall nur eine oder wenige Öffentliche Adressen zur Verfügung haben bedienen wir uns dem sogenannten Natting oder Network Adress Translation.
Wir definieren, wie sich ein anfragender Client bei unserem Server zu melden hat, damit seine Datenpakete an den Webserver weitergeleitet werden. Das unter Linux hierfür verwendete Standardwerkzeug nennt sich iptables.
Iptables untersucht vom Server empfangene PI-Datenpakete und entscheidet anhand von einem komplexen Regelwerk, was mit Ihnen geschehen soll.
Bevor wir uns aber dem eigentlichem Thema widmen können, müssen wir dem Linux Kernel erstmal sagen, dass er IP Pakete weiterleiten darf. Hierzu öffnen wir die Datei /etc/sysctl.conf
und setzen folgenden Wert von 0 auf 1:
net.ipv4.ip_forward = 1
Anschließend starten wir den Dienst neu, damit die Änderung wirksam wird.
sudo service networking restart
NAT einrichten
Jeder Computer verfügt nach dem TCP/IP Standard über 65535 Ports auf denen er angesprochen werden kann. Die ersten 1024 sind nach IANA standardisiert und sollten nicht für NAT genutzt werden.
Die Standartports für Webserver sind 80 (http) und 443 (https)
Wir legen nun fest, auf welchem Port sich ein anfragender Client melden soll, damit seine Pakete an den virtuellen Webserver weitergeleitet werden. In diesem Beispiel für http Port 2080 und Https Port 20443.
Damit haben wir folgende Informationen über das eingehende Datenpaket des Clients:
Außerdem wissen wir, dass das Datenpaket weitergeleitet werden sollen an:
In iptables nennen sich die Regelwerke, nach denen Datenpakete beurteilt werden „tables“. Das von uns verwende Regelwek namens „nat“ besteht aus drei Teilen:
Wir schreiben nun eine Regel nach der ein Datenpaket nach dem table „nat“ behandelt werden soll wenn es:
Wenn diese Kriterien erfüllt sind, soll:
In der Syntax von iptables sieht das dann so aus:
sudo iptables -t nat -I PREROUTING -p tcp -d 213.73.97.133 --dport 2080 -j DNAT --to-destination 192.168.122.178:80
Komfortabler weise merkt sich der Server welche Anfragen er weitergeleitet hat und wir müssen keine Regeln für die Antworten des Webservers anlegen.
Das Selbe jetzt nochmal für Port 20443 auf 443:
sudo iptables -t nat -I PREROUTING -p tcp -d 213.73.97.133 --dport 20443 -j DNAT --to-destination 192.168.122.178:443
Wir können uns jetzt die Regeln nochmal ansehen.
sudo iptables -L -t nat --line-numbers
Firewallregel anlegen
Erstens: Firewallregeln werden von oben nach unten abgearbeitet. Zeitens: Wenn eine Regel zutrifft erlaubt sie den Traffic entweder, oder sie verbietet Ihn.
Es gibt bei der Arbeitsweise von Firewalls zwei wichtige Fragen die je nach Hersteller unterschiedlich beantwortet werden:
In iptables sind Firewallregeln in Chains unterteilt.
Je nachdem, welche Art von Datenverkehr betrachtet wird, greift eine andere Chain von Firewallregeln. Die für unsere Pakete greifende Chain ist FORWARD, da wir unsere Pakete weiterreichen (NAT).
Iptables verwirft wie bereits erwähnt den Traffic wenn keine Regel greift. Eine gute Gedankenstütze ist es sich eine unsichtbare „deny any:any“ Regel unter dem Regelwerk vorzustellen.
Wir müssen also eine Firewallregel anlegen, die explizit erlaubt, dass Pakete von dem Eingehenden Interface (in meinem Fall enp2s0) an das Netz 192.168.122.0/24 weitergeleitet werden dürfen.
Damit der Traffic nicht von einer nachfolgenden Regel geblockt wird, springen wir mit -j (jump) direkt in das Regelwerk ACCEPT, wenn die Regel zutrifft.
sudo iptables -i enp2s0 -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
Das können wir uns jetzt nochmal ansehen.
Cheers, Ori
Vielen Dank an Fl@ und beegeees, die maßgeblich bei der Erstellung dieses Artikels mitgewirkt haben.