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?
Abbiamo un server Ubuntu 12.04 con httpd sulla porta 80 e vogliamo limitare:
Come possiamo farlo con iptables?
Risposte:
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.
-m conntrack --ctstate
al posto di -m state --state
. conntrack è nuovo e migliorato rispetto allo stato.
NEW
connessioni - non farlo - trasforma efficacemente la tua INPUT
catena in un valore predefinito accept
!!!
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.
È necessario utilizzare i connlimit
moduli 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