<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>IRules on Barash Helvadzhaoglu</title><link>https://barashhelvadzhaoglu.com/de/tags/irules/</link><description>Recent content in IRules on Barash Helvadzhaoglu</description><generator>Hugo -- 0.160.1</generator><language>de</language><lastBuildDate>Wed, 08 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://barashhelvadzhaoglu.com/de/tags/irules/index.xml" rel="self" type="application/rss+xml"/><item><title>F5 LTM Deep Dive: Virtual Server, iRules, SSL Offloading &amp; HA</title><link>https://barashhelvadzhaoglu.com/de/technology/f5-ltm-deep-dive/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://barashhelvadzhaoglu.com/de/technology/f5-ltm-deep-dive/</guid><description>F5 BIG-IP LTM Deep Dive — Full-Proxy-Architektur, Virtual Server, Pool-Konfiguration, iRules, SSL Offloading und Zero-Downtime-Migration.</description><content:encoded><![CDATA[<h1 id="f5-ltm-deep-dive-virtual-server-irules-ssl-offloading--ha">F5 LTM Deep Dive: Virtual Server, iRules, SSL Offloading &amp; HA</h1>
<p>Dieser Artikel ist Teil der F5 BIG-IP-Serie.</p>
<blockquote>
<p><strong>Neu bei F5?</strong> Beginnen Sie zuerst mit der Plattformübersicht: <a href="/de/technology/f5-bigip-application-delivery-platform-overview/">F5 BIG-IP ist kein Load Balancer — Es ist eine Application Delivery Platform</a></p>
</blockquote>
<p>Wenn Sie das Gesamtbild bereits kennen und tief in LTM eintauchen möchten — Konfiguration, iRules, Migrations-Praxisnotizen — sind Sie hier richtig.</p>
<hr>
<h2 id="die-full-proxy-architektur-warum-sie-alles-verändert">Die Full-Proxy-Architektur: Warum sie alles verändert</h2>
<p>Das Wichtigste an LTM ist, dass es ein <strong>Full-Proxy</strong> ist. Das ist kein Marketingbegriff — er hat direkte betriebliche Konsequenzen, die LTM von jedem einfacheren Load Balancer unterscheidet.</p>
<p>Wenn ein Client durch F5 LTM verbindet, gibt es zwei vollständig separate TCP-Verbindungen:</p>
<pre tabindex="0"><code>Client ──[TCP-Verbindung 1]──→ F5 LTM ──[TCP-Verbindung 2]──→ Backend-Server
         (Virtual Server IP)             (Pool Member IP)
</code></pre><p>F5 beendet die Client-Verbindung vollständig, inspiziert sie, trifft alle Routing- und Policy-Entscheidungen und öffnet dann eine neue Verbindung zum Backend. Client und Backend-Server kommunizieren niemals direkt.</p>
<p>Dies gibt LTM Fähigkeiten, die Pass-Through Load Balancer nicht bieten können:</p>
<ul>
<li>Vollständige Sichtbarkeit auf jedes Byte von Anfrage und Antwort</li>
<li>Möglichkeit, jeden Teil des Datenverkehrs neu zu schreiben — Header, URIs, Cookies, Antwort-Bodies</li>
<li>SSL-Terminierung im Namen der Backends — Backends sehen unverschlüsseltes HTTP</li>
<li>Unabhängige TCP-Anpassung für client- und serverseitige Verbindungen</li>
<li>Verbindungsmultiplexing und HTTP-Pipelining-Optimierungen</li>
</ul>
<p>In der Praxis bedeutet die Full-Proxy-Position, dass Probleme upstream (clientseitig) und downstream (serverseitig) vollständig isoliert sind. Dies vereinfacht die Fehlerbehebung bei Produktionsvorfällen erheblich.</p>
<hr>
<h2 id="virtual-server-der-einstiegspunkt">Virtual Server: Der Einstiegspunkt</h2>
<p>Ein <strong>Virtual Server</strong> ist die IP-Adresse und Port-Kombination, zu der Clients verbinden. Es ist das primäre Objekt in LTM und der Container für alle Traffic-Policies:</p>
<pre tabindex="0"><code>Virtual Server: vs_webapp_443
  Ziel-IP:              10.10.1.100
  Port:                 443
  Protokoll:            TCP
  HTTP-Profil:          http_profile_xforward
  SSL-Client-Profil:    clientssl_webapp
  SSL-Server-Profil:    serverssl_backend
  Standard-Pool:        pool_webapp_8080
  Persistence:          cookie_persistence
  iRule:                /Common/rule_uri_routing
