UDP Idle-timer für VoIP anpassen

Manche VoIP Provider verlangen auf den Firewalls, die den SIP Traffic routen, eine Anpassung des UDP Idle-timers.

Theoretisch gibt es im UDP (User Datagram Protocol) keine Sessions, da es sich um ein verbindungsloses Protokoll handelt. Der Absender eines UDP Pakets versendet dieses, ohne eine Rückmeldung über dessen Verbleib zu erhalten. Der Empfänger des Pakets wird dem Absender – im Gegensatz zu TCP – keine Empfangsbestätigung zukommen lassen.

Für Firewalls stellen diese “Stateless” Pakete eine Herausforderung dar. Die Firewall muss jedes einzelne UDP Paket, welches auf einem Port eingeht, gegen die Firewall Policies prüfen und entsprechend weiterverarbeiten. Bei wenig Verkehr stellt dies kein Problem dar. Sobald die Anzahl Pakete jedoch ansteigt, steigt auch die CPU Auslastung der Firewall an. Denn nach wie vor muss für jedes Paket eine eigene Firewall-Entscheidung getroffen werden.

Die Firewall Hersteller haben sich für dieses Problem daher einen cleveren Workaround einfallen lassen. Die Pakete werden in logische “Sessions” zusammengefasst. Diese Sessions sind für die Ziel- und Quellhosts transparent. Die Firewall teilt alle eingehenden UDP Pakete mit übereinstimmenden Parametern (selber Quell- und Zielport sowie Quell- und Zielhost) in eine logische Session ein. Sessions müssen in der Regel nur einmal gegen die Firewall Policies geprüft werden, nämlich beim Aufbau der Session.

Dank dieser logischen Sessions, welche das FortiGate selbst erstellt, kann die CPU Auslastung durch UDP Pakete massiv minimiert werden. Und auch eine Auslagerung auf den NPU (Netzwerkprozessor) des FortiGates ist dank der Zugehörigkeit zu einer Session auf einmal möglich.

Im VoIP Umfeld kommen diese Mechanismen ebenfalls zum Einsatz. Dort kann ein Timeout, wie es bei TCP Sessions verwendet wird, aber negative Folgeerscheinungen verursachen. So können Gespräche mit längeren Pausen (vermitteln, weiterleiten, …) unterbrochen werden, weil die entsprechenden Pakete von der Firewall verworfen werden (Session nicht mehr vorhanden -> Antwort-Pakete von WAN nach LAN werden verworfen).

Um dies zu verhindern, kann der UDP Idle-timer erhöht werden. Dies geht auf dem FortiGate auf verschiedene Weisen. In den nachfolgenden Beispielen setzen wir den UDP Timeout auf 500 Sekunden:

  • Global
    • Betrifft ALLE UDP Sessions
    • Wie folgt zu konfigurieren:
       config system global
         set udp-idle-timer 500
       end
  • Pro Service Definition (Port/Portrange)
    • Betrifft nur die zur entsprechenden Policy passenden Sessions
    • Wie folgt zu konfigurieren:
      config firewall service custom
         edit "SIP_Port"
            set category "General"
            set protocol TCP/UDP/SCTP
            set visibility enable
            set udp-portrange 5060-5060
            set udp-idle-timer 500
         next
      end
    • Selbstverständlich sind Werte wie beispielsweise die UDP Ports den vom Provider vorgeschlagenen Werten an zu passen.
  • Pro Port
    • Betrifft alle Sessions über den entsprechenden Port
    • Wie folgt zu konfigurieren:
      config sys session-ttl
         config port
           edit 1
             set protocol 17
             set timeout 500
             set start-port 5060
             set end-port 5060
          next
        end
      end
    • Selbstverständlich sind Werte wie beispielsweise die UDP Ports den vom Provider vorgeschlagenen Werten an zu passen.

 

Auf Firewalls bevorzugen wir grundsätzlich immer die Konfiguration, welche weniger Angriffsfläche bietet. Daher ist die Version “pro Service Definition” oder “pro Port” zu bevorzugen, da so nicht alle UDP Sessions von der Änderung betroffen sind.

Ein kurzes “Achtung” zur folgenden Prozedur: Das Löschen der Sessions kann bestehende Verbindungen unterbrechen und daher zu kurzfristigen Unterbrüchen führen!

Nachdem die betroffenen Sessions mit den Befehlen

diagnose sys session filter clear
diagnose sys session filter proto 17
diagnose sys session filter port 5060
diagnose sys session clear

gelöscht wurden, können wir in der Session Table sehen, dass die neue Idle-timer Einstellung übernommen wurde.

Die Session-Tabelle kann mit dem Befehl

diagnose sys session list

ausgegeben werden. In der Ausgabe ist der neue Wert unter dem Parameter leider nicht wie zu erwarten “timeout” zu finden. Dieser Wert kann nur als Annäherungswert aus dem “expire” Wert ermittelt werden:

session info: proto=17 proto_state=01 duration=2 expire=498 timeout=0 flags=00000000 sockflag=00000000 sockport=0 av_idx=0 use=3

Der Standardwert des globalen udp-idle-timers ist übrigens 180 Sekunden. Der Standardwert für den Timer in der Service Definition ist 0, was den Wert des globalen Timers übernimmt.

0 Responses to “UDP Idle-timer für VoIP anpassen”


  • No Comments

Leave a Reply