GNU/Linux >> Linux Esercitazione >  >> Linux

sysctl impostazione per carico elevato e prevenzione DDoS

Introduzione

Esistono diversi esempi di configurazioni del kernel Linux su Internet per supportare un gran numero di connessioni, progetti Web fortemente caricati e contrastare gli attacchi DDoS. Ecco un altro esempio che ho già potuto provare nella pratica. Lo dirò subito:mi ha più che aiutato. Provalo e tu.

Opzioni/etc/sysctl.conf

C'è un elenco di opzioni necessarie da aggiungere a /etc/sysctl.conf :

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_mem = 50576   64768   98152
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_syncookies = 0
net.ipv4.netfilter.ip_conntrack_max = 16777216
net.netfilter.nf_conntrack_max = 16777216
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.route.flush = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_forward = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 1000
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
fs.inotify.max_user_watches = 16777216

E ora su ciascuna opzione in modo più dettagliato.

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0

Non accettare o inviare pacchetti di reindirizzamento ICMP. I reindirizzamenti ICMP possono essere utilizzati da un utente malintenzionato per modificare le tabelle di routing. Si consiglia di impostarlo a “0 ″. L'unità ha senso solo per host utilizzati come router.

net.ipv4.tcp_max_orphans = 65536

Il valore intero del parametro tcp_max_orphans determina il numero massimo di socket TCP validi nel sistema che non sono collegati da alcun filehandle utente. Quando viene raggiunto il valore di soglia, i composti orfani vengono immediatamente ripristinati con un avviso. Questa soglia aiuta a prevenire solo semplici attacchi DoS. Non dovresti ridurre il valore di soglia (piuttosto aumentarlo in base ai requisiti del sistema, ad esempio dopo aver aggiunto memoria. Ogni connessione orfana assorbe circa 64 Kbyte di memoria non scambiabile).

net.ipv4.tcp_fin_timeout

net.ipv4.tcp_fin_timeout = 10

Il parametro tcp_fin_timeout determina l'ora in cui il socket rimane nello stato FIN-WAIT-2 dopo essere stato chiuso dal lato locale. Il partner potrebbe non chiudere mai questa connessione, quindi dovresti chiuderla di tua iniziativa dopo un timeout. Per impostazione predefinita, il timeout è di 60 secondi. Nei core della serie 2.2 si usava solitamente un valore di 180 secondi ed è possibile salvare questo valore, ma non bisogna dimenticare che sui server WEB caricati si corre il rischio di consumare molta memoria per salvare connessioni morte semiinterrotte. I socket nello stato FIN-WAIT-2 sono meno pericolosi di FIN-WAIT-1 perché non assorbono più di 1,5 Kbyte di memoria, ma possono durare più a lungo.

Tempo keep-alive TCP

net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5

tcp_keepalive_time La variabile determina la frequenza con cui controllare la connessione se non viene utilizzata da molto tempo. Il valore della variabile ha senso solo per quei socket che sono stati creati con il flag SO_KEEPALIVE. La variabile intera tcp_keepalive_intvl definisce l'intervallo di campionamento. Il prodotto tcp_keepalive_probes * tcp_keepalive_intvl determina il tempo dopo il quale la connessione verrà disconnessa se non ci sono risposte. Di default l'intervallo è di 75 secondi, ovvero il tempo di disconnessione in assenza di risposte sarà di circa 11 minuti.

net.ipv4.tcp_max_syn_backlog = 4096

Il valore intero nel file tcp_max_syn_backlog definisce il numero massimo di richieste di connessione memorizzate per le quali non è stata ricevuta alcuna conferma dal client di connessione. Se si verifica un sovraccarico sul server, puoi provare ad aumentare questo valore.

net.ipv4.tcp_synack_retries = 1

Il valore intero (1 byte) tcp_synack_retries determina il numero di tentativi per trasmettere pacchetti SYNACK per connessioni TCP passive. Il numero di tentativi non deve superare 255. Un valore di 5 corrisponde a circa 180 secondi per il tentativo di stabilire una connessione.