</code></pre><p><strong>Eine VIP, mehrere Anwendungen:</strong> Eine einzelne Virtual-Server-IP kann mehrere Anwendungen bedienen, indem iRules verwendet werden, um basierend auf dem HTTP-Host-Header oder URI-Pfad zu routen. Dies reduziert den IP-Verbrauch und vereinfacht Upstream-Firewall-Regeln.</p>
<p><strong>Virtual-Server-Status ist unabhängig von der Pool-Gesundheit:</strong> Wenn ein Virtual Server deaktiviert ist, erreicht kein Datenverkehr den Pool — unabhängig davon, ob Pool-Members gesund sind. Überwachen Sie die Virtual-Server-Verfügbarkeit immer separat von der Pool-Member-Verfügbarkeit.</p>
<p><strong>Drei Virtual-Server-Typen:</strong></p>
<ul>
<li><strong>Standard</strong> — Full Proxy, der häufigste Typ</li>
<li><strong>Performance Layer 4</strong> — umgeht den Proxy für Hochdurchsatz-Szenarien, bei denen L7-Inspektion nicht benötigt wird</li>
<li><strong>Forwarding</strong> — Pass-Through-Routing ohne Proxy-Verhalten, für transparente Deployments verwendet</li>
</ul>
<hr>
<h2 id="pools-und-load-balancing-methoden">Pools und Load-Balancing-Methoden</h2>
<p>Ein <strong>Pool</strong> ist die Gruppe der Backend-Server, auf die der Virtual Server den Datenverkehr verteilt:</p>
<pre tabindex="0"><code>Pool: pool_webapp_8080
  Load-Balancing-Methode: Least Connections (member)
  Slow Ramp Time:         30 Sekunden
  Monitor:                http_monitor_webapp
  Members:
    192.168.10.11:8080   Prioritätsgruppe: 1
    192.168.10.12:8080   Prioritätsgruppe: 1
    192.168.10.13:8080   Prioritätsgruppe: 2  ← Standby, aktiviert nur wenn Gruppe 1 ausfällt
</code></pre><p><strong>Load-Balancing-Methoden im Vergleich:</strong></p>
<ul>
<li><strong>Round Robin</strong> — sequenzielle Verteilung. Funktioniert für zustandslose, einheitliche Workloads. Schlechte Wahl, wenn Verbindungsdauern erheblich variieren.</li>
<li><strong>Least Connections (member)</strong> — sendet an das Member mit den wenigsten aktiven Verbindungen. Am besten für Anwendungen mit variablen Sitzungslängen. Standardwahl in den meisten Produktionsumgebungen.</li>
<li><strong>Least Connections (node)</strong> — zählt Verbindungen über alle Pools zu einer Server-IP, nicht nur in diesem Pool. Verwenden wenn ein Server in mehreren Pools teilnimmt.</li>
<li><strong>Ratio</strong> — gewichtete Verteilung. Member A erhält 3× mehr Verbindungen als Member B. Für Server mit unterschiedlichen Kapazitäten.</li>
<li><strong>Fastest</strong> — sendet an das zuletzt antwortende Member. Kann Hot Spots erzeugen; verwenden Sie stattdessen Observed für mehr Stabilität.</li>
</ul>
<p><strong>Slow Ramp Time</strong> wird zu wenig genutzt, ist aber wichtig. Wenn ein Pool-Member von einem Ausfall wiederhergestellt wird, ist es sofort verfügbar — aber möglicherweise noch nicht vollständig aufgewärmt (JVM, Caches, Datenbankverbindungspools). Slow Ramp Time erhöht das Gewicht eines neu verfügbaren Members schrittweise über die angegebenen Sekunden und verhindert, dass ein kalter Server sofort überflutet wird.</p>
<p><strong>Prioritätsgruppen</strong> ermöglichen aktive und Standby-Member-Sets innerhalb eines Pools. Gruppe-1-Members erhalten den gesamten Datenverkehr, solange sie über dem Schwellenwert für minimale aktive Members liegen. Gruppe-2-Members aktivieren automatisch, wenn Gruppe 1 unter den Schwellenwert fällt.</p>
<hr>
<h2 id="health-monitors-wichtiger-als-die-load-balancing-methode">Health Monitors: Wichtiger als die Load-Balancing-Methode</h2>
<p>Ein Pool-Member kann TCP-erreichbar und auf Anwendungsebene vollständig defekt sein. Ein Zahlungsverarbeitungsserver, der bei jeder Anfrage HTTP 500 zurückgibt, ist immer noch TCP-erreichbar — ein einfacher TCP-Monitor wird das Problem niemals erkennen.</p>
<p>Das ist das häufigste Ausfallszenario, das ich in Produktionsumgebungen gesehen habe, und der häufigste Ort, an dem Teams zu wenig investieren.</p>
<h3 id="tcp-monitor-notwendig-aber-unzureichend">TCP-Monitor: Notwendig, aber unzureichend</h3>
<pre tabindex="0"><code>Monitor: tcp_monitor_basic
  Typ:       TCP
  Interval:  5 Sekunden
  Timeout:   16 Sekunden
