Evita un attacco Protezione con iptables Ha molti modi per farlo, in base alla dimensione del pacchetto, al limite di connessione, ecc. Qui vedremo come, in modo facile, intuitivo e ben spiegato, raggiungeremo l'obiettivo, oltre a fermare altri fastidiosi attacchi ai nostri server.
# Iptables
IPT="/sbin/iptables"
ETH="eth0"
#Todo el tráfico syn
$IPT -P INPUT DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp ! --syn -j REJECT --reject-with tcp-reset
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -P OUTPUT DROP
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p tcp ! --syn -j REJECT --reject-with tcp-reset
$IPT -A OUTPUT -m state --state INVALID -j DROP
$IPT -P FORWARD DROP
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p tcp ! --syn -j REJECT --reject-with tcp-reset
$IPT -A FORWARD -m state --state INVALID -j DROP
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A FORWARD -i lo -o lo -j ACCEPT
#Cuando sube la carga
$IPT -A INPUT -p tcp --syn -j REJECT --reject-with icmp-port-unreachable
#La que mejor va
$IPT -N syn-flood
$IPT -A syn-flood -m limit --limit 100/second --limit-burst 150 -j RETURN
$IPT -A syn-flood -j LOG --log-prefix "SYN flood: "
$IPT -A syn-flood -j DROP
#Igual que el de arriba pero muy raw
$IPT -N syn-flood
$IPT -A INPUT -i eth0:2 -p tcp --syn -j syn-flood
$IPT -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPT -A syn-flood -j DROP
$IPT -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -m limit --limit 1/sec -j ACCEPT
#Descartar paquetes mal formados
$IPT -N PKT_FAKE
$IPT -A PKT_FAKE -m state --state INVALID -j DROP
$IPT -A PKT_FAKE -p tcp --dport 80 --tcp-flags ALL ACK,RST,SYN,FIN -j DROP
$IPT -A PKT_FAKE -p tcp --dport 80 --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -A PKT_FAKE -p tcp --dport 80 --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A PKT_FAKE -p tcp --dport 80 ! --syn -m state --state NEW -j DROP
$IPT -A PKT_FAKE -f -j DROP
$IPT -A PKT_FAKE -j RETURN
#Syn-flood
$IPT -N syn-flood
$IPT -A INPUT -i eth+ -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j syn-flood
$IPT -A FORWARD -i eth+ -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j syn-flood
$IPT -A syn-flood -m limit --limit 4/s --limit-burst 16 -j RETURN
$IPT -A syn-flood -m limit --limit 75/s --limit-burst 100 -j RETURN -A syn-flood -j LOG --log-prefix "SYN FLOOD " --log-tcp-sequence --log-tcp-options --log-ip-options -m limit --limit 1/second
$IPT -A syn-flood -j DROP
#Requiere módulo "recent"
modprobe ipt_recent
$IPT -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
$IPT -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 -j DROP
# explicación:
# Se añade cada ip que se conecte a la tabla de recent
# Por por cada ip en la tabla de recent si hace mas de x hits en x segundos, se dropea.
$IPT -I INPUT -p tcp --syn -m recent --set
$IPT -I INPUT -p tcp --syn -m recent --update --seconds 10 --hitcount 30 -j DROP
#UDP Flood
$IPT -A OUTPUT -p udp -m state --state NEW -j ACCEPT
$IPT -A OUTPUT -p udp -m limit --limit 100/s -j ACCEPT
$IPT -A OUTPUT -p udp -j DROP
Quello che fa è contare il numero di pacchetti SYN (Avvio della connessione TCP) per ogni indirizzo IP negli ultimi 10 secondi. Se raggiunge 30, scarta quel pacchetto in modo che la connessione non venga stabilita (TCP riproverà più volte, quando scende al di sotto del limite che può essere impostato).
#Evitando Layer7 DoS limitando a 80 la máxima cantidad de conexiones
$IPT -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-upto 50/min --hashlimit-burst 80 --hashlimit-mode srcip --hashlimit-name http -j ACCEPT
$IPT -A INPUT -p tcp --dport 80 -j DROP
#Permitir el ping, pero a 1 paquete por segundo, para evitar un ataque ICMP Flood
$IPT -A INPUT -p icmp -m state --state NEW --icmp-type echo-request -m limit --limit 1/s --limit-burst 1 -j ACCEPT
$IPT -A INPUT -p icmp -j DROP
#Evitando que escaneen la máquina
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE –j DROP
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN –j DROP
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags SYN,RST SYN,RST –j DROP
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags FIN,RST FIN,RST –j DROP
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags ACK,FIN FIN –j DROP
$IPT -A INPUT -i $ETH -p tcp -m tcp --tcp-flags ACK,URG URG –j DROP
Ecco lo script nel nostro Paste: Incolla.DesdeLinux.net (script precedente)
riferimenti:
- Cercando di fermare un DDoS (Forum di ElHacker.net)
- Come evitare un attacco DDoS e come sperimentarlo su server reali? (Forum di ElHacker.net)
- Script con condizionali (MaliByte.net)
- Un ottimo esempio (LinuxGuruz.org)
- Prevenire un attacco DDoS (LinuxSecurity.com)
- Rafforzare lo stack TCP / IP per prevenire attacchi (SecurityFocus.com)
Ed è per questo che ho inserito un tutorial prima degli attacchi DDoS 😉
Per mettere / spiegare il motivo o il problema (tutorial precedente) e anche darti la soluzione (questo tutorial) 🙂
perfetto.
Caramelle per bambini ...
Buon articolo.
I miei due centesimi:
Nel caso dei pacchetti UDP, il flag SYN non esiste perché è un protocollo senza controllo di stato. Tuttavia, paradossalmente, gli stati NEW e ESTABLISHED esistono perché iptables porta internamente le tabelle per questo scopo.
D'altra parte, secondo me è meglio usare una destinazione DROP invece di REJECT, per due motivi: in primo luogo, con uno scarto si sta dando informazioni a un possibile aggressore, e anche il computer sta usando parte della sua connettività per inviare notifica alla squadra in attacco.
Un'altra cosa è che nel caso del protocollo ICMP (e in generale) è conveniente regolare sia le richieste che le risposte, perché probabilmente a un certo punto siamo interessati a eseguire il ping di noi stessi, e abilitando questa funzionalità qualcuno potrebbe utilizzare un botnet e falsificare l'indirizzo di origine per eseguire il ping di molti di questi PC compromessi senza fine, e le risposte andrebbero al nostro server, facendolo collassare se non fossero imposti limiti.
Di solito consento i tipi ICMP 0,3,8,11 e 12 con un limite di input di uno al secondo e un burst di due o quattro massimo, e tutto il resto è lasciato a DROP.
In realtà, ad eccezione del protocollo TCP che può essere regolato meglio, tutti gli altri dovrebbero essere protetti con una misura anti-DDoS tramite un match di tipo recente. A questo proposito, come curiosità, all'autore di questo modulo piace inserire prima l'aggiornamento e poi il set.
Iptables è davvero molto flessibile e potente, finora l'unica cosa che mi sono proposto di fare e non l'ho ancora raggiunto (anche se sono vicino a raggiungerlo), è abilitare il modulo psd per evitare portscan, ma anche con tutto Ho imparato a conoscere questo strumento, penso di non aver ancora scalfito la superficie. 😉
Comunque, in questo mondo devi sempre studiare.
Buoni punti Hugo, in archivio per il nostro glossario: D, come sempre, imparando ...
A proposito, ho già fatto funzionare il modulo psd per me. Il problema era che inizialmente dipendeva da una funzionalità del kernel che era deprecata insieme a patch-o-matic, quindi è stata rimossa dai moduli incorporati in netfilter per impostazione predefinita. Quindi ora in Debian per usare l'estensione psd, prima devi fare questo:
aptitude -RvW install iptables-dev xtables-addons-{common,source} module-assistant
module-assistant auto-install xtables-addons-source
Può quindi essere utilizzato normalmente, secondo le istruzioni:
man xtables-addons
Hugo, perché non pubblichi un iptables.sh con i tuoi suggerimenti per migliorare lo script di questo post (che è buono) incluso psd
grazie
Ottimo articolo, eccellente iptables e ottima spiegazione da @hugo. Sono sempre più convinto che ho ancora molto da imparare.
Non sei solo tu, almeno io ... mi manca un milione ... 😀
Ciao a tutti, e grazie per il contributo, ma la verità è che siamo disperati, non sappiamo cosa fare ora, e veniamo da voi per questo degli iptables che sappiamo che siete esperti di sistemi.
Sono il leader di una comunità in Spagna di fonti di counter strike e siamo uno dei pochi che sono ancora a malapena in piedi, stiamo ricevendo attacchi costanti dalla macchina e altri attacchi a intervalli di tempo, la costante rimuove poco ma ingaggia il server poco ma quello che è del tempo fa più danni. La nostra macchina è montata su un 6.2 centesimi
e abbiamo il tcadmin per controllare i server. Potresti farci una configurazione che possa fermare anche un po 'questo tipo di attacco, è che siamo già disperati,
e non sappiamo a chi rivolgerci, sappiamo che ci sono due botnet, una casalinga e l'altra pagata per tempo e forza. Abbiamo quindi sopportato attacchi brutali di questo tipo per quasi un anno, se tu potessi aiutarci saremmo eternamente grati perché ora è insostenibile, adoro configurare server come hoobie, e non sono un bambino che te lo assicuro ma questo è molto per me. Se vuoi che il mio ts3 parli o qualsiasi altra cosa, mi piacerebbe che ci aiutassi, quindi pubblicheremo qui i risultati e tutto ciò che è stato risolto per il bene di molte persone, sarebbe il blog più visitato dell'anno che ti assicuro perché è incredibile come infastidisca questi attacchi ddos. Dato che abbiamo provato a configurarlo da soli e abbiamo bloccato l'accesso alla macchina, abbiamo dovuto formattarlo dal bios, quindi immagina come siamo.
Mando un cordiale saluto. E le mie congratulazioni per il blog mancante, molte persone ne trovano uno aggiornato con questo. -Miguel Angel-
Ciao come stai 🙂
Scrivi alla mia email, saremo felici di aiutarti 😀 -» kzkggaara[@]desdelinux[.]netto
Ciao ragazzi, fino ad ora che sto lavorando, prendete questo script, molto buono tra l'altro ... solo un dubbio: il modulo "recente" non riduce le prestazioni?
Saluti - Grazie / Chi come te?
Ottimo contributo amico mio, ti metto nei riferimenti di un video tutorial che stiamo montando, un abbraccio dal Costa Rica
Ciao,
Non è possibile utilizzare lo script su più porte?
Ho un server di gioco e ricevo attacchi sia al web che alle porte del server di gioco.
Saluti.