Besonderheiten des Linux-Kernels
Der Linux-Kernel bietet viele Einstellmöglichkeiten über das proc
Dateisystem.
Dieses spezielle Dateisystem, das im Verzeichnisbaum unter /proc
eingehängt ist, enthält Pseudo-Dateien, aus denen Kernelparameter
ausgelesen werden können.
Durch Schreiben in diese Dateien kann ich die Kernelparameter setzen.
Die für das Netzwerk und damit für Paketfilter und Firewalls interessanten Parameter sind im Verzeichnis /proc/sys/net/ zu finden.
Ich kann diese Parameter mit cat oder less auslesen und mit
echo $wert > /proc/sys/net/$parameter setzen.
Einfacher geht das jedoch mit dem Programm sysctl, dem ich den Namen des
Parameters und den Wert in der Kommandozeile oder in der
Datei /etc/sysctl.conf mitgeben kann.
Dabei gilt die Besonderheit beim Namen des Parameters, dass dieser dem
Pfadnamen der Datei unterhalb von /proc/sys/ entspricht,
wobei statt der ‘/’ im Dateisystem ‘.’ im Namen des Parameters gesetzt wird.
So entspricht die Datei /proc/sys/net/ipv4/ip_forward dem Parameter
net.ipv4.ip_forward in der Kommandozeile von sysctl beziehungsweise in
der Datei /etc/sysctl.conf.
Die Dokumentation zu den Variablen findet sich bei den Linux Kernelquellen im Verzeichnis Documentation. Die für das Netzwerk und Paketfilter wichtigen Parameter sind dort in der Datei sysctl/net.txt sowie in den Dateien im Verzeichnis networking beschrieben.
Damit genug der Vorrede, kommen wir zu den für Paketfilter interessanten Variablen.
- net.core.bpf_jit_enable
- Für die Architektur x86_64 gibt es ein Framework, das die Paketfilterung beschleunigen kann. Dieses wird mit diesem Parameter aktiviert.
- net.ipv4.ip_forward
- Diese Variable entscheidet, ob eine Maschine mit mehreren Netzwerkschnittstellen als Router arbeitet und Pakete zwischen den Schnittstellen weiterleitet. In Skripts setzt man diesen Parameter oft auf 0, bevor die Regeln des Paketfilters gesetzt werden und aktiviert die Weiterleitung mit einem von 0 verschiedenen Wert nach dem Setzen der Regeln.
- net.ipv4.ipfrag_ *
- Diese Gruppe von Variablen steuert das Zusammensetzen von IP-Fragmenten. Will ich auf dem Paketfilter ankommende Fragmente zusammensetzen, muss ich diese Variablen näher anschauen.
- net.ipv4.tcp_mtu_probing
- Damit kann ich Path-MTU-Probing, wie in RFC 4821 beschrieben, für TCP einstellen. Drei Werte sind möglich: 0 deaktiviert PMTU-Probing, 1 aktiviert es, wenn ein ICMP-Blackhole entdeckt wird und 2 aktiviert es ständig und nutzt die MSS von net.ipv4.tcp_bas_mss.
- net.ipv4.icmp_echo_ignore_all
- Wenn diese Option ungleich 0 gesetzt ist, ignoriert der Kernel alle ICMP-Echo-Requests, die an ihn gerichtet sind.
- net.ipv4.icmp_echo_ignore_broadcasts
- Wenn diese Option ungleich 0 gesetzt ist, ignoriert der Kernel alle ICMP-Echo-Requests, die ihn via Multicast oder Broadcast erreichen.
- net.ipv4.icmp_errors_use_inbound_ifaddr
- Ist diese Option auf 0 gesetzt, sendet ein Router ICMP-Fehlermeldungen mit der primären Adresse der abgehenden Schnittstelle. Mit dem Wert 1 nimmt er die primäre Adresse der Schnittstelle auf der das Paket ankam, welches den Fehler verursacht hat.
- net.ipv4.icmp_ratelimit
- Diese Variable bestimmt die Rate, mit der bestimmte ICMP-Nachrichten gesendet werden. Der Wert gibt den minimalen Abstand in Millisekunden zwischen zwei ICMP-Nachrichten an, 0 bedeutet dementsprechend keine Beschränkung. Welche ICMP-Nachrichten limitiert werden, steht in der Variable net.ipv4.icmp_ratemask.
- net.ipv4.icmp_ratemask
- Diese Variable legt in einer Bitmap fest, welche ICMP-Nachrichten von der Beschränkung durch net.ipv4.icmp_ratelimit betroffen sind. Die Default-Bitmap ist 6168, bei der die Nachrichten “Destination Unreachable”, “Source Quench”, “Time Exceeded” und “Parameter Problem” beschränkt werden.
Unter /proc/sys/net/ipv4/conf/ gibt es die Unterverzeichnisse all und default sowie je ein Unterverzeichnis für jede Netzwerk-Schnittstelle. Darin werden Parameter gesetzt, die für alle Schnittstellen gelten (unter all), für einzelne Schnittstellen (unter den Schnittstellen-Verzeichnissen) oder für alle Schnittstellen, für die nichts explizit eingestellt ist (unter default). Nachfolgend nenne ich die Variablen unter net.ipv4.conf.default, die exemplarisch für die anderen Verzeichnisse gelten.
- net.ipv4.conf.default.accept_redirects
- Damit kann ich festlegen, ob der Rechner ICMP-Redirect-Nachrichten akzeptiert oder ignoriert. In den meisten Fällen sollten diese von Hosts akzeptiert und von Routern ignoriert werden.
- net.ipv4.conf.default.accept_source_route
- Diese Variable legt fest, ob Pakete mit Source-Route-Option akzeptiert oder ignoriert werden. Per Default werden diese von Routern akzeptiert und von Hosts ignoriert.
- net.ipv4.conf.default.arp_accept
- Diese Variable steuert das Verhalten bei Gratuitous-ARP-Paketen, konkret für IP-Adressen, die noch nicht in der ARP-Tabelle sind. Mit dem Wert 0 werden keine neuen Einträge erzeugt, mit dem Wert 1 wird die ARP-Tabelle sowohl für ARP-Requests als auch für ARP-Replies aktualisiert.
- net.ipv4.conf.default.forwarding
- Aktiviert die Weiterleitung von Datagrammen für die betreffende Schnittstelle.
- net.ipv4.conf.default.log_martians
- Ein Wert ungleich 0 aktiviert die Protokollierung von IP-Paketen mit nichtroutbarer Absenderadresse.
- net.ipv4.conf.default.rp_filter
- Dieser Integerwert steuert die Reverse-Path-Validierung entsprechend RFC 3704. Mit Wert 0 wird die Absenderadresse eines Datagramms nicht validiert. Der Wert 1 entspricht der Strict Mode nach RFC 3704: wenn die ankommende Schnittstelle nicht die beste Route zur Absenderadresse hat, wird das Datagramm verworfen. Der Wert 2 entspricht der Loose Mode nach RFC 3704: nur wenn es überhaupt keine Route zurück zur Absenderadresse gibt, wird das Datagramm verworfen. Loose Mode empfiehlt sich bei asymmetrischem Routing.
Für IPv6 gilt das gleiche, wie für IPv4: die Dateien und Verzeichnisse unter /proc/sys/net/ipv6/conf erlauben Einstellungen für einzelne oder alle Schnittstellen.
- net.ipv6.conf.default.disable_ipv6
- Damit kann ich IPv6 selektiv an einzelnen Schnittstellen abschalten.
- net.ipv6.conf.default.forwarding
- Auch das Weiterleiten von Datagrammen kann ich für einzelne Schnittstellen an- oder abschalten.
- net.ipv6.conf.default.suppress_frag_ndisc
- Damit kann ich das Verhalten nach RFC 6980 steuern. Mit dem Defaultwert von 1 verwirft der Kernel fragmentierte Neighbor-Discovery-Datagramme, mit dem Wert 0 erlaubt er sie.
- net.ipv6.conf.default.use_tempaddr
- Mit dieser Variable kann ich die Privacy Extensions für IPv6 einschalten.
- net.ipv6.icmp.ratelimit
- Diese Variable bestimmt die Rate, mit der ICMPv6-Datagramme gesendet werden.