</code></pre><p>Erkennt: Netzwerkkonnektivitätsverlust, Server-Abstürze, Port nicht lauschend.</p>
<p>Erkennt nicht: Anwendungsfehler, Datenbankverbindungsfehler, Speichererschöpfung, teilweise initialisierte Anwendungszustände.</p>
<h3 id="http-monitor-der-produktionsstandard">HTTP-Monitor: Der Produktionsstandard</h3>
<pre tabindex="0"><code>Monitor: http_monitor_webapp
  Typ:            HTTP
  Send String:    GET /health HTTP/1.1\r\nHost: webapp.internal\r\nConnection: close\r\n\r\n
  Receive String: &#34;status&#34;:&#34;healthy&#34;
  Interval:       5 Sekunden
  Timeout:        16 Sekunden
</code></pre><p>LTM markiert das Member nur dann als UP, wenn der Antwort-Body die exakt erwartete Zeichenfolge enthält. Die Anwendung muss aktiv bestätigen, dass sie gesund ist — nicht nur, dass der Port offen ist.</p>
<p>Ein guter <code>/health</code>-Endpunkt prüft: Datenbankverbindung, Cache-Verfügbarkeit, Status wichtiger Abhängigkeiten und Speicherplatz falls relevant. Eine Anwendung, die HTTP 200 mit <code>{&quot;status&quot;:&quot;degraded&quot;}</code> zurückgibt, sollte die Monitor-Prüfung nicht bestehen.</p>
<h3 id="https-monitor-für-verschlüsselte-backends">HTTPS-Monitor für verschlüsselte Backends</h3>
<pre tabindex="0"><code>Monitor: https_monitor_webapp
  Typ:          HTTPS
  SSL-Profil:   serverssl_monitor (für selbstsignierte Zertifikate intern konfigurieren)
  Send String:  GET /health HTTP/1.1\r\nHost: webapp.internal\r\n\r\n
  Receive String: &#34;status&#34;:&#34;healthy&#34;
</code></pre><h3 id="die-timeout-formel">Die Timeout-Formel</h3>
<p>Eine häufige Fehlkonfiguration: Timeout ≤ Interval setzen. Die korrekte Formel:</p>
<pre tabindex="0"><code>Timeout = (Interval × Wiederholungen) + 1
</code></pre><p>Mit Interval=5 und 3 Wiederholungen: Timeout = 16. Dies gibt LTM Zeit für Wiederholungsversuche, bevor das Member als ausgefallen markiert wird, und vermeidet Falschpositive durch vorübergehende Netzwerkschwankungen.</p>
<hr>
<h2 id="ssl-offloading-und-ssl-bridging">SSL Offloading und SSL Bridging</h2>
<h3 id="ssl-offload-nur-client-ssl">SSL Offload (nur Client-SSL)</h3>
<pre tabindex="0"><code>Client ──(HTTPS/TLS 1.3)──→ F5 LTM ──(HTTP)──→ Backend
</code></pre><p>F5 beendet TLS vom Client und leitet unverschlüsseltes HTTP an Backends weiter. Maximale Backend-CPU-Einsparung. Erfordert ein <strong>Client-SSL-Profil</strong> auf dem Virtual Server:</p>
<pre tabindex="0"><code>Client-SSL-Profil: clientssl_webapp
  Zertifikat:  /Common/webapp_cert
  Schlüssel:   /Common/webapp_key
  Kette:       /Common/intermediate_ca
  Cipher:      TLSv1.2:TLSv1.3
  Optionen:    Kein TLSv1, Kein TLSv1.1
