Vous voulez que les règles suivantes dans votre 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 d’envisager une modification de --connlimit-mask NN de 32 à 24. Ceci limitera un réseau complet de classe C (maximum 256 adresses IP dans la même plage) à 10 connexions. Vous pouvez également utiliser n'importe quel autre nombre sans classe comme 22 ou 30, selon la manière dont votre service pourrait être utilisé.
En fonction de la manière dont vous souhaitez que le client se comporte, vous pouvez également utiliser "-j REJECT --reject-with tcp-reset" au lieu de "-j DROP" dans les deux règles ci-dessus, ou même dans les 150 connexions max. règle.
Si vous REFUSEZ la connexion, le navigateur ou le logiciel utilisant le port 80 affichera immédiatement le statut "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 à m'appuyer moi-même sur DROP, qui se comporte davantage comme une mauvaise connexion que comme un serveur hors ligne.
De plus, si la limite de connexion redescend en dessous de 150 (ou 10) alors que la tentative est en cours, le serveur parviendra à son tour.
L'option REJECT entraînera une fraction de moins de trafic sur votre site, car DROP lui enverra des paquets supplémentaires pendant ses tentatives. Probablement pas tout ce qui est pertinent.
Si, en revanche, le trafic du port 80 fait partie d'un cluster, REJECT informe alors le contrôleur de cluster de son arrêt et arrête de lui envoyer du trafic pendant la durée de son délai d'attente avant tentative.
La règle RELATED, ESTABLISHED est présente dans l'hypothèse où votre règle par défaut consiste à bloquer tout le trafic (iptables -t filter -P INPUT DROP). Cela accepte uniquement les paquets appartenant aux connexions acceptées.
De plus, --syn lui dit de faire attention (ou de compter) les paquets qui établissent une connexion TCP.