tcp keepalives und timeouts

Von | 3. Dezember 2009

Nachdem ich mit einer kommerziellen bei Idle-Verbindungen immer rausgeflogen bin habe ich mir das Thema mal auf Linux Büchsen genauer angesehen. Es gibt zwei wichtige Schrauben:

  1. /proc/sys/net/ipv4/tcp_keepalive*
    Über die 3 Kernel Parameter tcp_keepalive_time, tcp_keepalive_intvl, tcp_keepalive_probes kann man dem Kernel mit geben wie häufig er Keepalive Pakete verschickt. Das hilft, wenn man zwischen Client und Server eben solch kommerziellen Firewalls hat, die eine idlen Verbindung sehr schnell trennen. Details dazu hier.
  2. /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_*
    Über diese Kernel Parameter regelt man auf Linux Firewalls selbst wie hoch die entsprechenden Timeouts sind. Am wichtigsten ist hier wohl der Parameter ip_conntrack_tcp_timeout_establishe, welcher per Default auf 432000 Sekunden (=5 Tage) steht. D.h. Linux-Firewalls würden per Default erst nach 5 Tagen idle Verbindungen trennen. Speziell auf Firewalls mit viel Traffic kann es schon mal vernünftig sein, den Wert zu verkleinern. Bei der kommerziellen Firewall, die mich genervt hatte, waren 30 Minuten eingestellt. Ein zu hoher Wert kann im schlimmsten Fall dafür sorgen, dass die Conntrack Tabelle voll läuft und man eine Meldung wie diese bekommt:

    Nov 20 12:43:24 hostname kernel: ip_conntrack: table full, dropping packet.
    

    Nicht schön!

    Die Anzahl der aktuell aktiven und inaktiven TCP Verbindungen kann man übrigens ganz leicht per snmp abfragen. Die beiden OIDs sind .1.3.6.1.2.1.6.5.0 für aktive und .1.3.6.1.2.1.6.6.0 für passive (das kann OpenNMS von Haus auf). Direkt am System geht es gesamt mit:

    [root@host]# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
    10333
    

    Bei der Unterscheidung zwischen den einzelnen Stati hilft grep, awk, sort … 🙂

PS: Wie die Parameter über den Reboot hin rettet erklärt man sysctl bzw. man sysctl.conf

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.