</code></pre><h3 id="ssl-bridging-client--server-ssl">SSL Bridging (Client + Server SSL)</h3>
<pre tabindex="0"><code>Client ──(HTTPS/TLS 1.3)──→ F5 LTM ──(HTTPS/TLS)──→ Backend
</code></pre><p>F5 entschlüsselt, inspiziert und verschlüsselt dann erneut für das Backend. Erforderlich in regulierten Umgebungen (Banking, Gesundheitswesen), wo Compliance Ende-zu-Ende-Verschlüsselung vorschreibt. Fügt etwas Latenz hinzu — zwei TLS-Handshakes pro Verbindung — bietet aber vollständige Compliance und Sichtbarkeit.</p>
<p>In der Banking-Umgebung liefen alle Produktions-Virtual-Server mit SSL Bridging. Jede Verbindung wurde entschlüsselt, vom WAF inspiziert und zum Backend neu verschlüsselt.</p>
<h3 id="zertifikatsverwaltung">Zertifikatsverwaltung</h3>
<p>Wichtige betriebliche Punkte:</p>
<ul>
<li>F5 warnt standardmäßig nicht, wenn Zertifikate dem Ablauf nähern. Externes Monitoring (SolarWinds, Zabbix) einrichten, um den Zertifikatsablauf auf Virtual Servern zu prüfen.</li>
<li>Zertifikatsaustausch erfolgt ohne Downtime: Zertifikatsobjekt aktualisieren, das Profil referenziert es automatisch.</li>
<li><strong>SNI</strong> ermöglicht es einer einzelnen VIP, mehrere Anwendungen mit unterschiedlichen Zertifikaten zu bedienen.</li>
</ul>
<hr>
<h2 id="session-persistence">Session Persistence</h2>
<h3 id="cookie-persistence-empfohlen">Cookie Persistence (Empfohlen)</h3>
<p>F5 fügt ein Cookie, das das Pool-Member identifiziert, in die HTTP-Antwort ein:</p>
<pre tabindex="0"><code>Persistence-Profil: cookie_persistence
  Methode:     Insert
  Cookie-Name: BIGipServer_webapp
  Ablauf:      Session
  Verschlüsseln: Aktiviert
</code></pre><p>Bei nachfolgenden Anfragen sendet der Browser dieses Cookie. F5 leitet unabhängig von der aktuellen Lastverteilung zum richtigen Member. Für die Anwendung transparent, funktioniert durch NAT, übersteht Client-IP-Änderungen.</p>
<h3 id="quelladress-persistence">Quelladress-Persistence</h3>
<p>Leitet gesamten Datenverkehr von derselben Client-IP zum selben Member:</p>
<pre tabindex="0"><code>Persistence-Profil: source_addr_persistence
  Timeout: 3600 Sekunden
