RSS-Feed anzeigen

jahlives

Firewall mit iptables (Teil 1)

Bewerten
iptables besteht aus sogenannten Tabellen, welche in definierten Reihenfolgen durchlaufen werden. Die wichtigste Tabelle ist FILTER, welche aus den folgenden drei Ketten (chains) besteht: INPUT, FORWARD und OUTPUT. Dabei hat wird jede Chain bei ganz genau definierten Paketen durchlaufen:

INPUT
Diese Chain ist für alle Pakete, welche nicht von der Maschine mit der Firewall kommen und für die Maschine der Firewall bestimmt sind

OUTPUT
Diese Chain ist für alle Pakete welche von der Maschine der Firewall kommen und für andere Ziele als die Maschine selber bestimmt sind

FORWARD
ist für Pakete welche nicht von der Firewall kommen und auch nicht für die Firewall bestimmt sind. Das sind also Pakete welche weitergeleitet werden. Damit ein System diese Weiterleitungen auch macht und diese Pakete nicht verwirft, muss man das forwarding auf dem TCP-Stack aktivieren
Code:
sysctl -w net.ipv4.ip_forward=1

Eine weitere sehr wichtige Tabelle ist die NAT-Tabelle mit den folgenden drei chains: PREROUTING, POSTROUTING und OUTPUT (bereits oben beschrieben):

PREROUTING

Diese Kette wird von jedem Paket noch vor der INPUT resp FORWARD Kette durchlaufen. Diese Kette braucht man vorallem, damit man die Ziele von Paketen ändern kann, ohne die Originalinformation des Pakets zu verlieren. Typischer Einsatz dieser Kette z.B. bei Portweiterleitungen.

POSTROUTING
Diese Kette wird als letztes durchlaufen, bevor die Pakete die Firewall effektiv verlassen. Ein typischer Einsatzzweck für diese Kette ist das sogenannte NAT. Dabei wird bei Paketen, die aus dem LAN nach draussen gehen, die Absenderadresse ersetzt.


Es gibt noch einige weitere Tabellen wovon ich die zwei wichtigsten noch erwähnen möchte. Sie werden zwar realtiv selten verwendet, sind aber nichtsdestotrotz sehr mächtig:

MANGLE
Diese Tabelle dient dazu Eigenschaften von Paketen zu verändern. Sie bietet folgende Ketten: INPUT, OUTPUT, FORWARD, PREROUTING und POSTROUTING. Also die Tabelle mit den meisten Ketten. Je nach Kernel kann man unterschiedliche Eigenschaften manipulieren z.B. TTL, ECN oder CLASSIFY (QoS) oder man kann Pakete für die Firewall markieren MARK.

RAW
Diese Tabelle wird von jedem Paket als allererstes durchlaufen. Sie bietet PREROUTING und OUTPUT als Ketten. Kommt das Paket von aussen geht es zuerst durch RAW-PREROUTING, wenn es lokal erzeugt wurde zuerst RAW-OUTPUT. Diese Tabelle kommt zum Zug bevor das connection tracking des Kernels die Verbindung erfasst hat d.h. man kann Pakete in dieser Tabelle vom connection tracking ausnehmen durch NOTRACK. Solche NOTRACK-Pakete können dann aber nicht mehr genatted werden.
Eine weitere wichtige Eigenschaft von RAW ist es Pakete "verfolgen" zu können durch TRACE d.h. Pakete können bei ihrem Weg durch die Firewall verfolgt werden und man kann in den Logs ermitteln welche Regel auf dieses Pakete zugetroffen hat

Der typische Weg für ein Paket ist also: PREROUTING -> INPUT oder FORWARD -> OUTPUT oder FORWARD --> POSTROUTING (RAW und MANGLE lassen wir der Einfachheit halber beiseite)

Das Kommando für die Firewall heisst iptables. Damit kann man die Regeln in den Ketten erstellen oder löschen. Eine weitere wichtige Aufgabe des Kommandos ist es die Regeln auf einen Schlag zu löschen oder die default policy einer Kette festzulegen.
Code:
iptables -P KETTE DROP
obiges legt für KETTE als default policy DROP (verwerfen fest) d.h. wenn ein Paket keine Regel der Kette matched wird es verworfen
Seid sehr vorsichtig wenn ihr eine default policy (DROP) setzt. Mindestens den ssh Zugang für den aktuellen admin PC muss man offen lassen, sonst hat man sich ausgesperrt und kommt nur noch mit einem Reset wieder rein!!
Macht also eine default policy DROP erst wenn ihr die Firewall geprüft habt und sicher seid, dass eurer SSH Zugang nicht unterbunden wird!!!
Code:
iptables -F
obiges löscht alle Regeln der Filterketten INPUT, OUTPUT und FORWARD auf einen Schlag.
Wendet diesen Befehl NIEMALS an wenn ihr eine default policy DROP auf einer der Ketten habt. In diesem Fall würdet ihr euch sofort aussperren!! In dem Fall müsst ihr zuerst iptables -P KETTE ACCEPT machen, damit die default policy wieder auf accept steht. Danach könnt ihr alle Regeln wie oben gezeigt löschen.
Obiger Befehl löscht nur die Regeln der Filter Ketten. Wenn man auch alle Regeln der NAT Tabelle löschen will muss man zusätzlich noch folgendes machen
Code:
iptables -t nat -F


