Iptables interdire les pays sauf la france

La raison pour laquelle j’ai procédé comme ça, c’est qu’il est impossible de mesurer directement le temps de traitement d’un seul paquet.

Avec un flood à quasiment 8 Mo/s (soit environ 130000 pings par seconde à raison de 64 octets par ping*), la charge CPU n’est qu’à 5 % dans le pire des cas. Si le réseau arrivait à suivre (bande passante infinie), en saturant le CPU il pourrait traiter grosso modo 20 fois plus de paquets (2600000 par seconde) c’est à dire 0.000385 millisecondes (385 nanosecondes) pour traiter un paquet.

(*) j’ai comme un doute quand même, je me demande si les trames Ethernet ne sont pas de taille fixe (1500 octets) quel que soit le contenu.
Qu’à cela ne tienne, le calcul est identique : 8 Mo/s ça nous fait 5590 pings par seconde, soit une capacité de traitement CPU (x 20) de 111800 paquets par seconde, c’est à dire 0.009 millisecondes (9 microsecondes) par paquet. Étant donné que les 385 nanosecondes me paraissent quand même vachement faibles, je pense que c’est plutôt les 9 microsecondes qui sont correctes. Mais bon, même comme ça on est quand même à des valeurs 100 fois plus petites que la milliseconde !

Ça, c’est sur un “petit” CPU à 1.66 GHz, avec plus de 128000 règles, dans le cas le plus lent (iptables, machine de test tout à la fin de la liste noire).
Dans ces conditions, comment veux-tu mesurer de manière fiable le temps de traitement d’un seul paquet alors que ta précision de mesure est au mieux d’une milliseconde, et que le simple fait de lancer un programme comme netcat implique déjà des variations de plusieurs millisecondes ? :wink:
Et c’est pas mes quelques arrondis qui vont changer l’ordre de grandeur de manière significative…

Je ne comprends pas ton histoire de pondération par la durée. La charge réseau était stable, la charge CPU était stable, la stabilité de la mesure a été vérifiée à chaque fois sur une grosse minute, je ne vois pas ce qu’il y a à pondérer. Tu peux détailler ?

Salut,

Pour information mon Synology le possède que 128 Mo de mémoire vive et donc quelque soit l’algorithme il swappe la table des IP. Ce qui provoque un fort ralentissement même si le temps de traitement est optimisé.
Mon temps de réponse passe de 1 à 10, je n’ai nul besoin d’un chrono :slightly_smiling:

Salut,

Dans la série test, cette article devrait vous intéresser.

Mass-blocking IP addresses with ipset

Ipset, sujet qui revit, c’est cool … :083

Indirectement, si. Le noyau fait deux choses avec chaque paquet de requête : rechercher si l’adresse source est dans la liste, et le cas échéant répondre. Répondre prend à peu près toujours le même temps quelle que soit la méthode de recherche, par iptables ou ipset. Donc pour un même volume de trafic, si l’occupation du CPU est plus élevée avec iptables, c’est que la recherche lui prend plus de temps qu’avec ipset.

Non, mais elles ont une taille minimale de l’ordre de 64 octets.

Je serais très surpris que la mémoire du noyau contenant les règles d’iptables ou les listes d’ipset puisse être swappée.

Re,

lmt> free total used free shared buffers Mem: 118816 103036 15780 0 3768 Swap: 2097080 98724 1998356 Total: 2215896 201760 2014136

Et là il attend seulement le courrier :slightly_smiling:

Non, mais elles ont une taille minimale de l’ordre de 64 octets.[/quote]
Ok donc mon premier calcul qui donne 385 ns était le moins incorrect des deux (je sais bien que ce sont des calculs très approximatifs :mrgreen:).
L’informatique ne cessera jamais de m’étonner…

Merci de l’info. :wink:

Je ne comprends pas ton histoire de pondération par la durée. La charge réseau était stable, la charge CPU était stable, la stabilité de la mesure a été vérifiée à chaque fois sur une grosse minute, je ne vois pas ce qu’il y a à pondérer. Tu peux détailler ?[/quote]

J’imaginais qu’une charge CPU de 10% pendant 5 secondes n’est pas la même chose que 5% pendant 30 secondes. Maintenant, si iptables et ipset utilisent le cpu de la même manière la pondération n’est effectivement pas nécessaire comme souligné plus haut.

Entre-temps, j’ai changé ma méthodologie de test en n’utilisant plus le target reject qui, pour des raisons toujours inexpliquées, ralentit le rythme des réponses après les 5 premiers paquets icmp. J’ai simplement mis un target log, la charge et la latence d’écriture dans syslog devant être équivalentes pour les deux méthodes. J’ai mis le format rsyslog à RSYSLOG_ForwardFormat (a new high-precision forwarding format) pour avoir un horodatage précis et j’ai refait les tests. Et cette fois, ils sont conformes à la réputation d’ipset et aux résultats de syam.

