Portforwardings Einrichten mit IP Tables

November 21, 2017 in hypervisor, linux ‐ 4 min read

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:

  • Die ziel IP Adresse ist die öffentliche IP Adresse unseres Servers: 73.97.113
  • Der Zielport ist der von uns definierte: 2080
  • Es wird ein bestimmtes Protokoll gesprochen sprechen: tcp

Außerdem wissen wir, dass das Datenpaket weitergeleitet werden sollen an:

  • Die IP Adresse des Webservers: 168.122.178
  • Den Port des Webservers: 443

image

In iptables nennen sich die Regelwerke, nach denen Datenpakete beurteilt werden „tables“. Das von uns verwende Regelwek namens „nat“ besteht aus drei Teilen:

  • PREROUTING: Betrachtet eingehende Pakete
  • OUTPUT: Betrachtet selbst erzeugte Pakete
  • POSTROUTING: Betrachtet ausgehende Pakete

Wir schreiben nun eine Regel nach der ein Datenpaket nach dem table „nat“ behandelt werden soll wenn es:

  • Eingehend ist (PREROUTING)
  • Vom Protokolltyp TCP
  • Als Zieladresse (Destination) unsere öffentliche IP (213.73.97.133)
  • und als Ziel-Port (Destination Port) 2080 anspricht

Wenn diese Kriterien erfüllt sind, soll:

  • zu dem Regelwerk DNAT gesprungen (-j, jump) werden
  • welches die Zieladresse des Datenpakets gegen 168.122.178
  • und den Zielport gegen 80 austauscht

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

image

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:

  • Wie wird verfahren, wenn eine Regel zutrifft die den Traffic erlaubt? –> Bei iptables: Erlaube den Traffic, ignoriere NICHT nachfolgende DENY Regeln.
  • Wie wird verfahren, wenn keine Regel zutrifft? –> Bei iptables: Verbiete den Traffic

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.

image

Cheers, Ori

Vielen Dank an Fl@ und beegeees, die maßgeblich bei der Erstellung dieses Artikels mitgewirkt haben.