</code></pre><p>Einfach, aber problematisch, wenn viele Benutzer eine NAT-IP teilen — alle Benutzer hinter demselben NAT treffen denselben Backend-Server und brechen die Lastverteilung.</p>
<h3 id="irule-basierte-universelle-persistence">iRule-basierte universelle Persistence</h3>
<p>Für benutzerdefinierte Sitzungsidentifikatoren (nicht-standardmäßige Cookies, URL-Parameter, benutzerdefinierte Header):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-tcl" data-lang="tcl"><span style="display:flex;"><span>when HTTP_REQUEST <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>  persist uie <span style="color:#66d9ef">[</span>HTTP<span style="color:#f92672">::</span>header <span style="color:#e6db74">&#34;X-Session-Token&#34;</span><span style="color:#66d9ef">]</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">}</span>
</span></span></code></pre></div><p>Persistiert basierend auf einem benutzerdefinierten Header-Wert — etwas, das kein Standardprofil unterstützt.</p>
<hr>
<h2 id="irules-die-programmierbare-traffic-schicht">iRules: Die programmierbare Traffic-Schicht</h2>
<p>iRules sind Tcl-basierte Skripte, die in der TMOS-Datenebene mit Leitungsgeschwindigkeit ausgeführt werden. Sie sind der leistungsstärkste LTM-Differenziator — Traffic-Logik, die sonst Anwendungscode-Änderungen erfordern würde.</p>
<h3 id="ereignismodell">Ereignismodell</h3>
<p>iRules werden bei Ereignissen im Traffic-Lebenszyklus ausgeführt:</p>
<ul>
<li><code>HTTP_REQUEST</code> — vollständige HTTP-Anfrage vom Client empfangen</li>
<li><code>HTTP_RESPONSE</code> — Antwort vom Backend empfangen</li>
<li><code>CLIENT_ACCEPTED</code> — TCP-Verbindung vom Client hergestellt</li>
<li><code>SERVER_CONNECTED</code> — F5 mit Backend verbunden</li>
<li><code>SSL_HANDSHAKE_START</code> — während der TLS-Verhandlung</li>
</ul>
<h3 id="produktions-irule-beispiele">Produktions-iRule-Beispiele</h3>
<p><strong>Client-IP-Weiterleitung an Backend:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-tcl" data-lang="tcl"><span style="display:flex;"><span>when HTTP_REQUEST <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>  HTTP<span style="color:#f92672">::</span>header insert <span style="color:#e6db74">&#34;X-Forwarded-For&#34;</span>   <span style="color:#66d9ef">[</span>IP<span style="color:#f92672">::</span>client_addr<span style="color:#66d9ef">]</span>
</span></span><span style="display:flex;"><span>  HTTP<span style="color:#f92672">::</span>header insert <span style="color:#e6db74">&#34;X-Real-IP&#34;</span>         <span style="color:#66d9ef">[</span>IP<span style="color:#f92672">::</span>client_addr<span style="color:#66d9ef">]</span>
</span></span><span style="display:flex;"><span>  HTTP<span style="color:#f92672">::</span>header insert <span style="color:#e6db74">&#34;X-Forwarded-Proto&#34;</span> <span style="color:#e6db74">&#34;https&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">}</span>
</span></span></code></pre></div><p><strong>URI-basiertes Pool-Routing:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-tcl" data-lang="tcl"><span style="display:flex;"><span>when HTTP_REQUEST <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">{</span> <span style="color:#66d9ef">[</span>HTTP<span style="color:#f92672">::</span>uri<span style="color:#66d9ef">]</span> starts_with <span style="color:#e6db74">&#34;/api/v2/&#34;</span> <span style="color:#66d9ef">}</span> <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>    pool pool_api_v2_servers
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">}</span> <span style="color:#66d9ef">elseif</span> <span style="color:#66d9ef">{</span> <span style="color:#66d9ef">[</span>HTTP<span style="color:#f92672">::</span>uri<span style="color:#66d9ef">]</span> starts_with <span style="color:#e6db74">&#34;/api/&#34;</span> <span style="color:#66d9ef">}</span> <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>    pool pool_api_v1_servers
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">}</span> <span style="color:#66d9ef">elseif</span> <span style="color:#66d9ef">{</span> <span style="color:#66d9ef">[</span>HTTP<span style="color:#f92672">::</span>uri<span style="color:#66d9ef">]</span> starts_with <span style="color:#e6db74">&#34;/admin/&#34;</span> <span style="color:#66d9ef">}</span> <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>    pool pool_admin_servers
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">}</span> <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>    pool pool_web_servers
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">}</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">}</span>
</span></span></code></pre></div><p><strong>Wartungsweiterleitung wenn Pool leer:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-tcl" data-lang="tcl"><span style="display:flex;"><span>when HTTP_REQUEST <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">{</span> <span style="color:#66d9ef">[</span>active_members pool_webapp_8080<span style="color:#66d9ef">]</span> <span style="color:#f92672">&lt;</span> 1 <span style="color:#66d9ef">}</span> <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>    HTTP<span style="color:#f92672">::</span>redirect <span style="color:#e6db74">&#34;https://status.unternehmen.de/wartung&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">}</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">}</span>
</span></span></code></pre></div><p><strong>Host-Header-basiertes Routing — mehrere Anwendungen auf einer VIP:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-tcl" data-lang="tcl"><span style="display:flex;"><span>when HTTP_REQUEST <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">switch</span> <span style="color:#66d9ef">[</span>HTTP<span style="color:#f92672">::</span>host<span style="color:#66d9ef">]</span> <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;app1.unternehmen.de&#34;</span> <span style="color:#66d9ef">{</span> pool pool_app1 <span style="color:#66d9ef">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;app2.unternehmen.de&#34;</span> <span style="color:#66d9ef">{</span> pool pool_app2 <span style="color:#66d9ef">}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;api.unternehmen.de&#34;</span>  <span style="color:#66d9ef">{</span> pool pool_api  <span style="color:#66d9ef">}</span>
</span></span><span style="display:flex;"><span>    default               <span style="color:#66d9ef">{</span> pool pool_default <span style="color:#66d9ef">}</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">}</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">}</span>
</span></span></code></pre></div><p><strong>Verbindungsratenbegrenzung nach Client-IP:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-tcl" data-lang="tcl"><span style="display:flex;"><span>when CLIENT_ACCEPTED <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">set</span> conn_limit <span style="color:#ae81ff">50</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">{</span> <span style="color:#66d9ef">[</span>table lookup <span style="color:#f92672">-</span>notouch <span style="color:#66d9ef">[</span>IP<span style="color:#f92672">::</span>client_addr<span style="color:#66d9ef">]]</span> <span style="color:#f92672">&gt;</span> $conn_limit <span style="color:#66d9ef">}</span> <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>    reject
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">}</span> <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">{</span>
</span></span><span style="display:flex;"><span>    table incr <span style="color:#66d9ef">[</span>IP<span style="color:#f92672">::</span>client_addr<span style="color:#66d9ef">]</span>
</span></span><span style="display:flex;"><span>    table timeout <span style="color:#66d9ef">[</span>IP<span style="color:#f92672">::</span>client_addr<span style="color:#66d9ef">]</span> <span style="color:#ae81ff">60</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">}</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">}</span>
</span></span></code></pre></div><h3 id="irule-leistungshinweise">iRule-Leistungshinweise</h3>
<p>iRules werden für jede Verbindung oder Anfrage durch den Virtual Server ausgeführt. Richtlinien:</p>
<ul>
<li>Vermeiden Sie komplexe Zeichenfolgenoperationen in hochfrequentierten iRules — verwenden Sie <code>table</code> zum Caching berechneter Werte</li>
<li>Ein Syntaxfehler deaktiviert die gesamte iRule stillschweigend — zuerst in der Staging-Umgebung testen</li>
<li>Verwenden Sie <code>log local0.debug</code> sparsam in der Produktion — übermäßiges Logging beeinträchtigt die Leistung</li>
<li>Das <code>RULE_INIT</code>-Ereignis wird einmalig beim Start ausgeführt und ist ideal für die Initialisierung gemeinsamer Datenstrukturen</li>
</ul>
<hr>
<h2 id="high-availability-aktiv-standby-in-der-produktion">High Availability: Aktiv-Standby in der Produktion</h2>
<h3 id="gerätegruppen-und-traffic-gruppen">Gerätegruppen und Traffic-Gruppen</h3>
<p>F5 HA verwendet <strong>Device Trust</strong> (gegenseitige Authentifizierung zwischen Peers) und <strong>Device Groups</strong> (Sync-Failover-Konfiguration):</p>
<pre tabindex="0"><code>Gerätegruppe: dg_production
  Typ:      sync-failover
  Members:  bigip-01 (Aktiv), bigip-02 (Standby)