net.ipv4.tcp_mem

net.ipv4.tcp_mem = 50576   64768   98152

La variabile vettoriale (minimo, modalità di caricamento, massimo) nel file tcp_mem contiene le impostazioni generali del consumo di memoria per il protocollo TCP. Questa variabile è misurata in pagine (di solito 4kb), non in byte.

Minimo :mentre la dimensione totale della memoria per le strutture del protocollo TCP è inferiore a questo numero di pagine, il sistema operativo non fa nulla.

Modalità di caricamento :non appena il numero di pagine di memoria allocate per il protocollo TCP raggiunge questo valore, viene attivata la modalità di caricamento, in cui il sistema operativo tenta di limitare l'allocazione di memoria. Questa modalità viene mantenuta fino a quando il consumo di memoria non raggiunge nuovamente il livello minimo.

Massimo :il numero massimo di pagine di memoria consentite per tutti i socket TCP.

net.ipv4.tcp_rmem

net.ipv4.tcp_rmem = 4096 87380 16777216

La variabile vettoriale (minimo, predefinito, massimo) nel file tcp_rmem contiene 3 numeri interi che determinano la dimensione del buffer di ricezione del socket TCP.

Minimo :ogni socket TCP ha il diritto di utilizzare questa memoria al momento della sua creazione. La possibilità di utilizzare tale buffer è garantita anche al raggiungimento della soglia del limite (moderata pressione della memoria). La dimensione minima del buffer predefinita è 8 KB (8192).

Valore predefinito :la quantità di memoria consentita per il buffer di trasferimento socket TCP predefinito. Questo valore viene utilizzato al posto del parametro /proc/sys/net/core/rmem_default utilizzato da altri protocolli. Il valore predefinito del buffer (di solito) è 87830 byte. Questo determina la dimensione della finestra di 65535 con il valore predefinito di tcp_adv_win_scale e tcp_app_win =0, leggermente inferiore al valore predefinito di tcp_app_win.

Massimo :La dimensione massima del buffer può essere assegnata automaticamente per ricevere un socket TCP. Questo valore non annulla il massimo specificato nel file /proc/sys/net/core/rmem_max. Con l'allocazione di memoria "statica" utilizzando SO_RCVBUF, questo parametro non ha importanza.

net.ipv4.tcp_wmem

net.ipv4.tcp_wmem = 4096 65536 16777216

La variabile vettoriale nel file tcp_wmem contiene 3 valori interi che definiscono la quantità minima, predefinita e massima di memoria riservata ai buffer di trasferimento dei socket TCP.

Minimo :ogni socket TCP ha il diritto di utilizzare questa memoria al momento della sua creazione. La dimensione minima del buffer predefinita è 4 KB (4096)

Valore predefinito :la quantità di memoria consentita per il buffer di trasferimento socket TCP predefinito. Questo valore viene utilizzato al posto del parametro /proc/sys/net/core/wmem_default utilizzato da altri protocolli e in genere è inferiore a /proc/sys/net/core/wmem_default. La dimensione del buffer predefinito è solitamente (predefinita) 16 Kbyte (16384).

Massimo :la quantità massima di memoria che può essere allocata automaticamente per il buffer di trasmissione del socket TCP. Questo valore non sovrascrive il massimo specificato nel file /proc/sys/net/core/wmem_max. Con l'allocazione di memoria "statica" utilizzando SO_SNDBUF, questo parametro non ha importanza.

net.ipv4.tcp_orphan_retries =0

Il valore intero tcp_orphan_retries determina il numero di tentativi falliti, dopodiché la connessione TCP chiusa sul lato locale viene distrutta. Il valore predefinito è 7, che corrisponde a circa un periodo compreso tra 50 secondi e 16 minuti, a seconda dell'RTO. Su server WEB molto carichi ha senso ridurre il valore di questo parametro poiché le connessioni chiuse possono consumare molte risorse.

net.ipv4.tcp_syncookies =0

In relazione alla raccomandazione degli sviluppatori del kernel, è meglio disabilitare questa opzione.

