Zum Inhalt springen Weiter zur Suche
Testversion
Blog

Optimierung der aFleX-Skriptsprache

aFleX ist eine leistungsstarke und flexible Skriptsprache, mit der Sie Ihren Datenverkehr verwalten und erweiterte Leistungen und Dienste anbieten können.

aFleX ist optimiert, um sehr schnell zu laufen und ist hoch skalierbar. Je nachdem, wie Sie Ihr Skript aufbauen, kann aFleX jedoch mehr AX/Thunder CPU- und RAM-Ressourcen verwenden.

Dieser Abschnitt soll Ihnen helfen, optimale aFleX-Skripte zu erstellen.

Regel Nr. 0: Was ist mit Anwendungsvorlagen?

Die AX/Thunder Serie bietet mehrere Vorlagen für erweiterte Funktionen wie z. B.:

  • URL/Host-Wechsel
  • Persistenz von Cookies
  • HTTP-Header einfügen/löschen/ersetzen
  • HTTP-Umleitung/Rewrite
  • Filtern oder Verarbeiten von Datenverkehr auf der Grundlage von Klassenlisten
    Vorlagen sind einfach zu verwenden (kein Skript erforderlich) und für Effizienz optimiert.

Es wird daher immer empfohlen, wenn möglich, Anwendungsvorlagen zu verwenden.

Regel Nr. 1: Variablen begrenzen

Variablen verbrauchen Ressourcen:

  • CPU zum Erstellen/Zuweisen und Zerstören
  • Speicher zum Speichern der Variablen

Die beiden folgenden Beispiele bewirken das Gleiche, aber das erste ist effizienter:

Beispiel 1:
log "Client address=[IP::client_addr]"

Beispiel 2:
set ip_addr [IP::client_addr]
log "Client address=$ip_addr"

Rule #2: Brace your expressions

aFleX uses the TCL scripting language, which is string based.
Using braces {} to encapsulate commands helps TCL analyze the function.
Both examples below do the same thing, but the first one is more efficient:

Example1:
set octet [expr {3 + [getfield [IP::client_addr] “.” 4]}]

Beispiel2:
set octet [expr 3 + [getfield [IP::client_addr] "." 4]]

Regel #3a: Verwenden Sie if-elseif anstelle von if
Wenn Sie mehrere Tests haben, verwenden Sie if-elseif, um aFleX darauf zu beschränken, alle Tests zu durchlaufen.
Die beiden folgenden Beispiele bewirken dasselbe, aber das zweite ist effizienter:

Example1:
if {[IP::client_addr] equals “20.20.125.1″ } {
pool sg1
}

if {[IP::client_addr] equals “20.20.125.2″ } {
pool sg2
}

if {[IP::client_addr] equals “20.20.125.3″ } {
pool sg3
}

Example2:
if {[IP::client_addr] equals “20.20.125.1″ } {

Pool sg1

} elseif {[IP::client_addr] equals “20.20.125.2″ } {

Pool sg2

} elseif {[IP::client_addr] equals “20.20.125.3″ } {

Pool sg3

} sonst {

Poolvorgabe

}

Regel Nr. 3b: Verwenden Sie switch anstelle von if-elseif
Wenn Sie mehrere Tests haben, ist eine einzige switch-Anweisung effizienter als viele if-elseif-Anweisungen zur Auswertung aller Tests. (Switch-Anweisungen sind auch einfacher zu codieren.)

Die beiden folgenden Beispiele bewirken das Gleiche, aber das erste ist effizienter:

Beispiel 1:

switch [IP::client_addr] {

20.20.125.1 { pool pool1 }

20.20.125.2 { pool pool2 }

20.20.125.3 { pool pool3 }

default { pool default_pool }

}

Beispiel 2:

if {[IP::client_addr] equals “20.20.125.1″ } {

Pool sg1

} elseif {[IP::client_addr] equals “20.20.125.2″ } {

Pool sg2

} elseif {[IP::client_addr] equals “20.20.125.3″ } {

Pool sg3

} sonst {

Poolvorgabe

}

