Portweiterleitung

Für NAT, Packetfilter, Portweiterleitungen und Packet-Manipulationen aller Art ist netfilter zuständig. Netfilter ist eine Komponente des Linux Kernels.

Konfiguriert wird Netfilter grundsätzlich und ausschließlich mit Hilfe der dafür vorgesehenen user space-Programme. Sie könne nur mit root-Rechten ausgeführt werden:

Konfiguration

Die Syntax der obigen Kommandozeilenprogramme (außer nftables) sieht wie folgt aus:

Portweiterleitung

Zuerst einmal sollte man Sicherstellen, dass die Pakete durchgelassen werden:

   1 # iptables -A FORWARD -j ACCEPT -p udp --dport 12345 --sport 1024:65535 -d 192.168.142.42 -m state --state NEW
   2 # iptables -A FORWARD -j ACCEPT -p tcp --dport 12345 --sport 1024:65535 -d 192.168.142.42 -m state --state NEW
   3 

Die Pakete DNAT-en, damit sie weitergeleitet (geroutet) werden:

   1 # iptables -t nat -A PREROUTING -i pppoe_dsl -p udp --dport 12345 -j DNAT --to-destination 192.168.142.42:12345
   2 # iptables -t nat -A PREROUTING -i pppoe_dsl -p tcp --dport 12345 -j DNAT --to-destination 192.168.142.42:12345
   3 

Script

Um obige Zeilen nicht nach jedem Neustart eintippen zu müssen, bietet es sich an, sie in ein Shell Skript zu packen bzw. sie in das vorhandene Shell Skript für die Netfilter-Konfiguration einzubauen. Doch diesmal mit Variablen:

   1 #!/bin/bash
   2 
   3 IPT=/sbin/iptables
   4 IF_DSL=pppoe_dsl
   5 IP_USER_1=192.168.142.42
   6 PORT_1=12345
   7 
   8 $IPT -A FORWARD -j ACCEPT -p udp --dport $PORT_1 --sport 1024:65535 -d $IP_USER_1 -m state --state NEW
   9 $IPT -A FORWARD -j ACCEPT -p tcp --dport $PORT_1 --sport 1024:65535 -d $IP_USER_1 -m state --state NEW
  10 
  11 $IPT -t nat -A PREROUTING -i $IF_DSL -p udp --dport $PORT_1 -j DNAT --to-destination ${IP_USER_1}:${PORT_1}
  12 $IPT -t nat -A PREROUTING -i $IF_DSL -p tcp --dport $PORT_1 -j DNAT --to-destination ${IP_USER_1}:${PORT_1}

Allerdings ist es dringend Angeraten, lediglich ein Shell-Skript für die Komplette Netfilter-Konfiguration anzulegen, da man ansonsten leicht Fehler macht, denn die Reihenfolge, in welcher iptables aufgerufen wird, ist ausschlaggebend.

Anmerkung: Wenn man zur Bearbeitung seiner Firewall-Shell-Skripte vim benutzt, so sollte man sich dafür unbedingt iptables-save/restore syntax highlighter installieren, die Dinge werden so übersichtlicher und es Hilft Schreibfehler zu vermeiden.

Source NAT / Masquerading

Vor allem bei TCP-Verbindungen ist es für den Client wichtig, dass die Antworten von dem Server kommen, an den auch die Anfrage gestellt wurde. Fungiert das System, auf dem die Portweiterleitung eingerichtet wird, also nicht auch gleichzeitig als Gateway für den Zielserver (inkl. eingerichtetem Masquerading), muss man auch die Quelladresse umschreiben. Dafür gibt es 2 Möglichkeiten: SNAT oder MASQUERADING. Im Beispiel wird angenommen, dass das System die Adresse 192.168.142.100 in dem Netz besitzt, und selbiges Netz am Interface eth0 anliegt.

SNAT

Bei SNAT wird genau für diesen Anwendungszweck eine Umschreibung vorgenommen:

   1 # iptables -t nat -A POSTROUTING  -o eth0 -d 192.168.142.42 -p tcp --dport 12345 -j SNAT --to-source 192.168.142.100
   2 

MASQUERADING

Masquerading wird üblicherweise für das gesamte Netz gemacht, das heißt jede Verbindung wird maskiert:

   1 # iptables -t nat -A POSTROUTING  -o eth0 -j MASQUERADING
   2 

Das Weiterleiten von Ports auf link-lokale Adressen ist erst seit Kernelversionen >= 3.6 möglich. Wer einen Distributionskern verwendet, kann diese Feature also erst ab Debian Jessie verwenden. Standardmäßig ist die Funktion deaktiviert; so kann sie aktiviert werden:

   1 # sysctl -w net.ipv4.conf.all.route_localnet=1
   2 

In diesem speziellen Fall ist es nicht notwendig im Kernel IP-Forwarding zu aktivieren.