Traffic-Gruppe: traffic-group-1
  Floating IPs: 10.10.1.100 (VIP), 10.10.1.1 (Self IP)
  Aktiv auf:    bigip-01
</code></pre><p>Traffic-Gruppen enthalten die Floating IPs, die während des Failovers zwischen Geräten migrieren. Wenn bigip-01 ausfällt, übernimmt bigip-02 die Eigentümerschaft von traffic-group-1 und kündigt die VIP über Gratuitous ARP an.</p>
<h3 id="das-dedizierte-heartbeat-vlan-nicht-verhandelbar">Das dedizierte Heartbeat-VLAN: Nicht verhandelbar</h3>
<p>F5 HA verwendet Netzwerk-Failover — Heartbeat-Pakete zwischen Geräten erkennen Peer-Ausfall. Die kritische Regel:</p>
<p><strong>Verwenden Sie immer ein dediziertes Failover-VLAN, getrennt von Produktions- und Management-Netzwerken.</strong></p>
<p>Das Teilen der Produktionsschnittstelle für Heartbeat erzeugt falsche Failover-Ereignisse bei Netzwerküberlastung. Beide Geräte glauben, dass das andere ausgefallen ist, und werden gleichzeitig aktiv — Split-Brain. Datenverkehr wird dupliziert, Sitzungen brechen ab, und die Wiederherstellung vom Vorfall ist aufwendig.</p>
<pre tabindex="0"><code>Failover-VLAN: vlan_ha_heartbeat
  Schnittstelle:     1.3 (dediziert)
  bigip-01 Self IP:  192.168.100.1/24
  bigip-02 Self IP:  192.168.100.2/24