net.ipv4.netfilter.ip_conntrack_max =16777216

Il numero massimo di connessioni per il funzionamento del meccanismo di tracciamento delle connessioni (utilizzato, ad esempio, iptables). Se i valori sono troppo piccoli, il kernel inizia a rifiutare le connessioni in entrata con la voce corrispondente nel registro di sistema.

net.ipv4.tcp_timestamps =1

Consente timestamp TCP. La loro presenza consente di controllare il funzionamento del protocollo sotto carichi elevati (vedi tcp_congestion_control).

net.ipv4.tcp_sack = 1

Consenti il ​​riconoscimento selettivo del supporto TCPIP. Questa opzione è necessaria per l'uso efficiente di tutta la larghezza di banda disponibile di alcune reti.

net.ipv4.tcp_congestion_control = htcp

Protocollo, utilizzato per il controllo del carico nelle reti TCP. Le implementazioni predefinite bic e cubic contengono bug nella maggior parte delle versioni del kernel RedHat e dei suoi cloni. Si consiglia di utilizzare htcp.

net.ipv4.tcp_no_metrics_save = 1

Non salvare le misurazioni della connessione TCP nella cache quando è chiusa. In alcuni casi, aiuta ad aumentare la produttività.

Difesa dallo spoofing IP

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

Disabilita il routing di origine

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

net.ipv4.ip_local_port_range

net.ipv4.ip_local_port_range = 1024 65535

Aumenta la gamma di porte locali disponibili per le connessioni in uscita.

net.ipv4.tcp_tw_reuse = 1

Consentiamo il riutilizzo dei socket TIME-WAIT nei casi in cui il protocollo lo considera sicuro.

net.ipv4.tcp_window_scaling = 1

Consenti il ​​ridimensionamento dinamico della finestra dello stack TCP.

net.ipv4.tcp_rfc1337 = 1

Difesa dall'attacco TIME_WAIT.

net.ipv4.ip_forward = 0

Vietiamo l'inoltro di pacchetti, poiché non siamo un router.

net.ipv4.icmp_echo_ignore_broadcasts = 1

Non rispondiamo alle richieste ICMP ECHO trasmesse dai pacchetti broadcast.

net.ipv4.icmp_echo_ignore_all = 1

Non puoi rispondere affatto alle richieste ICMP ECHO (il server non eseguirà il ping).

net.ipv4.icmp_ignore_bogus_error_responses = 1

Non rispondiamo a messaggi formati in modo errato.

net.core.somaxconn = 65535

Il numero massimo di socket aperti in attesa di una connessione. Ha senso aumentare il valore predefinito.

net.core.netdev_max_backlog = 1000

Il parametro determina il numero massimo di pacchetti nella coda di elaborazione se l'interfaccia riceve i pacchetti più velocemente di quanto il kernel possa elaborarli.

Memoria massima predefinita

net.core.rmem_default = 65536

La dimensione predefinita del buffer di ricezione dei dati per tutte le connessioni.

net.core.wmem_default = 65536

La dimensione predefinita del buffer di trasferimento dati per tutte le connessioni.

net.core.rmem_max = 16777216

La dimensione massima del buffer di ricezione dati per tutte le connessioni.

net.core.wmem_max = 16777216

Dimensione massima del buffer di dati per tutte le connessioni.


Linux
  1. Bash For Loop Guida ed esempi

  2. Analisi dei casi a favore e contro l'impostazione dello spazio di scambio su istanze cloud

  3. Scrivi per le FAQ di Atlantic.Net

  4. Linee guida per l'applicazione e le prove di carico

  5. Imposta SFTP e Previeni SSH su Ubuntu 20.04

Configurazione dell'ambiente di sviluppo .NET e degli strumenti su Fedora 35

Conservazione e disponibilità elevata:argomenti avanzati

Che cos'è un DDoS e come possiamo impedire che la nostra attività venga attaccata?

Interfaccia a nastro per GTK e Qt

A quanto può arrivare il carico di sistema?

Bridging Linux per KVM