OVH Community, your new community space.

Proteggersi da SYN flood?


raffo
16.11.2011, 16.59
Non bastano delle semplici regole iptables per fermare un attacco synflood, bisogna convivere con il grande flusso di dati in modo da non soccombere inondati.

Per farlo ci sono due suggerimenti:

1) configurare un kernel capace di interagire nel miglior modo possibile con i pacchetti della scheda di rete in modo da imporre delle priorita' per i tipi di STATE della connessione, dare priorita' ad ACK. Per BSD il traffic shaping si puo gestire con ALTQ, per linux invece esiste CBQ ed altri.

2) distribuire il traffico su piu server/mc/rps o vps.. e' una questione di fondi ma se gia si prendono 2 kimsufi 2G e si installa OpenBSD (configurando PF, ALTQ..) e si mettono i due server sotto un IP Load Balancer che fornisce gratuitamente OVH allora l'attacco si distribuisce su 3 server avendo un unico IP. I due server kimsufi inoltreranno al server centrale solo le connessioni che hanno superato il check secondo le regole del firewall.

Io un anno e mezzo fa ebbi un forte attacco synflood da milioni di IP e usai circa 9 miniCloud con FreeBSD per assorbire l'attacco durato una settimana.
l'unico "svantaggio" di usare le mC e' che si ha ogni IP per ogni mC e quindi potrebbe essere vulnerabile perche' se chi attacca prende di mira ogni IP questo sistema di difesa si ridicolizza.
Altri datacenter offrono un IP Load Balancer gratuito per i cloud, anche ovh lo offre ma per le mC bisogna acquistare Cisco ACE.

Riccardo-addiction.it
30.09.2011, 10.48
Salve,

recentemente hanno attaccato uno dei miei server. Inizialmente avevo messo regole di drop per bloccare gli ip attaccanti ma questi cambiavano troppo velocemente quindi ho cercato una soluzione più pratica.
Mi sono imbattuto nelle seguenti regole:

Codice:
INPUT:
 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j syn_flood 

syn_flood:
-A syn_flood -m limit --limit 1/sec --limit-burst 3 -j RETURN 
-A syn_flood -j DROP
source: http://www.cyberciti.biz/tips/howto-...n-attacks.html

Cosa ne pensate? Hanno svolto egregiamente il loro compito ma ora mi chiedo se hanno controindicazioni particolari?
Sono sicuramente molto semplici e poco elaborate per cui mi chiedo se queste rischino di compromettere qualche servizio in esecuzione sulla macchina (apache, mysql, ftp)

Attualmente la macchina è ancora sotto attacco. C'è un modo per interrompere il flusso?

Grazie in anticipo.

MnEm0nIc
08.11.2009, 14.32
Citazione Originariamente Scritto da ciberpeppe
Non ho letto tutto il thread...

Ma usare il modulo mod_dosevasive di apache ?
il mod_evasive e' stato consigliato, ma ha senso usarlo se hosti dei siti web, altrimenti non serve a nulla (visto che ad apache non arrivano richieste).

ciao

ciberpeppe
08.11.2009, 13.29
Non ho letto tutto il thread...

Ma usare il modulo mod_dosevasive di apache ?

r00t.ati
24.09.2009, 13.50
Ciao natran,
sto testando il tuo script, ma riguardo a prestazioni ancora non sono molto convinto.
Vedo comunque che il suo sporco lavoro lo fa, quindi ti faccio i miei complimenti.