Boucle de 1000 requêtes et fichier d’ip CIDR de 31000 lignes.
Temps de traitement: iptables: 24 sec., ipset: 11 sec.

Les règles ipset semblent aussi se charger beaucoup plus rapidement qu’iptables:
iptables-restore: 2 sec.
ipset -R: 0,3 sec.

Sur ce dernier test je ne rejoins donc pas les résultats de syam, le volume des règles n’est pas le même non plus. Mais c’est de moindre importance.

[quote=“loreleil”]Salut,
Dans la série test, cette article devrait vous intéresser.
Mass-blocking IP addresses with ipset
Ipset, sujet qui revit, c’est cool … :083[/quote]

Intéressant ce lien. Tout y est dit.

Salut,

Bon, je vais tiré un peu la couette … :033

J’avais laissé ipset en stand bye, c’est reparti.

Un os!

Le premier de la liste. UNITED STATES me retourne les erreurs suivantes.

:~/.ipset_block.list# while read ln; do ipset -A UNITED_STATES $ln; done < UNITED_STATES.list ipset v2.5.0: IP/port/element is outside of the set or set is full ipset v2.5.0: IP/port/element is outside of the set or set is full ipset v2.5.0: IP/port/element is outside of the set or set is full ipset v2.5.0: IP/port/element is outside of the set or set is full ...
J’ai laissé cette action se terminer, il en ressortis 32776 lignes créer. (32776 blocks d’ip enregistrer)

La traduction très relative qu’en fait google, “élément est en dehors de l’ensemble ou d’un ensemble est pleine” ma laissé supposer que le fichier .list était trop imposant sur ma bête de course. (en local)

Un copier/coller de la liste créer par countryipblocks me sort un fichier (nommé: UNITED_STATES.list) de 42295 blocks d’IP. Autrement dit 42295 lignes.

J’ai limité le fichier à 32000 lignes. J’ai relancé, et cette fois aucune erreur.

Ça c’était pour la bête local.

Une recherche avec find sur les fichiers ipset, mais bon … :confused:

Je n’ai pas su mettre la main sur ce script, par contre j’ai trouvé ceci sur la toile.

svn.netfilter.org/netfilter/trunk/ipset/ipset.c

[quote]…
static void kernel_error(unsigned cmd, int err)
{
unsigned int i;
struct translate_error {
int err;
unsigned cmd;
const char message;
} table[] =
{ /
Generic error codes /
{ EPERM, 0, “Missing capability” },
{ EBADF, 0, “Invalid socket option” },
{ EINVAL, 0, “Size mismatch for expected socket data” },
{ ENOMEM, 0, “Not enough memory” },
{ EFAULT, 0, “Failed to copy data” },
{ EPROTO, 0, “ipset kernel/userspace version mismatch” },
{ EBADMSG, 0, “Unknown command” },
/
Per command error codes /
/
Reserved ones for add/del/test to handle internally:
* EEXIST
*/
{ ENOENT, CMD_CREATE, “Unknown set type” },
{ ENOENT, 0, “Unknown set” },
{ EAGAIN, 0, “Sets are busy, try again later” },
{ ERANGE, CMD_CREATE, “No free slot remained to add a new set” },
{ ERANGE, 0, “IP/port/element is outside of the set or set is full” },
{ ENOEXEC, CMD_CREATE, “Invalid parameters to create a set” },
{ ENOEXEC, CMD_SWAP, “Sets with different types cannot be swapped” },
{ EEXIST, CMD_CREATE, “Set already exists” },
{ EEXIST, CMD_RENAME, “Set with new name already exists” },
{ EEXIST, 0, “Set specified as element does not exist” },
{ EBUSY, 0, “Set is in use, operation not permitted” },
};
for (i = 0; i < sizeof(table)/sizeof(struct translate_error); i++) {
if ((table[i].cmd == cmd || table[i].cmd == 0)
&& table[i].err == err)
exit_error(err == EPROTO ? VERSION_PROBLEM
: OTHER_PROBLEM,
table[i].message);
}
exit_error(OTHER_PROBLEM, “Error from kernel: %s”, strerror(err));
}

[/quote]

J’ai lancé la même procédure sur mon dédié, kif-kif avec un fichier UNITED_STATES.list de 42295 blocks d’IP.

# while read ln; do ipset -A UNITED_STATES $ln; done < UNITED_STATES.list ipset v2.5.0: IP/port/element is outside of the set or set is full

Un Z’idée …

Salut,

Autre bizarrerie …

# while read ln; do ipset -A block3 $ln; done < AFGHANISTAN.list ipset v2.5.0: -A requires setname and IP Try `ipset -H' or 'ipset --help' for more information. :~/.ipset_block.list#

[quote]–add -A setname IP
Add an IP to a set
[/quote]

afficher 5710 regles avec iptable -L c’est long :confused:
je suis a 5710 regles

