Begrenzen Sie die maximale Anzahl an Verbindungen pro IP-Adresse und die Anzahl neuer Verbindungen pro Sekunde mit iptables

Begrenzen Sie die maximale Anzahl an Verbindungen pro IP-Adresse und die Anzahl neuer Verbindungen pro Sekunde mit iptables

Wir haben einen Ubuntu 12.04-Server mit httpd auf Port 80 und möchten Folgendes einschränken:

  • die maximale Anzahl an Verbindungen pro IP-Adresse zu httpd auf 10
  • die maximale Anzahl neuer Verbindungen pro Sekunde zu httpd auf 150

Wie können wir dies mit iptables machen?

Antwort1

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

Dadurch werden mehr als 15 Verbindungen von einer Quell-IP abgelehnt.

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

Dabei sind 160 neue Verbindungen (eigentlich Pakete) zulässig, bevor das Limit von 150 NEUEN Verbindungen (Paketen) pro Sekunde angewendet wird.

Antwort2

Sie möchten, dass die folgenden Regeln in Ihren iptables beide Anforderungen in Ihrer Frage erfüllen:

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

Da wir -I verwenden (gemäß der OP-Anforderung), müssen wir sie in umgekehrter Reihenfolge ausführen, also von unten nach oben „lesen“.

Ich schlage auch vor, die Änderung von --connlimit-mask NN von 32 auf 24 in Betracht zu ziehen. Dadurch wird ein vollständiges Class-C-Netzwerk (max. 256 IP-Adressen im gleichen Bereich) auf 10 Verbindungen beschränkt. Sie können auch jede andere klassenlose Zahl wie 22 oder 30 verwenden, je nachdem, wie Ihr Dienst Ihrer Meinung nach genutzt werden könnte.

Je nachdem, wie sich der Kunde verhalten soll,könntemöchten in den beiden obigen Regeln oder sogar nur in der Regel für maximal 150 Verbindungen „-j REJECT --reject-with tcp-reset“ anstelle von „-j DROP“ verwenden.

Wenn Sie die Verbindung ABLEHNEN, zeigt der Browser oder die Software, die Port 80 verwendet, sofort den Status „nicht verfügbar“ an, aber die Option DROP führt dazu, dass der Client wartet und es einige Male erneut versucht, bevor er die Site als nicht verfügbar meldet. Ich selbst tendiere eher zu DROP, da es sich eher wie eine schlechte Verbindung als wie ein Offline-Server verhält.

Wenn außerdem das Verbindungslimit während des erneuten Versuchs wieder unter 150 (oder 10) fällt, wird die Verbindung schließlich zu Ihrem Server hergestellt.

Die Option REJECT führt jedoch zu etwas weniger Verkehr auf Ihrer Site, da DROP dazu führt, dass während des erneuten Versuchs zusätzliche Pakete gesendet werden. Wahrscheinlich nicht so relevant.

Wenn Ihr Datenverkehr über Port 80 hingegen Teil eines Clusters ist, teilt REJECT dem Cluster-Controller mit, dass dieser ausgefallen ist und dass für die Dauer des Wiederholungs-Timeouts kein Datenverkehr mehr an ihn gesendet werden soll.

Die RELATED,ESTABLISHED-Regel gilt unter der Annahme, dass Ihre Standardregel darin besteht, den gesamten Datenverkehr zu blockieren (iptables -t filter -P INPUT DROP). Dadurch werden nur weitere Pakete akzeptiert, die zu akzeptierten Verbindungen gehören.

Außerdem weist --syn es an, auf die Pakete zu achten (oder sie zu zählen), die eine TCP-Verbindung herstellen.

Antwort3

Sie müssen die connlimitModule verwenden, mit denen Sie die Anzahl paralleler TCP-Verbindungen zu einem Server pro Client-IP-Adresse (oder Adressblock) beschränken können.

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

verwandte Informationen