Apache à tarif réduit avec liste noire et liste blanche

2

J'ai passé plusieurs heures à essayer de configurer iptables / ufw de cette manière pour les requêtes HTTP gérées par Apache2:

Liste blanche d'un ensemble de plages d'adresses IP (robots de moteur de recherche) Ajouter des adresses IP à une liste de blocage de 24 heures après X requêtes en Y secondes (idéalement, j'aimerais définir trois règles comme celle-ci)

Mais il me semblait qu’il n’était pas possible de faire cela avec iptables car cela interdirait les IP pendant une courte période.

Est-ce que quelqu'un sait s'il est possible de faire ce que j'ai décrit peut être réalisé avec mod_security? Ou recommander quelque chose qui peut faire cela? Tous les extraits de code faisant quelque chose de similaire seraient les bienvenus.

Kohjah Breese
la source

Réponses:

1

Tout ce que vous cherchez est disponible dans netfilter (et bien plus! ;-)).

La correspondance d'un ensemble de plages IP avec la liste blanche peut être effectuée avec des jeux de composants IP et l'extension de correspondance «set»:

ipset -N whitelist nethash

ipset --add whitelist 1.2.3.4/24

Puis dans iptables de netfilter:

iptables -A INPUT -m set --match-set whitelist src -j ACCEPT

Pour bloquer pendant 24 heures, vous avez besoin des extensions de correspondance «récentes» deux fois: une pour vérifier le débit entrant et une pour se souvenir des sources bloquées:

iptables -N BLOCK24
iptables -A BLOCK24 -m recent --name blocked --set

iptables -A INPUT -m recent --name beforeblock --rcheck --seconds 1 --hitcount 1 -j BLOCK24

Cela correspondra si deux paquets en une seconde. Et maintenant, pour bloquer les sources, faites simplement correspondre la liste récente «bloquée». Cette règle devrait bien sûr figurer parmi les premières de vos règles iptables.

iptables -A INPUT -m recent --name blocked --recheck --seconds 86400 -j DROP

Le document nécessaire est ici: extensions iptables et ipsets . Bien sûr, peut ajouter -p tcp --dport 80si ces règles doivent s’appliquer uniquement à http.

Zimmi
la source
0

Quelques ajustements ont été nécessaires sur ce qui précède. Cela marche:

sudo ipset -N whitelist nethash
sudo ipset --add whitelist 68.180.228.175
sudo iptables -A INPUT -m set --match-set whitelist src -j ACCEPT
sudo iptables -N BLOCK24
sudo iptables -A BLOCK24 -m recent --name blocked --set
sudo iptables -A INPUT -m state --state NEW -m recent --set
sudo iptables -A INPUT -m state --state NEW -m recent --update --seconds 20 --hitcount 20 -j BLOCK24
sudo iptables -A INPUT -m recent --name blocked --rcheck --seconds 86400 -j BLOCK24
sudo iptables -A BLOCK24 -j LOG --log-prefix='[NETFILTER] ' --log-level 7
sudo iptables -A BLOCK24 -j REJECT
Kohjah Breese
la source