Anti-Flood-System für Clients und ClientQuery in TeamSpeak 3
Dieses Dokument beschreibt das Anti-Flood-System für virtuelle Server. Es betrifft ausschließlich Voice-Clients, sowohl bei der normalen Verwendung als auch bei ClientQuery. Der in Client-Version 3.0.9 entfernte Voice-Client-ServerQuery (unten in der Tabelle als serverquerycmd
geführt) erhielt unabhängig vom konkreten Befehl pauschal 5 Punkte pro Befehl. Dieses Feature wurde inzwischen entfernt, ansonsten gilt die hier genannte Liste höchstwahrscheinlich unverändert von 3.0.2 bis heute. Sie wurde vom 29. bis 31. Oktober 2017 mit den Server-Versionen 3.0.6.1-final und 3.0.13.8 erstellt.
ServerQuery-Clients sind vom hier beschriebenen Anti-Flood nicht betroffen. Sie leiden ja auch genug unter dem Instanz-Anti-Flood, das pauschal einen Punkt pro Befehl gibt.
Allgemeines
Ein Client startet mit 0 Punkten. Jede halbe Sekunde (genannt „Tick“) bekommt man virtualserver-antiflood_points_tick_reduce
Punkte abgezogen, kann aber 0 Punkte nicht unterschreiten. Besagte Einstellung kann nicht weniger als 1 sein.
Bei einer Aktion gilt folgender Pseudo-Code:
FALLS man kein b_client_ignore_antiflood hat DANN
ERHÖHE Client-Flood-Punkte UM genannte Flood-Punkte
FALLS genannte Flood-Punkte >= 0
UND man kein b_client_ignore_antiflood hat
UND virtualserver_antiflood_points_needed_command_block >= Client-Flood-Punkte DANN
WERFE Fehler
SONST
FÜHRE Befehl AUS
Flood-Punkte führen bereits bei Gleichheit mit virtualserver_antiflood_points_needed_command_block
zu einem Fehler (übrigens einer der wenigen Orte, wo der Nutzer in der deutschen Version – übrigens noch gar nicht so lange – geduzt wird). Hat ein Client b_client_ignore_antiflood
, kann er keine Punkte aufbauen, aber noch Punkte besitzen, die er vorm Erhalt des Rechts hatte und die noch nicht komplett abgebaut sind (seltene Situation).
Clients mit b_client_ignore_bans
(nicht jedoch b_client_ignore_antiflood
!) umgehen den IP-Block, ansonsten bekommt man flood prevention, please try again later
angezeigt. Das ist kein Bann, also wird niemand gekickt (aber b_client_ignore_bans
wirkt)! Das steht auch explizit im Changelog. Der Sinn darin, nicht zu bannen oder zu kicken, erschließt sich mir nicht so ganz.
Das Verbinden zu einem Server entspricht 80 Punkte (missachtet b_client_ignore_antiflood
), die allerdings sofort wieder abgezogen werden, wenn die Verbindung hergestellt ist und die ersten anderen Befehle ausgetauscht werden.
virtualserver_antiflood_points_needed_ip_block
<= 80 führt also dazu, dass Clients ohne b_client_ignore_bans
nicht mehr auf den Server kommen können, auch wenn bei einem Login maximal 50 Flood-Punkte anfallen.
Liste der Aktionen
Abonnement-Aktionen | Flood-Punkte | |
---|---|---|
channelsubscribe 3 | Einen (anderen) Channel oder eine Familie abonnieren | 158 |
channelunsubscribe 3 | Abonnement eines Channels oder einer Familie aufheben | 5 |
channelsubscribeall 3 | Alle Channels abonnieren | 20 |
channelunsubscribeall 3 | Alle Abonnements aufheben | 25 |
Ban-Aktionen | Flood-Punkte | |
banadd | Beliebigen Ban erstellen | 25 |
banclient | Einen derzeit verbundenen Client bannen und kicken | 25 |
bandel | Ban löschen | 5 |
bandelall | Alle Bans löschen (man beachte die viel höheren Kosten von complaindelall ) | 5 |
banlist | Banliste | 25 |
Beschwerde-Aktionen | Flood-Punkte | |
complainadd | Sich beschweren | 25 |
complaindel | Beschwerde löschen/zurücknehmen | 5 |
complaindelall | Alle Beschwerden löschen (man beachte die viel geringeren Kosten von bandelall ) | 25 |
complainlist | Beschwerden anzeigen | 25 |
Rechte-Aktionen | Flood-Punkte | |
permissionlist 1 | Rechteliste abfragen (falls nicht im Cache) | 5 |
permoverview | Rechte-Übersicht | 5 |
servergroupaddperm | Servergruppen-Recht(e) hinzufügen | 5 |
servergroupdelperm | Servergruppen-Recht(e) löschen | 5 |
servergrouppermlist | Servergruppen-Rechte anzeigen | 5 |
clientaddperm | Client-Recht(e) hinzufügen | 5 |
clientdelperm | Client-Recht(e) löschen | 5 |
clientpermlist | Client-Rechte anzeigen | 5 |
channeladdperm | Channel-Recht(e) hinzufügen | 5 |
channeldelperm | Channel-Recht(e) löschen | 5 |
channelpermlist | Channel-Rechte anzeigen | 5 |
channelgroupaddperm | Channelgruppen-Recht(e) hinzufügen | 5 |
channelgroupdelperm | Channelgruppen-Recht(e) löschen | 5 |
channelgrouppermlist | Channelgruppen-Rechte anzeigen | 5 |
channelclientaddperm | Client-Channel-Recht(e) hinzufügen | 5 |
channelclientdelperm | Client-Channel-Recht(e) löschen | 5 |
channelclientpermlist | Client-Channel-Rechte anzeigen | 5 |
Channel-Aktionen | Flood-Punkte | |
channelcreate | Irgendeine Art von Channel erstellen | 25 |
channeldelete | Channel löschen | 25 |
channelmove | Elternchannel ändern | 25 |
channelgetdescription 1 | Channel-Beschreibung abrufen | 0 |
channeledit | Position im Elternchannel ändern oder Channel bearbeiten | 25 |
Nachrichten-Aktionen | Flood-Punkte | |
clientchatclosed 1 | Jemandem mitteilen, dass man das Chat-Fenster geschlossen hat | 5 |
clientchatcomposing 1 | „tippt“-Benachrichtigung | 0 |
messageadd | Offline-Nachricht verschicken | 25 |
messagedel | Offline-Nachricht löschen | 5 |
messageget | Text einer Offline-Nachricht anzeigen | 20 |
messagelist | Offline-Nachrichten-Liste anzeigen | 25 |
messageupdateflag | „gelesen”-Markierung einer Offline-Nachricht ändern | 5 |
textmessagesend | Nachricht senden (egal welcher Kanal) | 15 |
Channelgruppen-Aktionen (allgemein) | Flood-Punkte | |
channelgroupadd | Channelgruppe erstellen | 5 |
channelgroupclientlist | Zuordnungen von Channelgruppen, Clients und Channeln anzeigen | 5 |
channelgroupcopy 1 | Channelgruppe kopieren | 5 |
channelgroupdel | Channelgruppe löschen | 5 |
channelgrouplist | Channelgruppenliste anzeigen | 5 |
channelgrouprename 1 | Channelgruppe umbenennen | 5 |
setclientchannelgroup | Channelgruppe setzen | 25 |
Servergruppen-Aktionen (allgemein) | Flood-Punkte | |
servergroupadd | Servergruppe erstellen | 5 |
servergroupaddclient | Client zu Servergruppe hinzufügen | 25 |
servergroupclientlist | Clients in Servergruppe anzeigen | 5 |
servergroupcopy 1 | Servergruppe kopieren | 5 |
servergroupdel | Servergruppe löschen | 5 |
servergroupdelclient | Client aus Servergruppe entfernen | 25 |
servergrouplist | Servergruppenliste anzeigen | 5 |
servergrouprename 1 | Servergruppe umbenennen | 5 |
servergroupsbyclientid | Servergruppen eines Clients anzeigen | 5 |
Client-Datenbank-Aktionen | Flood-Punkte | |
clientdbdelete | Client aus Datenbank löschen | 25 |
clientdbedit | Client-Beschreibung ändern | 25 |
clientdbfind | Clients in Datenbank suchen | 50 |
clientdblist | 10 Einträge aus Client-Datenbank laden | 25 |
Client-Aktionen (sichtbar) | Flood-Punkte | |
clientmove | Channel betreten oder andere Clients bewegen | 10 |
clientupdate | Eigene Client-Eigenschaften ändern außer Mikrofon deaktivieren | 15 |
clientkick | Vom Server oder Channel kicken | 25 |
clientpoke | Anstupsen | 25 |
clientedit 1 | In einem moderierten Channel Talkpower vergeben/wegnehmen | 25 |
clientmute | Jemanden stummschalten | 07 |
clientunmute | Jemanden nicht mehr stummschalten | 07 |
clientupdate | Bearbeiten, wie man auf dem Server angezeigt wird | 06 |
Client-Aktionen (informativ) | Flood-Punkte | |
clientgetdbidfromuid 2 | Datenbank-ID einer globalen ID erhalten | 5 |
clientgetids 2 | Anzeigen, mit welchen Clients eine globale ID derzeit verbunden ist | 5 |
clientgetnamefromdbid | Letzten von einer DBID verwendeten Namen erhalten (redundanter Befehl in ServerQuery) | 5 |
clientgetnamefromuid 2 | Letzten von einer globalen ID verwendeten Namen erhalten | 5 |
clientgetuidfromclid 2 | Globale ID eines verbundenen Clients erhalten (redundanter Befehl) | 5 |
clientsetserverquerylogin 1 | ServerQuery-Login erstellen | 25 |
connectioninfoautoupdate 1 | Sende Verbindungsstatistiken des Clients an der Server | 0 |
Client-Aktionen (intern) | Flood-Punkte | |
clientdisconnect 1 | Verbindung trennen | 0 |
clientgetvariables 1 | Informationen über einen Client erhalten | 0 |
clientinit 1 | 2. Schritt beim Verbindungsaufbau | 0 |
clientinitiv 1 | 1. Schritt beim Verbindungsaufbau | 0 |
setwhisperlist 1 | Whisperliste aktualisieren | 0 |
Temporäres-Passwort-Aktionen | Flood-Punkte | |
servertemppasswordadd 1 | Temporäres Passwort erstellen | 5 |
servertemppassworddel 1 | Temporäres Passwort löschen | 5 |
servertemppasswordlist 1 | Liste der temporären Passwörter anzeigen | 5 |
Berechtigungsschlüssel-Aktionen | Flood-Punkte | |
tokenadd | Berechtigungsschlüssel erstellen | 5 |
tokendelete | Berechtigungsschlüssel löschen | 5 |
tokenlist | Berechtigungsschlüssel-Liste anzeigen | 5 |
tokenuse | Berechtigungsschlüssel benutzen | 5 |
Datei-Aktionen | Flood-Punkte | |
ftcreatedir | Ordner erstellen | 5 |
ftdeletefile | Datei löschen | 5 |
ftgetfileinfo 2 | Datei-Informationen anzeigen (im Prinzip redundant zu FtGetFileList ) | 5 |
ftgetfilelist | Dateiliste in einem Ordner anzeigen | 0 |
ftinitupload | Eine Datei hochladen | 0 |
ftinitdownload | Eine Datei runterladen | 0 |
ftlist 2 | Liste der Dateitransfers anzeigen | 5 |
ftrenamefile | Datei umbenennen | 5 |
ftstop | Befehl hat keine mir bekannte Funktion | 5 |
Sonstige Aktionen | Flood-Punkte | |
logview 1 | Logbuch anzeigen | 50 |
serveredit 1 | Server-Einstellungen bearbeiten | 5 |
serverquerycmd 1 | Voice-Client-ServerQuery (bis Client 3.0.8.1), je Befehl | 5 |
verifychannelpassword | Channel-Passwort überprüfen | 05 |
verifyserverpassword | Server-Passwort überprüfen | 05 |
Inoffizielle Befehle und Aktionen | Flood-Punkte | |
getconnectioninfo 1 | Parameter: clid | 0 |
servergetvariables | gibt notifyserverupdated | 0 |
setconnectioninfo | nichts geschieht | 0 |
clientsitereport | nichts geschieht | 0 |
dummy_connectfailed | nichts geschieht | 0 |
dummy_connectionlost 4 | Plug-In beantwortet diesem Client alle Befehle nur noch mit Fehler 1792 | 0 |
dummy_newip | nichts geschieht | 0 |
plugincmd | siehe ServerQuery-Dokumentation | 5 |
- Fußnoten:
- 1 = kein ClientQuery (nur intern vom Client verwendet)
- 2 = nur ClientQuery (vermutlich)
- 3 = ClientQuery undokumentiert
- 4 = nur ClientQuery (undokumentiert)
- 5 =
verifychannelpassword
undverifyserverpassword
haben anders als alle anderen Befehle keine Flood-Punkte, wenn die Parameter fehlen, ansonsten haben siee 5 Punkte- 6 = 0 ohne Parameter und den folgenden Befehlen (auch in Kombination ausschließlich untereinander), sonst 15 Punkte unabhängig von der Anzahl.
client_input_hardware
1 mit Wert0
(hat aktiven Tab gewechselt)client_input_deactivated
client_default_token
- alles ohne Änderung außer
client_is_channel_commander
undclient_nickname
„ohne Änderung“ bedeutet: Der Client führt keine Änderung durch, wenn sich der Wert nicht von dem unterscheidet, den man als letztes gesetzt hat oder versucht hat zu setzen
- 7 = 0, damit man eine Person nicht mehr hört und damit der Befehl laut ClientQuery-Rückgabe erfolgreich ausgeführt wird. 5, damit Daten vom Server zurückgehalten bzw. wieder gesendet werden und sich der Client im Chat (auch bei ClientQuery!) nicht über Flooding beschwert. Weitere 5, damit sich der Client im Chat (auch bei ClientQuery!) nicht (noch einmal) über Flooding beschwert.
- 8 = unterstützt Array-Parameter, Flood-Punkte unabhängig von der Länge des Arrays
- 2 = nur ClientQuery (vermutlich)
Nicht ausgewertete Aktionen
ClientQuery-Befehle, die wohl keine Interaktion mit dem Server auslösen (synchrone, zumeist rein informative Befehle):
auth
channelclientlist
channelconnectinfo
channellist
channelvariable
clientlist
clientnotifyregister
clientnotifyunregister
clientvariable
currentschandlerid
hashpassword
help
quit
serverconnectinfo
serverconnectionhandlerlist
servervariable
use
whoami
Diejenigen Befehle aus obiger Liste, die nicht wegen ServerQuery existieren, existieren auf Serverseite auch nicht.
ServerQuery-Befehle, die nicht von ClientQuery und vermutlich auch nicht vom Client genutzt werden (größtenteils Instanz-Befehle oder Befehle, die ich hier erneut liste, weil sie in den vorherigen Liste sind und daher andere als die hier genannten gleichnamigen ServerQuery-Befehle):
bindinglist
channelcreateprivate
(inoffizieller, nicht implementierter Befehl) (25)channelfind
channelinfo
channellist
clientdbinfo
clientfind
clientinfo
clientlist
custominfo
customsearch
(50)dummy_connectionlost
(0, man bekommt keine Antworten mehr)gm
(50)help
hostinfo
instanceedit
(25)instanceinfo
logadd
login
logout
permfind
permget
permidgetbyname
permreset
privilegekeyadd
(nurtokenadd
wird verwendet)privilegekeydelete
(nurtokendelete
wird verwendet)privilegekeylist
(nurtokenlist
wird verwendet)privilegekeyuse
(nurtokenuse
wird verwendet)quit
servercreate
serverdelete
servergroupautoaddperm
servergroupautodelperm
serveridgetbyport
serverinfo
serverlist
servernotifyregister
servernotifyunregister
serverprocessstop
serverrequestconnectioninfo
(0)serversnapshotcreate
serversnapshotdeploy
serverstart
serverstop
use
version
whoami
Sofern der Client sie doch verwenden würde, würde er meist 5 Flood-Punkte erhalten (abweichende Flood-Punkte sind in Klammern angegeben).
Verbindungsaufbau
Setzt man die Befehle bis zur Blockierung auf weniger als 11, bekommt man beim Verbinden die maximal möglichen drei bis vier Fehlermeldungen, da der Client nach dem Herstellen der Verbindung drei bis vier Aktionen versucht, für die er Flood-Punkte erhält. Folgende Aktionen werden ausgeführt:
clientinitiv
.clientinit
.- Vermutlich: Setzen des Standardchannels (10 Punkte). Wird aber auch ausgeführt, wenn man keinen Standardchannel gesetzt hat.
- Setzen der Abzeichen (15 Punkte). Wie jedes andere Ändern der eigenen Client-Eigenschaften kostet es 15 Punkte. Falls das nicht funktioniert, läuft im Client ein Timer unabhängig vom Server, der es alle 10 Sekunden erneut probiert, bis es klappt. Sofern
virtualserver_antiflood_points_needed_command_block
mindestens 16 ist, wird es irgendwann klappen, da man in 10 Sekunden wie oben erwähnt mindestens 20 Punkte regeneriert. permissionlist
(5 Punkte), falls sich die Datei nicht im Cache befindet.clientgetvariables
(0 Punkte)- Abonnieren von Channeln. Hat man das Abonnieren aller Channels aktiviert, benötigt das selbstverständlich 20 Punkte, hat man es nicht aktiviert, wird ein einzelner Channel abonniert, was 15 Punkte kostet.