Regel Nr. 4: Verwenden Sie Arrays anstelle von Listen für die Suche in Datengruppen
Wenn Sie eine Datengruppe haben und nach einem Eintrag in dieser Liste suchen, ist ein Array effizienter als eine Liste, um einen Eintrag zu finden.

Die beiden folgenden Beispiele bewirken das Gleiche, aber das erste ist effizienter:

Beispiel 1:

wenn RULE_INIT {

array set ::ARRAY1 [list "/url1" "sg1" "/url2" "sg2" ... ] }

}

wenn HTTP_REQUEST {

if { info exists ::ARRAY1([HTTP::uri]) } {

Pool $::ARRAY1([HTTP::uri])

....

}

}

Beispiel 2:

wenn RULE_INIT {

set ::CACHEURLS [list "/url1" "/url2" ...]

set ::URLS2SG [list "sg1" "sg2" ...]

}

wenn HTTP_REQUEST {

set SEARCH_INDEX [lsearch -exact $::CACHEURLS [HTTP::uri]]

if { $SEARCH_INDEX != -1 } {

pool [lindex $::URLS2SG $SEARCH_INDEX]

}

}

Regel Nr. 5: Verwenden Sie den richtigen Operator

For numbers, use the following operators: ==, !=, >, <

Für Zeichenketten verwenden Sie "eq", "ne" usw.

Die beiden folgenden Beispiele bewirken das Gleiche, aber das erste ist effizienter:

Beispiel 1:

set url_length [string length [HTTP::uri]]

if { [string length [HTTP::uri]] == 10 } {

...

}

Beispiel 2:

set url_length [string length [HTTP::uri]]

if { [string length [HTTP::uri]] eq 10 } {

...

}

Regel #6: Vermeiden Sie regex und regsub
Regex und regsub sind leistungsfähige TCL-Befehle, die aber viel CPU verbrauchen. Verwenden Sie stattdessen, wenn möglich, die folgenden Befehle:

  • enthält, endet_mit, beginnt_mit, ist gleich, stimmt überein, statt regexp
  • string map anstelle von regsub

Die beiden folgenden Beispiele bewirken das Gleiche, aber das erste ist effizienter:

Beispiel 1:

if { [HTTP::uri] starts_with “/docs”} {

...

}

Beispiel 2:

if { [regex {^/docs} [HTTP::uri] } {

...

}

Die beiden folgenden Beispiele bewirken das Gleiche, aber das erste ist effizienter:

Beispiel 3:

wenn HTTP_RESPONSE_DATA {

if { [HTTP::header “Content-Type”] contains “text” } {

set payload_length [HTTP::payload length]

HTTP::payload replace 0 $payload_length [string map {“https://intranet.abc.com”
“https://intranet.abc.com”} [HTTP::payload]]

HTTP::Freigabe

}

}

Beispiel 4:

wenn HTTP_RESPONSE_DATA {

if { [HTTP::header “Content-Type”] contains “text” } {

set payload_length [HTTP::payload length]

regsub -all "https://intranet.abc.com" [HTTP::payload] "https://intranet.abc.com"
new_payload

HTTP::payload replace 0 $payload_length $new_payload

HTTP::Freigabe

}

}

Verwandte Beiträge

aFleX-Skriptsprache und Layer 7 Deep-Packet-Inspection

aFleX ist eine leistungsstarke und flexible Skriptsprache, mit der Sie Ihren Datenverkehr verwalten und erweiterte Vorteile und Dienste anbieten können. Sie ist in den Thunder® Application Delivery Controller (ADC) integriert, eine hochleistungsfähige Load-Balancing-Lösung, mit der Ihre Anwendungen hochsicher, verfügbar und beschleunigt sind.



Geoff Blaine
|
September 30, 2015

Geoff ist seit 10 Jahren in der Sicherheitsbranche tätig und fungiert als leitender Kommunikationsautor und Content Manager von A10. Er bringt eine Mischung aus praktischer journalistischer Erfahrung, Cybersicherheitsperspektive und... Mehr lesen