2 votes

IPTables + module Limit : Pourquoi le module limit-burst n'est-il pas complètement utilisé ?

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.

0voto

user3338098 Points 64

Le module limit ne limite pas en fonction du nombre de connexions mais plutôt en fonction du nombre de paquets ip (même les jumbo-packets). Ainsi, si une seule connexion prend environ 20,8 paquets, vous verrez une rafale de 500/20.8~=24 connexions.

voir la sortie de la commande man 8 iptables-extensions|grep -e '^ *limit$' -A 18 pour plus d'informations, notamment la phrase "Maximum initial nombre de paquets pour correspondre : [...]".

0voto

À la suite de l'utilisateur3338098, pour résoudre le problème, vous devez uniquement faire correspondre les paquets SYN en ajoutant -m state --state NEW

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X