je drop tout et j’autorise que les CIDR français sur 22 et 80
y a pas moyen d’englober toutes les regles dans une liste blanche ? afin que ça soit plus leger et plus lisible

[quote=“loreleil”]Autre bizarrerie …
ipset v2.5.0: -A requires setname and IP
[/quote]
Tu dois sans doute avoir une ligne vide dans ton fichier d’ip. essaye avec ceci:

Cela dit, à chaque tour de boucle, tu invoques la commande ipset. Il vaudrait mieux stocker toutes les lignes dans un fichier au format ipset --save et de l’exécuter avec un ipset --restore. Même principe que pour iptables-save vs iptables.

[quote=“tonyx”]afficher 5710 regles avec iptable -L c’est long :confused:
je suis a 5710 regles
je drop tout et j’autorise que les CIDR français sur 22 et 80
y a pas moyen d’englober toutes les regles dans une liste blanche ? afin que ça soit plus leger et plus lisible[/quote]
Bien sûr. C’est le principe de la discrimination positive. Tu mets la policy par défaut de la chaîne INPUT à DROP et ensuite tu autorises les ip légitimes. N’oublie pas de commencer par ton ip (lan ou wan)!

après avoir vu un iptables -L qui dégeule 5000 lignes c’est tout simplement pas possible.

je vais utiliser ipset et iptables.
ipset + iptables c’est assé violent et coupe les connections en cours.

ipset -N test_local nethash
ipset --add test_local 10.8.0.0/24

ipset --list
Name: test_local
Type: nethash
References: 0
Default binding: 
Header: hashsize: 1024 probes: 4 resize: 50
Members:
10.8.0.0/24
Bindings:

iptables -I INPUT -m set --match-set test_local src -j DROP

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            match-set test_local src 
fail2ban-ssh-ddos  tcp  --  anywhere             anywhere            multiport dports ssh 
fail2ban-ssh-custom  tcp  --  anywhere             anywhere            multiport dports ssh 
fail2ban-ssh  tcp  --  anywhere             anywhere            multiport dports ssh 
fail2ban-apache  tcp  --  anywhere             anywhere            multiport dports www,https 
fail2ban-apache-noscript  tcp  --  anywhere             anywhere            multiport dports www

c’est carrément mieux.

au lieu de jouer avec iptables et ipset peut on faire ce genre ce chose dans un switch manageable ?
je peux éventuellement en demander un a mon chef, et voir si c’est pas mieux.
je dois manipuller du netdisco pour apprendre par telnet évidament, si vous avez de la doc la-dessus en Français de préférence je veux bien.

on va dire que c’est résolu je crois avoir fait le tour.

[quote=“ggoodluck47”]Salut,

A ta place je chercherais comment accepter la France et deby of all :slightly_smiling:[/quote]

après coup, c’est sur qu’il vaut mieux interdire tout le monde et autoriser une liste.

je colle tout dans /etc/rc.local j’ai pas trouvé mieux comme nis

[code]
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

besoin de dnsmasq faut pas chercher plus

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i eth4 -j ACCEPT
iptables -A OUTPUT -o eth4 -j ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -t nat -A POSTROUTING -j MASQUERADE

tout les ports entrant sont autorisé sur le reseau local

/sbin/iptables + les regles /usr/sbin/ipset

/usr/sbin/ipset -N local nethash
/usr/sbin/ipset -N france nethash
sh /root/iptables/local.sh
sh /root/iptables/france.sh
/sbin/iptables -A INPUT -m set --match-set local src -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m set --match-set france src -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 80 -m set --match-set france src -j ACCEPT
/etc/init.d/dnsmasq start
exit 0[/code]

résultat:

iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
fail2ban-ssh-ddos  tcp  --  0.0.0.0/0            0.0.0.0/0           multiport dports 22 
fail2ban-ssh-custom  tcp  --  0.0.0.0/0            0.0.0.0/0           multiport dports 22 
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0           multiport dports 22 
fail2ban-apache  tcp  --  0.0.0.0/0            0.0.0.0/0           multiport dports 80,443 
fail2ban-apache-noscript  tcp  --  0.0.0.0/0            0.0.0.0/0           multiport dports 80 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           match-set local src 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 match-set france src 
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 match-set france src 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain fail2ban-apache (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

Chain fail2ban-apache-noscript (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

Chain fail2ban-ssh (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

Chain fail2ban-ssh-custom (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           

Chain fail2ban-ssh-ddos (1 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
Vous avez du courrier dans /var/mail/root

merci a tous pour votre aide,

personne a répondu a ma question plus haut:

[quote]au lieu de jouer avec iptables et ipset peut on faire ce genre ce chose dans un switch manageable ?
je peux éventuellement en demander un a mon chef, et voir si c’est pas mieux.
je dois manipuller du netdisco pour apprendre par telnet évidament, si vous avez de la doc la-dessus en Français de préférence je veux bien.[/quote]