web-dev-qa-db-fra.com

Limitez le nombre maximal de connexions par adresse IP et de nouvelles connexions par seconde avec iptables

Nous avons un serveur Ubuntu 12.04 avec httpd sur le port 80 et nous voulons limiter:

  • le nombre maximal de connexions par adresse IP à httpd à 10
  • le maximum de nouvelles connexions par seconde à httpd à 150

Comment pouvons-nous faire cela avec iptables?

37
evachristine
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 32 -j REJECT --reject-with tcp-reset  

Cela rejettera les connexions supérieures à 15 d'une IP source.

iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 150/second --limit-burst 160 -j ACCEPT  

Dans ce cas, 160 nouvelles connexions (vraiment des paquets) sont autorisées avant que la limite de 150 nouvelles connexions (paquets) par seconde ne soit appliquée.

49
totti

Vous voulez que les règles suivantes dans vos iptables répondent aux deux exigences de votre question:

iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT

iptables -t filter -I INPUT -p tcp --dport 80 -m state \
  --state RELATED,ESTABLISHED -j ACCEPT

# Adjust "--connlimit-above NN" to limit the maximum connections per IP
#   that you need.
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
  --connlimit-above 10 --connlimit-mask 32 -j DROP

# Adjust "--connlimit-above NNN" to the maximum total connections you
#   want your web server to support
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
  --connlimit-above 150 -j DROP

Parce que nous utilisons -I (conformément à la demande OP), nous devons les faire dans l'ordre inverse afin de les "lire" de bas en haut.

Je suggère également de considérer le changement NN du masque --connlimit-mask de 32 à 24. Cela limitera un réseau complet de classe C (max 256 adresses IP dans la même plage) à 10 connexions. Vous pouvez également utiliser tout autre numéro sans classe tel que 22 ou 30, selon la façon dont vous pensez que votre service pourrait être utilisé.

En fonction également de la façon dont vous souhaitez que le client se comporte, vous peut-être souhaitez utiliser "-j REJECT --reject-with tcp-reset" au lieu de "-j DROP" dans les deux règles ci-dessus, ou même uniquement dans la règle des 150 connexions max.

Si vous REJETTEZ la connexion, le navigateur ou le logiciel utilisant le port 80 affichera immédiatement un état "non disponible", mais l'option DROP fera attendre et réessayer le client plusieurs fois avant de signaler le site comme non disponible. J'ai tendance à me pencher sur le DROP moi-même car il se comporte plus comme une mauvaise connexion qu'un serveur hors ligne.

De plus, si la limite de connexion redescend en dessous de 150 (ou 10) alors qu'elle est encore en cours de tentative, elle parviendra enfin à votre serveur.

L'option REJETTER entraînera cependant une fraction de trafic en moins sur votre site, car DROP l'obligera à envoyer des paquets supplémentaires pendant sa nouvelle tentative. Probablement pas tout à fait pertinent.

Si, d'autre part, le trafic de votre port 80 fait partie d'un cluster, alors REJECT indiquera au contrôleur de cluster qu'il est arrêté et arrêtera de lui envoyer du trafic pendant la durée de son délai de nouvelle tentative.

La règle RELATED, ESTABLISHED est là en supposant que votre règle par défaut est de bloquer tout le trafic (iptables -t filter -P INPUT DROP). Cela accepte simplement les paquets supplémentaires appartenant aux connexions acceptées.

--Syn lui dit également de faire attention (ou de compter) les paquets qui établissent une connexion TCP.

8
Ian Macintosh

Vous devez utiliser les modules connlimit qui vous permettent de restreindre le nombre de connexions parallèles TCP à un serveur par adresse IP client (ou bloc d'adresse).

/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
      --connlimit-above 10 -j DROP
5
Raman_Singh