Im folgenden ein kurzes Setup für eine Firewall unter den folgenden Voraussetzungen:

  • das System hat mindestens 2 LAN Anschlüsse und ist an eth1 im LAN verbunden und an eth0 direkt am Internet. Das System ist also der Gateway des Netzwerks
  • LAN Subnetz 192.168.100.0/24 IP der Firewall 192.168.100.1 bzw externe IP 82.84.97.201
  • folgende Dienste erreichbar aus dem LAN: Samba
  • admin PC 192.168.100.15 soll im LAN alle Ports erreichen dürfen. Alle anderen nur Samba
  • folgende Dienste erreichbar aus dem WWW: SSH und Webserver (beide Dienste laufen lokal auf der Firewall)
  • Internettraffic der Clients soll nach aussen genattet werden
  • der Zugriff von aussen auf Port 23 (tcp) soll nach Port 1023 (tcp) auf der Firewall umgebogen werden. Für Clients aus dem LAN soll der Port nicht verändert werden


  1. lokales Interface von jeden Regeln aussnehmen
    Code:
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    man kann zwar auch das lo (localhost) mit Regeln belegen. Diese werden aber sehr schnell sehr komplex und das Risiko ist relativ gross, dass man zuviel verbietet und bestimmte Sachen dann nicht mehr gehen. Drum der Einfachheit halber lassen wir lo ohne Regeln und aktzeptieren alles auf diesem Interface
  2. Regel für admin PC
    Code:
    iptables -A INPUT -m state --state NEW -s 192.168.100.15/32 -j ACCEPT
    obiges legt für den admin PC fest, dass jede neue Verbindung (--state NEW) okay ist
  3. Samba Zugriff für den Rest des LANs
    Code:
    iptables -A INPUT -s 192.168.100.0/24 -m state --state NEW -p tcp -m multiport --dports 135,139,445 -j ACCEPT
    iptables -A INPUT -s 192.168.100.0/24 -m state --state NEW -p udp -m multiport --dports 137,138 -j ACCEPT
  4. Öffentlichen Zugriff (Webserver und SSH) erlauben
    Code:
    iptables -A INPUT ! -s 192.168.100.0/24 -m state --state NEW -p tcp -m multiport --dports 22,80 -j ACCEPT
    wenn die Source IP nicht aus dem LAN kommt, wird der Zugriff auf den Webserver (Port 80) und SSH (Port 22) erlaubt. Nur der admin PC (192.168.100.15) darf als einziger LAN Client auf diese beiden Ports zugreifen. Da die ACCEPT Regel für den admin PC in der INPUT-Kette weiter oben steht, wird sie zuerst abgehandelt und der Zugriff erlaubt. Die obige Regel wird also für den admin PC NIEMALS zur Anwendung kommen
  5. "Portumbiegung" für Port 23
    Code:
    iptables -t nat -A PREROUTING -p tcp --dport 23 ! -s 192.168.100.0/24 -j REDIRECT --to 1023
    #dann muss man diesen Port ebenfalls erlauben
    iptables -A INPUT -p tcp --dport 1023 ! -s 192.168.100.0/24 -j ACCEPT
    die erste Regel schreibt den öffentlichen Port 23 auf 1023 um, wenn es kein LAN-Client ist und die zweite Regel erlaubt den Zugriff auf diesem umgeleiteten Port wenn es kein LAN Client ist.
  6. NAT für LAN-Clients aktivieren
    Code:
    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source  82.84.97.201
    Pakete welche das System via Interface eth0 gegen aussen verlassen erhalten als Absender-IP 82.84.97.201. Damit ist sichergestellt, dass wir keine LAN-IPs (RFC1918) ins Internet schicken.
    Diese Regel hat den Nachteil, dass man die IP ändern muss, wenn sich die externe IP ändert. Wenn an eth0 direkt das Internet anliegt, dann kann man sich das auch folgendermassen flexibler gestalten
    Code:
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  7. Antwortpakete erlauben
    Code:
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    diese Regel wird gerne vergessen. Sie erlaubt den Eingang von Antwortpaketen und MUSS immer vorhanden sein. Synology hat diese Regel beim Release vom DSM 4 scheinbar vergessen
  8. Testen, testen und nochmals testen
    das ist etwas vom wichtigsten. Testet ob alle Zugriffe wie erwartet klappen v.a. dass der admin PC sauber zugreifen kann
    Code:
    iptables -L INPUT -nv
    beim obigen Kommando ist die erste Zeile der Antwort sehr wichtig
    Code:
    Chain INPUT (policy ACCEPT 178 packets, 21303 bytes)
    probiert die verschiedenen Zugriffe mit dem admin PC. Der Paketzähler darf dabei NICHT in die Höhe gehen (zumindest nicht durch den Zugriff des admin PCs). Der Paketzähler zählt wieviele Pakete keine passende Regel hatten und damit von der default policy verarbeitet werden.

    Kontrolliert auch den Zähler bei der Regel für den admin PC selber. Dieser Zähler MUSS hochgezählt werden bei jedem Zugriff des admin PCs, denn er zählt wie oft diese Regel zutraf. Erst wenn der erste Zähler nicht hochgeht beim admin Zugriff und der zweite JEDESMAL hochgeht beim admin, dann kann man eine default policy auf INPUT setzen
    Code:
    iptables -P INPUT DROP
    Seid wirklich sicher, dass ihr den Zugriff vom admin-PC sauber geprüft habt bevor ihr die default policy von INPUT auf DROP stellt. Drum testen, testen und nochmals testen!

Dieser Beitrag umfasst längst nicht alles was es zu tun gibt bei einer Firewall. Die FORWARD und die OUTPUT-Kette der FILTER-Tabelle habe ich hier weggelassen, wobei es gerade beim OUTPUT noch einiges zu tun gibt.
Kategorien
Linux

Kommentare