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.