</code></pre><h3 id="config-sync-manuell-vs-automatisch">Config Sync: Manuell vs. Automatisch</h3>
<p><strong>Automatische Synchronisierung</strong> — Änderungen am aktiven Gerät propagieren sofort zum Standby. Risiko: eine teilweise oder falsche Konfigurationsänderung propagiert, bevor Sie sie überprüfen können.</p>
<p><strong>Manuelle Synchronisierung</strong> — Administrator löst die Synchronisierung explizit nach der Überprüfung der Änderungen aus. Sicherer für die Produktion. Standardwahl in regulierten Umgebungen.</p>
<h3 id="verbindungsspiegelung">Verbindungsspiegelung</h3>
<p>Standardmäßig verwirft Failover alle bestehenden Verbindungen — Clients müssen sich neu verbinden. Für die meisten Webanwendungen ist das akzeptabel.</p>
<p>Bei langlebigen Verbindungen (persistente WebSockets, große Dateiübertragungen, Datenbankverbindungen) hält <strong>Verbindungsspiegelung</strong> den Sitzungszustand auf dem Standby-Gerät aufrecht. Failover setzt diese Verbindungen mit minimalem Unterbrechung fort.</p>
<p>Aktivieren Sie Verbindungsspiegelung selektiv — sie verbraucht Speicher und CPU auf beiden Geräten. Nicht jeder Virtual Server benötigt sie.</p>
<hr>
<h2 id="praxisnotizen-die-2000--5000-migration">Praxisnotizen: Die 2000 → 5000 Migration</h2>
<h3 id="warum-wir-migrierten">Warum wir migrierten</h3>
<p>Die BIG-IP-2000-Serie hatte zu Banking-Stoßzeiten ihre SSL-Offloading-Grenze erreicht. TMOS 13.x näherte sich dem End of Support. Die 5000er-Serie bot Hardware-SSL-Beschleunigung, 6-fache Durchsatzverbesserung und TLS-1.3-Unterstützung über TMOS 15.x.</p>
<h3 id="zero-downtime-ansatz-30-geräte-0-ausfälle">Zero-Downtime-Ansatz: 30+ Geräte, 0 Ausfälle</h3>
<p><strong>Phase 1 — Paralleles Deployment</strong>
5000er-Hardware neben bestehender 2000er-Serie installieren. Identische Virtual Server, Pools, Profile und iRules auf neuen Geräten konfigurieren. Noch kein Datenverkehr.</p>
<p><strong>Phase 2 — Validierung auf nicht-kritischem Virtual Server</strong>
Eine einzelne interne Anwendung zum neuen Gerät routen. 72 Stunden überwachen: Verbindungsraten, SSL-Handshake-Latenz, Health-Monitor-Verhalten, iRule-Ausführungslogs, HA-Failover-Test unter synthetischer Last.</p>
<p><strong>Phase 3 — Schrittweise Migration nach Geschäftsrisiko</strong>
Virtual Server in Gruppen migrieren — zuerst interne Tools, dann allgemeine Anwendungen, zuletzt Zahlungsverarbeitung. Für jede Gruppe:</p>
<ul>
<li>Upstream-Routing / SNAT aktualisieren, um auf neues Gerät zu zeigen</li>
<li>48 Stunden überwachen</li>
<li>Altes Gerät 72 Stunden pro Gruppe als Rollback behalten</li>
</ul>
<p><strong>Phase 4 — HA-Paar-Abschluss</strong>
Nachdem alle Virtual Server auf dem neuen aktiven Gerät validiert wurden:</p>
<ol>
<li>Zuerst Standby (altes Gerät) ersetzen</li>
<li>Verifizieren, dass neuer Standby Konfiguration vom Aktiven synchronisiert</li>
<li>Erzwungenes Failover — neuen Standby unter Produktionslast testen</li>
<li>Alten Aktiven außer Betrieb nehmen</li>
</ol>
<p><strong>Die Regel, die es zum Funktionieren brachte: Niemals beide HA-Geräte gleichzeitig ersetzen.</strong> Es muss immer ein vollständig validiertes, produktionserprobtes Gerät den Datenverkehr übernehmen.</p>
<h3 id="tmos-kompatibilitätsprüfung-vor-dem-start-durchführen">TMOS-Kompatibilitätsprüfung: Vor dem Start durchführen</h3>
<p>iRules, die für TMOS 13.x geschrieben wurden, verhalten sich auf 15.x nicht immer identisch. Vor der Migration alle iRules auf Folgendes prüfen:</p>
<ul>
<li><code>HTTP::</code>-Befehle — Verhaltensänderungen in HTTP/2-Szenarien</li>
<li><code>SSL::</code>-Ereignisse — neue Ereignisse und geänderte Timings in TLS 1.3</li>
<li><code>RULE_INIT</code>-Ausführung — Timing-Unterschiede beim Start</li>
</ul>
<p>Wir fanden 3 iRules, die vor dem Cutover Modifikationen erforderten. Diese im Staging zu finden sparte Stunden Produktions-Incident-Response.</p>
<hr>
<h2 id="wichtigste-erkenntnisse">Wichtigste Erkenntnisse</h2>
<ul>
<li>LTM ist ein <strong>Full-Proxy</strong> — kein Pass-Through. Diese Unterscheidung bestimmt alle seine Fähigkeiten und Fehlerbehebungsansätze.</li>
<li><strong>Health Monitors</strong> sind wichtiger als die Load-Balancing-Methode. HTTP-Monitore, die Anwendungsantworten prüfen, sind immer besser als TCP-Monitore.</li>
<li><strong>iRules</strong> ermöglichen Traffic-Logik mit Leitungsgeschwindigkeit ohne Anwendungscode-Änderungen — der leistungsstärkste LTM-Differenziator.</li>
<li><strong>SSL Offloading</strong> entlastet Backends von der Verschlüsselungsarbeit. SSL Bridging ist in regulierten Umgebungen erforderlich.</li>
<li>Verwenden Sie immer ein <strong>dediziertes Heartbeat-VLAN</strong> für HA. Geteilte Schnittstellen verursachen Split-Brain.</li>
<li>Bei Migrationen: <strong>Zuerst Standby, dann Aktiv</strong>. Niemals gleichzeitig.</li>
</ul>
<hr>
<h2 id="diese-serie">Diese Serie</h2>
<ul>
<li>📖 <a href="/de/technology/f5-bigip-application-delivery-platform-overview/">F5 BIG-IP Plattformübersicht — Alle Module</a> ← Beginnen Sie hier, wenn Sie neu bei F5 sind</li>
<li>🌐 <a href="/de/technology/f5-gtm-gslb-global-traffic-management/">F5 GTM &amp; GSLB Deep Dive</a></li>
<li>🛡️ <a href="/de/technology/f5-waf-asm-advanced-waf-application-security/">F5 WAF Deep Dive</a></li>
</ul>
<h2 id="verwandte-artikel">Verwandte Artikel</h2>
<ul>
<li>🛠️ <a href="/de/posts/next-gen-console-server-architecture/">Die Hintertür des Netzwerks: Next-Gen Console Server Architektur</a> — Out-of-Band-Zugang während F5-Wartungsfenstern</li>
<li>🛡️ <a href="/de/posts/network-packet-broker-masterclass/">Network Packet Broker (NPB) Masterclass</a> — Datenverkehrssichtbarkeit neben ADC</li>
<li>🔐 <a href="/de/architecture/zero-trust-mindset-engineering-security-as-an-architecture-not-a-product/">Die Zero-Trust-Mentalität</a> — Wo LTM in einer Zero-Trust-Architektur passt</li>
</ul>
]]></content:encoded></item></channel></rss>