Lecteur de longue date, premier poster yada yada yada
Quoi qu'il en soit, j'espère que quelqu'un a une expérience approfondie des modules LIMIT ou HASHLIMIT d'iptables/netfilter et qu'il pourra expliquer le comportement que je constate.
Le contexte : Nous avons un serveur web et nous voulons limiter le nombre de connexions qu'un client peut avoir au cours d'un mois (les keepalives HTTP sont désactivées). J'essaie donc d'utiliser le module iptables LIMIT pour limiter le nombre de leurs nouvelles connexions à un nombre défini par mois (disons 500). Le module iptables LIMIT utilise un algorithme de "seau à jetons", je devrais donc pouvoir définir la limite de rafale (taille du seau) à 500 et la limite (taux de remplissage) à 500 divisé par 28 jours ou environ 18/jour. Cela permettra de s'assurer que le seau sera rechargé dans un mois (4 semaines) s'il n'est jamais complètement vidé. (Je comprends que cela va accorder plus que 500 exactement mais cela devrait être assez proche pour nos besoins).
Voici mes règles iptables (Nous regroupons les IPs en utilisant ipset. LimBurTest4 contient mes machines de test source)
Chain INPUT (policy DROP 2316 packets, 186K bytes)
pkts bytes target prot opt in out source destination
2952K 626M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED /* Accept outgoing return traffic */
379 13702 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 state NEW limit: avg 1/sec burst 1
377 30868 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x00 /* Block NULL packets */
73 14728 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW /* Block SYN flood */
0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x3F/0x3F /* Block XMAS packets */
24 120 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 match-set LimBurTest4 src tcp dpt:443 limit: avg 18/day burst 500 /* LimitBurst Test */
76 30180 LOG tcp -- * * 0.0.0.0/0 0.0.0.0/0 match-set LimBurTest4 src tcp dpt:443 /* LimitBurst Testing */ LOG flags 0 level 4 prefix "LimBurTest Over Quota "
2522 138K REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 /* Reject queries */ reject-with tcp-reset
J'ajoute la règle LIMIT comme ceci :
iptables -I INPUT 7 -m set --match-set LimBurTest4 src -p tcp --dport 443 -m limit --limit 18/day --limit-burst 500 -m comment --comment "Limit Burst Test" -j ACCEPT
Test : Puis j'ai créé un simple Shell Shell pour faire des requêtes à mon serveur web l'une après l'autre en utilisant curl. Chaque requête réussie prend environ 0,20 ms. La sortie du Shell ressemble à ceci :
./limBurTest.sh
1 - 200 - 0.257 ms
2 - 200 - 0.193 ms
3 - 200 - 0.155 ms
etc.
etc.
Résultat : Je m'attends à ce que cette configuration utilise rapidement (en quelques secondes) les 500 connexions avant de commencer à voir des connexions rejetées. Cependant, ce n'est pas du tout ce qui se passe. Au lieu de cela, mon script de test a établi 24 connexions réussies, puis le reste a été rejeté. Par exemple, dans la sortie iptables ci-dessus, j'ai exécuté mon script script dans une boucle 100 fois et vous pouvez voir 24 correspondances de règles ACCEPT et 76 correspondances de règles LOG après la règle ACCEPT. J'ai testé cela sur CentOS 6.8 et Ubuntu 16.04 et les deux se comportent de cette façon, mais cela semble contraire à la documentation. Pourquoi ne puis-je pas utiliser les 500 connexions spécifiées par limit-burst ?
Et, oui, bien sûr, j'ai fait une recherche approfondie sur Google et j'ai vu de nombreux exemples de personnes disant que le module LIMIT est censé fonctionner exactement comme je l'ai décrit. Et j'ai lu la documentation de netfilter de nombreuses fois.
Qu'est-ce que je rate ici ?
Merci d'avance.