il programma ddos.sh mi sta fisso al 6-7% di CPU, mentre quando richiami netstat andiamo a 20-25% di consumo CPU.
Ho paura che mi si inchiodi quando vado a fare operazioni di backup giornaliere (dove il consumo CPU e l'utilizzo HDD aumenta e di molto).
Che dici te? Hai consigli?



EDIT= Ho notato che probabilmente ho incollato male, o c'è un problema sul tuo script:
nohup.out mi riporta sempre questo errore:
Codice:
./ddos.sh: line 46: [: too many arguments
La linea 46 per me è questa:
Codice:
46 if [ $CURR_LINE_IP == "0.0.0.0" -o $CURR_LINE_IP == "127.0.0.1" -o $CURR_LINE_IP == "174.133.138.94" -o $CURR_LINE_IP == "89.34.152.193" -o $CURR_LIBNE_IP == "64.18.158.49" ]; then
47 continue
Il mitigationlog è vuoto.

Cosa ho sbagliato?

Conte
23.05.2009, 20.24
ciao ho letto il post...
ho anche io server é ho ripetuti attacchi che mi fanno disconnettere il server per alcuni minuti ..come posso proteggermi da questi flood o come si chiamano ..ringrazio anticipatamente a presto Conte

ibanez89
30.01.2009, 12.14
con il tag code viene bene

natran
29.01.2009, 20.41
Attenzione Allo Script Ddos.sh
Codice:
#!/bin/bash
#set -x

BAN_TIME=600 # 5 mins
CONNECTION_LIMIT=40
BAD_IP_LIST="list2"
UNBAN_ENABLE=0
DEBUG=1
CURR_BAN_LIST=""
LOG_FILE="mitigationlog"

unban()
{
CURRENT_DATE=`date +%s`
UNBAN_SCRIPT="temp_$CURRENT_DATE"
echo '#!/bin/sh' > $UNBAN_SCRIPT
echo "sleep $BAN_TIME" >> $UNBAN_SCRIPT
length=${#CURR_BAN_LIST[@]}
j=0
while [ "$j" -lt "$length" ]; do
echo ${CURR_BAN_LIST[j]} >> $UNBAN_SCRIPT
j+=1
done
echo "rm -f $UNBAN_SCRIPT" >> $UNBAN_SCRIPT
#Run it ;)
. $UNBAN_SCRIPT &
}

while [ true ]; do
CURR_BAN_LIST=""
i=0
# Get current IPs
netstat -anp | grep 'tcp\|udp' | sed -n -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p' | awk '{print$5}' | sed 's/::ffff://' | cut -d: -f1 | sort | uniq -c | sort -n > $BAD_IP_LIST

#netstat -ntu | sed -n -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST
# Iterate over $BAD_IP_LIST file
while read line; do
#Explode line by space and get the first chunck; maybe use sed -n -e '/[0-9]\{1,4\}/p' to be sure it is a number (from 0 to 9999)
CURR_LINE_CONN=$(echo $line | cut -d" " -f1)
#Explode line by space and get the second chunck; also use a regex to be sure it is a real IP
CURR_LINE_IP=$(echo $line | cut -d" " -f2 | sed -n -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p')
#Skip wrong IP address
if [ -z $CURR_LINE_IP ]; then
continue
fi
if [ $CURR_LINE_IP == "0.0.0.0" -o $CURR_LINE_IP == "127.0.0.1" -o $CURR_LINE_IP == "174.133.138.94" -o $CURR_LINE_IP == "89.34.152.193" -o $CURR_LIBNE_IP == "64.18.158.49" ]; then
continue
fi
#Check if the number of connection is lower than $CONNECTION_LIMIT
if [ $CURR_LINE_CONN -lt $CONNECTION_LIMIT ]; then
continue
fi
if [ $DEBUG == "1" ]; then
echo "Banning $CURR_LINE_IP" >> $LOG_FILE
fi
#Ban IP
/sbin/iptables -I INPUT -s $CURR_LINE_IP -j DROP
#TODO: Build banlist array Add IP to unbanlist
if [ $UNBAN_ENABLE == "1" ]; then
CURR_BAN_LIST[i]="/sbin/iptables -D INPUT -s $CURR_LINE_IP -j DROP"
fi
#CURR_BAN_LIST= $CURR_BAN_LIST$TEMP
i+=1
done < $BAD_IP_LIST
#Pause for 0.5 seconds
sleep 5
length=${#CURR_BAN_LIST[@]}
if [ "$length" -gt "2" ]; then
if [ $UNBAN_ENABLE == "1" ]; then
unban
fi
fi
# exit;
done
Attenzione alla parte iniziale dove ci sta #Run it
fate attenzione che va inserito il punto e virgola e la parentesi, se appare lo smile non riuscite a copiarlo in nessuna shell.

PaNz
27.01.2009, 17.57
ci possiamo sentire in qualche modo per parlare direttamente?

irc, mail o msn?

natran
27.01.2009, 16.57
Te lo dico perchè sul mio son riuscito a tenere in piedi il server con un flusso entrante di questa portata:
Codice:
Massima   

Entrata:   	106.4 Mb/s
E riuscivo anche a farci qualcosa ...

natran
27.01.2009, 16.52
Citazione Originariamente Scritto da PaNz
Ho seguito questa guida qua scritta da te.
In seguito ho provato a flooddare il mio dedicato ma non blocca nulla iptables.
Anche se non opportuno in questa sede, mi piacerebbe sapere come *hai provato a floodare il tuo dedicato* ......

PaNz
27.01.2009, 15.20
Citazione Originariamente Scritto da natran
Ok, ti riassumo il tutto da eseguire per mitigare un ddos che possa arrivare anche a 60Mbit di banda lanciata verso il target.
In /home crea la subdirectory /home/tuonome/firewall
All'interno inseriscici
- lo script ddos.sh che ti ho incollato prima
- questo file bash chiamato ipcount
#!/bin/bash
#
netstat -anp | grep 'tcp\|udp' | sed -n -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p' | awk '{print$5}' | sed 's/::ffff://' | cut -d: -f1 | sort | uniq -c | sort -n

- il file mitigationlog
- un file che puoi creare al volo te comprensivo di proxy, socks, private proxy, thor node etc etc chiamato list

Bene, ora hai tutto.
Io lo usavo con il tool nohup, quindi, per lanciare tutto insieme ti basta dare
nohup /home/tuonome/firewall/./ddos.sh &

Sperando sia utile ho deciso di postare il tutto pubblicamente, al tempo stesso spero non dobbiate averne bisogno.
Enjoy

Ho seguito questa guida qua scritta da te.
In seguito ho provato a flooddare il mio dedicato ma non blocca nulla iptables.

natran
27.01.2009, 13.39
Citazione Originariamente Scritto da PaNz
Ciao,

ho provato ad utilizzare lo script postato da natran e non funziona.
Qualcuno può aiutarmi?

Grazie
Domanda banale, come lo hai avviato?

PaNz
27.01.2009, 12.46
Ciao,

ho provato ad utilizzare lo script postato da natran e non funziona.
Qualcuno può aiutarmi?

Grazie

natran
18.01.2009, 17.19
Citazione Originariamente Scritto da Winstar
stasera il flood e' arrivato a 80 megabit 8-|

Provero'la tua soluzione intanti grazie mille. Tuttavia penso che l'attacco provenga da ip random spoofati... e non so bannarli quantosia utile....
Che gli Ip siano spoofati o siano reali poco conta, che sia una botnet o altro non fa chissà quale differenza. Il punto è riuscire a mitigare il ddos, correggendo l'handshake delle connessioni, e, credimi, i tool che ho postato possono servire e funzionare. Come avrai potuto vedere lo script interagisce con una banlist e banna a sua volta (automaticamente, te non devi fare nulla), e sbanna anche (sempre automaticamente).

Se hosti siti web comunque è consigliabile anche che installi il mod_evasive per apache. Questo modulo "intercetta" l'attacco e ritorna l'errore 403 (Forbidden) a colui che è lanciato contro di te.

MnEm0nIc
15.01.2009, 17.39
Citazione Originariamente Scritto da torpado
grazie per la vostra partecipazione attiva al forum. presto verrà riorganizzato in modo tale da rendere facilmente reperibili nel tempo gli aiuti che postate.
potrebbe essere utile mettere su un wiki, magari...

(e magari pensare di mitigare sta roba dai firewall direttamente in farm )

ciao

torpado
15.01.2009, 15.50
Citazione Originariamente Scritto da natran
Vero, visto, come non detto
grazie per la vostra partecipazione attiva al forum. presto verrà riorganizzato in modo tale da rendere facilmente reperibili nel tempo gli aiuti che postate.

natran
15.01.2009, 15.43
Vero, visto, come non detto

TheDarkITA
15.01.2009, 15.42
In fondo c'è:
Tu non puoi inviare gli allegati.

Quindi credo sia disabilitato.

natran
15.01.2009, 15.41
Si possono allegare file di testo al vBullettin qua?Vorrei postare la mia badlist

vhs
15.01.2009, 13.24
Citazione Originariamente Scritto da natran
Scusate il post non "codato", mia dimenticanza, spero comunque possa essere leggibile e, se del caso, utile.
penso di si :P

natran
15.01.2009, 09.08
Scusate il post non "codato", mia dimenticanza, spero comunque possa essere leggibile e, se del caso, utile.

ibanez89
15.01.2009, 00.23
natran usa il tag [code]

Winstar
14.01.2009, 23.51
stasera il flood e' arrivato a 80 megabit 8-|

Provero'la tua soluzione intanti grazie mille. Tuttavia penso che l'attacco provenga da ip random spoofati... e non so bannarli quantosia utile....

natran
14.01.2009, 23.11
Ok, ti riassumo il tutto da eseguire per mitigare un ddos che possa arrivare anche a 60Mbit di banda lanciata verso il target.
In /home crea la subdirectory /home/tuonome/firewall
All'interno inseriscici
- lo script ddos.sh che ti ho incollato prima
- questo file bash chiamato ipcount
#!/bin/bash
#
netstat -anp | grep 'tcp\|udp' | sed -n -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p' | awk '{print$5}' | sed 's/::ffff://' | cut -d: -f1 | sort | uniq -c | sort -n

- il file mitigationlog
- un file che puoi creare al volo te comprensivo di proxy, socks, private proxy, thor node etc etc chiamato list

Bene, ora hai tutto.
Io lo usavo con il tool nohup, quindi, per lanciare tutto insieme ti basta dare
nohup /home/tuonome/firewall/./ddos.sh &

Sperando sia utile ho deciso di postare il tutto pubblicamente, al tempo stesso spero non dobbiate averne bisogno.
Enjoy

natran
14.01.2009, 21.34
Crea uno script bash come questo:
#!/bin/bash
#set -x

BAN_TIME=600 # 5 mins
CONNECTION_LIMIT=40
BAD_IP_LIST="list2"
UNBAN_ENABLE=0
DEBUG=1
CURR_BAN_LIST=""
LOG_FILE="mitigationlog"

unban()
{
CURRENT_DATE=`date +%s`
UNBAN_SCRIPT="temp_$CURRENT_DATE"
echo '#!/bin/sh' > $UNBAN_SCRIPT
echo "sleep $BAN_TIME" >> $UNBAN_SCRIPT
length=${#CURR_BAN_LIST[@]}
j=0
while [ "$j" -lt "$length" ]; do
echo ${CURR_BAN_LIST[j]} >> $UNBAN_SCRIPT
j+=1
done
echo "rm -f $UNBAN_SCRIPT" >> $UNBAN_SCRIPT
#Run it
. $UNBAN_SCRIPT &
}

while [ true ]; do
CURR_BAN_LIST=""
i=0
# Get current IPs
netstat -anp | grep 'tcp\|udp' | sed -n -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p' | awk '{print$5}' | sed 's/::ffff://' | cut -d: -f1 | sort | uniq -c | sort -n > $BAD_IP_LIST

#netstat -ntu | sed -n -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr > $BAD_IP_LIST
# Iterate over $BAD_IP_LIST file
while read line; do
#Explode line by space and get the first chunck; maybe use sed -n -e '/[0-9]\{1,4\}/p' to be sure it is a number (from 0 to 9999)
CURR_LINE_CONN=$(echo $line | cut -d" " -f1)
#Explode line by space and get the second chunck; also use a regex to be sure it is a real IP
CURR_LINE_IP=$(echo $line | cut -d" " -f2 | sed -n -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p')
#Skip wrong IP address
if [ -z $CURR_LINE_IP ]; then
continue
fi
if [ $CURR_LINE_IP == "0.0.0.0" -o $CURR_LINE_IP == "127.0.0.1" -o $CURR_LINE_IP == "174.133.138.94" -o $CURR_LINE_IP == "89.34.152.193" -o $CURR_LIBNE_IP == "64.18.158.49" ]; then
continue
fi
#Check if the number of connection is lower than $CONNECTION_LIMIT
if [ $CURR_LINE_CONN -lt $CONNECTION_LIMIT ]; then
continue
fi
if [ $DEBUG == "1" ]; then
echo "Banning $CURR_LINE_IP" >> $LOG_FILE
fi
#Ban IP
/sbin/iptables -I INPUT -s $CURR_LINE_IP -j DROP
#TODO: Build banlist array Add IP to unbanlist
if [ $UNBAN_ENABLE == "1" ]; then
CURR_BAN_LIST[i]="/sbin/iptables -D INPUT -s $CURR_LINE_IP -j DROP"
fi
#CURR_BAN_LIST= $CURR_BAN_LIST$TEMP
i+=1
done < $BAD_IP_LIST
#Pause for 0.5 seconds
sleep 5
length=${#CURR_BAN_LIST[@]}
if [ "$length" -gt "2" ]; then
if [ $UNBAN_ENABLE == "1" ]; then
unban
fi
fi
# exit;
done

Salvalo in /root o /home come se più comodo.
Nella stessa path crea il mitigationlog, che è dove va a scrivere, a loggare.
Nel mio caso, quando ho avuto necessità di usarlo, era tutto in /home
Poi eseguilo. Questo è comunque uno dei modi per mitigare un eventuale Ddos, ne esistono altri che puoi trovare comodamente online, questo invece è *fatto in casa*, e funziona.

Winstar
14.01.2009, 17.56
Si grazie ti manderei volentieri una mail ma mi dice che la tua mail non è accessibile pubblicamente... come facciamo?

grazie

natran
14.01.2009, 14.29
Per avere un idea se sia un DOS o un dDos prova a dare il comando
netstat -an | grep SYN in modo da farti un idea di quanti IP ti stanno attaccando.
Se hai bisogno contattami via mail che trovi sul mio profilo, ho altre indicazioni più approfondite ed efficaci

Winstar
14.01.2009, 11.02
Ciao a tutti

ieri notte il mio server privato Linux è stato oggetto di ripetuti attacchi DOS leggendo il file /var/log/messages pare che si trattasse di SYN flood. Dal grafico MRTG si evidenzia un flusso di dati di 50-60 megabit in ingresso. Durante il flood non riuscivo nemmeno ad accedere in ssh. Mi chiedo: è possibile proteggersi da un attacco del genere e se si come?

grazie.

P.s.: non so dire se il flood abbia saturato le risorse del server o piuttosto semplicemente la connessione...