Kurzer Hinweis: Fast jedes Suchmaschinen-Ergebnis, welches man so findet, wenn man danach sucht, wie man “Firewalls” mit iptables baut, ist veraltet, was die Funktionalität von NAT-Helpern angeht.

Wir erinnern uns: NAT-Helper braucht man, um Protokolle mitzulesen, die Ports dynamisch aushandeln. Wenn man das richtig macht, dann kann man z.B. auch aktives FTP sehr einfach abhandeln:

1
2
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

Damit das funktioniert, muss man aber zwei Dinge beachten:

  1. Das entsprechende Helper-Modul, in unserem Fall nf_conntrack_ftp, muss geladen sein.
  2. Das Helper-Modul muss aktiviert sein.

Bis zu Kernel 3.5 (manchmal finde ich auch 4.7) wurde Punkt zwei automatisch erledigt. Allerdings ist das ein potenzielles Sicherheitsproblem, weswegen die Funktionalität per Default abgeschaltet wurde. Die empfohlene Lösung ist es, die entsprechenden Helper explizit an einen Port zu binden, in unserem Falle z.B.:

1
iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp

Wem Sicherheit egal ist, der kann das alte Verhalten auch einfach wieder herstellen:

1
sysctl net.netfilter.nf_conntrack_helper=1