Limitare le connessioni massime per indirizzo IP e le nuove connessioni al secondo con iptables


37

Abbiamo un server Ubuntu 12.04 con httpd sulla porta 80 e vogliamo limitare:

  • le connessioni massime per indirizzo IP a httpd a 10
  • il numero massimo di nuove connessioni al secondo da httpd a 150

Come possiamo farlo con iptables?

Risposte:


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

Ciò rifiuterà le connessioni superiori a 15 da un IP di origine.

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

In questo 160 sono consentite nuove connessioni (pacchetti realmente) prima che venga applicato il limite di 150 connessioni NUOVE (pacchetti) al secondo.


1
È possibile configurare quanto sopra per funzionare su tutte le porte, non solo sulla porta 80?
EminezArtus

1
Sei sicuro che questo sia per IP?
LatinSuD

2
Per impostare questa regola per tutte le porte, è sufficiente rimuovere --dport 80.
Dan Pritts l'

5
La seconda regola NON funziona su "nuove connessioni". Influisce esplicitamente sulle connessioni esistenti ("STABILITE"). Per fare nuove connessioni, vorresti: stato NUOVO. Si potrebbe anche considerare l'utilizzo -m conntrack --ctstateal posto di -m state --state. conntrack è nuovo e migliorato rispetto allo stato.
Dan Pritts,

2
il commento sopra per aggiungere la seconda regola alle NEWconnessioni - non farlo - trasforma efficacemente la tua INPUTcatena in un valore predefinito accept!!!
Stuart Cardall,

8

Volete che le seguenti regole nel vostro iptables rispondano ad entrambi i requisiti nella vostra domanda:

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

Poiché stiamo usando -I (come da richiesta OP), dobbiamo eseguirli in ordine inverso, quindi "leggili" dal basso verso l'alto.

Suggerisco anche di considerare --connlimit-mask NN da 32 a 24. Ciò limiterà una rete di Classe C completa (max 256 indirizzi IP nello stesso intervallo) a 10 connessioni. Puoi anche usare qualsiasi altro numero senza classe come 22 o 30 a seconda di come pensi che possa essere utilizzato il tuo servizio.

Inoltre, a seconda di come vuoi che si comporti il ​​client, potresti voler usare "-j REJECT --reject-with tcp-reset" invece di "-j DROP" nelle due regole sopra, o anche solo nelle 150 connessioni max regola.

Se rifiuti la connessione, il browser o il software che utilizza la porta 80 mostrerà immediatamente uno stato "non disponibile", ma l'opzione DROP farà attendere e riprovare il client alcune volte prima di segnalare il sito come non disponibile. Tendo ad appoggiarmi al DROP me stesso in quanto si comporta più come una cattiva connessione che un server offline.

Inoltre, se il limite di connessione scende al di sotto di 150 (o 10) mentre sta ancora provando, alla fine raggiungerà il tuo server.

L'opzione REJECT causerà comunque una frazione di traffico in meno al tuo sito, poiché DROP farà sì che invii pacchetti aggiuntivi mentre riprova. Probabilmente non è così rilevante.

Se d'altra parte il traffico della porta 80 fa parte di un cluster, REJECT comunicherà al controller del cluster che è inattivo e interromperà l'invio del traffico per la durata del timeout del tentativo.

La regola CORRELATA, STABILITA è lì sotto il presupposto che la regola predefinita sia quella di bloccare tutto il traffico (iptables -t filter -P INPUT DROP). Questo accetta solo altri pacchetti appartenenti a connessioni accettate.

Inoltre --syn gli dice di prestare attenzione (o contare) ai pacchetti che impostano una connessione TCP.


Grazie per aver camminato nella minuzia di questi comandi.
Txyoji,

Posso ottenere --connlimit-mask per bloccare solo quell'indirizzo IP specifico e non un intero intervallo?
Analogico

--Connlimit-mask 32 è un limite di indirizzo singolo. Cioè, è come una maschera di rete / 32. Qualcosa di meno, come 24 è come una maschera di rete / 24, ignorando gli 8 bit inferiori.
Ian Macintosh,

5

È necessario utilizzare i connlimitmoduli che consentono di limitare il numero di connessioni TCP parallele a un server per indirizzo IP client (o blocco di indirizzi).

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

Ho aggiornato la tua risposta, spero sia ancora OK (perché è necessario "--syn"?). + E che dire del "La massima connessione al secondo (porta 80, tcp) a 150"? Grazie!
evacristina,

--syn significa che la regola esamina solo i pacchetti TCP con il flag syn - il che significa nuove connessioni. Potresti fare più o meno la stessa cosa con -m state --state NOVITÀ, ma probabilmente è più veloce.
Dan Pritts,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.