"Possibile allagamento SYN" nel registro nonostante il basso numero di connessioni SYN_RECV


30

Recentemente abbiamo avuto un server Apache che stava rispondendo molto lentamente a causa dell'inondazione SYN. La soluzione alternativa era abilitare tcp_syncookies ( net.ipv4.tcp_syncookies=1 in /etc/sysctl.conf).

Ho pubblicato una domanda su questo qui se vuoi più background.

Dopo aver abilitato i syncookie abbiamo iniziato a vedere il seguente messaggio in / var / log / messages circa ogni 60 secondi:

[84440.731929] possible SYN flooding on port 80. Sending cookies.

Vinko Vrsalovic mi ha informato che questo significa che il backlog di syn si sta riempiendo, quindi ho aumentato tcp_max_syn_backlog a 4096. Ad un certo punto ho anche abbassato tcp_synack_retries a 3 (invece del valore predefinito di 5) emettendo sysctl -w net.ipv4.tcp_synack_retries=3. Dopo aver fatto ciò, la frequenza sembrava diminuire, con l'intervallo dei messaggi che variava tra circa 60 e 180 secondi.

Successivamente ho emesso sysctl -w net.ipv4.tcp_max_syn_backlog=65536, ma sto ancora ricevendo il messaggio nel registro.

Durante tutto questo ho osservato il numero di connessioni nello stato SYN_RECV (eseguendolo watch --interval=5 'netstat -tuna |grep "SYN_RECV"|wc -l') e non supera mai i 240, molto più basse delle dimensioni del backlog. Eppure ho un server Red Hat che si aggira intorno a 512 (il limite su questo server è il valore predefinito di 1024).

Ci sono altre impostazioni di tcp che limiterebbero le dimensioni del backlog o sto abbaiando l'albero sbagliato? Il numero di connessioni SYN_RECV dovrebbe essere netstat -tunacorrelato alla dimensione del backlog?


Aggiornare

Come meglio posso dire che ho a che fare con connessioni legittime qui, si netstat -tuna|wc -laggira intorno al 5000. Ho cercato questo oggi e ho trovato questo post da un dipendente last.fm, che è stato piuttosto utile.

Ho anche scoperto che tcp_max_syn_backlog non ha alcun effetto quando i syncookie sono abilitati (come da questo link )

Quindi come passo successivo ho impostato quanto segue in sysctl.conf:

net.ipv4.tcp_syn_retries = 3
        # default=5
net.ipv4.tcp_synack_retries = 3
        # default=5
net.ipv4.tcp_max_syn_backlog = 65536
        # default=1024
net.core.wmem_max = 8388608
        # default=124928
net.core.rmem_max = 8388608
        # default=131071
net.core.somaxconn = 512
        # default = 128
net.core.optmem_max = 81920
        # default = 20480

Ho quindi impostato il test del tempo di risposta, ho eseguito sysctl -pe disabilitato i syncookies da sysctl -w net.ipv4.tcp_syncookies=0.

Dopo aver fatto ciò, il numero di connessioni nello stato SYN_RECV è rimasto intorno a 220-250, ma le connessioni stavano iniziando di nuovo a ritardare. Una volta notato questi ritardi, ho riattivato i syncookies e i ritardi si sono fermati.

Credo che quello che stavo vedendo fosse ancora un miglioramento rispetto allo stato iniziale, tuttavia alcune richieste erano ancora in ritardo, il che è molto peggio che avere i syncookie abilitati. Quindi sembra che io sia bloccato con loro abilitati fino a quando non avremo altri server online per far fronte al carico. Anche allora, non sono sicuro di vedere un motivo valido per disabilitarli di nuovo poiché vengono inviati (apparentemente) solo quando i buffer del server si riempiono.

Ma il backlog di syn non sembra essere pieno con solo ~ 250 connessioni nello stato SYN_RECV! È possibile che il messaggio di allagamento SYN sia un'aringa rossa ed è qualcosa di diverso dal syn_backlog che si sta riempiendo?

Se qualcuno ha altre opzioni di ottimizzazione che non ho ancora provato, sarei più che felice di provarle, ma sto iniziando a chiedermi se l'impostazione syn_backlog non viene applicata correttamente per qualche motivo.


Risposte:


27

Quindi, questa è una domanda chiara.

Inizialmente, sono rimasto sorpreso dal fatto che tu abbia visto tutte le connessioni nello stato SYN_RECV con i cookie SYN abilitati. Il bello dei cookie SYN è che puoi partecipare apolidamente all'handshake a 3 vie TCP come server usando la crittografia, quindi mi aspetterei che il server non rappresenti affatto connessioni semi-aperte perché sarebbe lo stesso stato che non è essere mantenuto.

In effetti, una rapida occhiata al sorgente (tcp_ipv4.c) mostra informazioni interessanti su come il kernel implementa i cookie SYN. Essenzialmente, nonostante li accenda, il kernel si comporta normalmente fino a quando la sua coda di connessioni in sospeso non è piena. Questo spiega l'elenco esistente di connessioni nello stato SYN_RECV.

Solo quando la coda delle connessioni in sospeso è piena, E viene ricevuto un altro pacchetto SYN (tentativo di connessione) E è passato più di un minuto dall'ultimo messaggio di avviso, il kernel invia il messaggio di avviso che hai visto ("invio dei cookie" ). I cookie SYN vengono inviati anche quando il messaggio di avviso non lo è; il messaggio di avviso è solo per avvisarti che il problema non è stato risolto.

In altre parole, se si disattivano i cookie SYN, il messaggio sparirà. Questo funzionerà solo per te se non sei più inondato di SYN.

Per affrontare alcune delle altre cose che hai fatto:

  • net.ipv4.tcp_synack_retries:
    • L'aumento di questo non avrà alcun effetto positivo per quelle connessioni in entrata che sono falsificate, né per quelle che ricevono un cookie SYN anziché lo stato sul lato server (nessun tentativo anche per loro).
    • Per le connessioni contraffatte in entrata, aumentando questo aumenta il numero di pacchetti inviati a un indirizzo falso e probabilmente la quantità di tempo in cui tale indirizzo contraffatto rimane nella tabella delle connessioni (questo potrebbe essere un effetto negativo significativo).
    • Con il normale carico / numero di connessioni in entrata, maggiore è questo, maggiore è la probabilità che si completino rapidamente / correttamente connessioni su collegamenti che rilasciano pacchetti. Ci sono rendimenti decrescenti per aumentare questo.
  • net.ipv4.tcp_syn_retries: La modifica di questo non può avere alcun effetto sulle connessioni in entrata (influisce solo sulle connessioni in uscita)

Le altre variabili che menzioni non ho studiato, ma sospetto che le risposte alla tua domanda siano praticamente qui.

Se non si è inondati di SYN e la macchina risponde a connessioni non HTTP (ad esempio SSH), penso che ci sia probabilmente un problema di rete e si dovrebbe avere un ingegnere di rete che ti aiuti a guardarlo. Se la macchina in genere non risponde anche quando non si è inondati di SYN, sembra un grave problema di carico se influisce sulla creazione di connessioni TCP (livello piuttosto basso e risorse non intensive)


Grazie - questa è una risposta interessante e istruttiva. Sicuramente risponde alla mia domanda sulla relazione tra le connessioni nello stato SYN_RECV e l'invio di cookie. La macchina rispondeva a non HTTP, inclusi SSH e HTTPS che riceve molto meno traffico di HTTP. Pertanto, abbiamo deciso che ridurre il traffico è la strada da percorrere.
Alex Forbes,

Per quanto riguarda la possibilità di dare un'occhiata a un ingegnere di rete: un buon suggerimento, ma stiamo migrando lontano da questo datacenter, quindi probabilmente non vale la pena quando stiamo portando un paio di nuovi server online altrove. Penso che potresti avere ragione sul fatto che si tratta di un problema di rete, forse un problema con il bilanciamento del carico o il firewall. Grazie ancora per i tuoi approfondimenti!
Alex Forbes,

13

Ho riscontrato esattamente lo stesso problema su una nuova installazione di Ubuntu Oneiric 11.10 che esegue un server web (apache2) con un sito Web pesantemente caricato. Su Ubuntu Oneiric 11.10 le syncookie erano abilitate per impostazione predefinita.

Avevo gli stessi messaggi del kernel che indicavano un possibile attacco di alluvione SYN sulla porta del server web:

kernel: [739408.882650] TCP: possibile inondazione SYN sulla porta 80. Invio di cookie.

Allo stesso tempo, ero abbastanza sicuro che non ci fosse nessun attacco in corso. Ho avuto questi messaggi di ritorno a intervalli di 5 minuti. Sembrava una sbirciatina di caricamento, perché un utente malintenzionato avrebbe mantenuto il carico sempre elevato, mentre cercava di impedire al server di rispondere alle richieste.

L'ottimizzazione del net.ipv4.tcp_max_syn_backlogparametro non ha comportato alcun miglioramento: i messaggi sono continuati alla stessa velocità. il fatto che il numero di connessioni SYN_RECV fosse sempre molto basso (nel mio caso inferiore a 250) era un indicatore, che ci doveva essere qualche altro parametro, responsabile di questo messaggio.

Ho trovato questo messaggio di errore https://bugzilla.redhat.com/show_bug.cgi?id=734991 sul sito Red Hat indicando che il messaggio del kernel potrebbe essere il risultato di un bug (o errata configurazione) sul lato dell'applicazione . Ovviamente il messaggio di registro è molto fuorviante! Poiché questo non è il parametro del kernel responsabile in quel caso, ma il parametro dell'applicazione, essendo passato al kernel.

Quindi dovremmo anche dare un'occhiata ai parametri di configurazione della nostra applicazione web server. Prendi i documenti apache e vai su http://httpd.apache.org/docs/2.0/mod/mpm_common.html#listenbacklog

Il valore predefinito del ListenBacklogparametro è 511. (Ciò corrisponde al numero di connessioni osservate sul server Red Hat. È possibile che un altro server abbia un numero inferiore configurato).

Apache ha un proprio parametro di configurazione per la coda di backlog per le connessioni in entrata. se hai molte connessioni in entrata e in qualsiasi momento (proprio come una cosa casuale) arrivano tutte insieme quasi nello stesso momento, in modo tale che il server web non sia in grado di servirle abbastanza velocemente in modo appropriato, il tuo backlog lo farà essere pieno con 511 connessioni e il kernel lancerà il messaggio sopra indicando un possibile attacco di alluvione SYN.

Per risolvere questo, aggiungo la seguente riga /etc/apache2/ports.confo uno degli altri file .conf, che verranno caricati da Apache ( /etc/apache2/apache2.confdovrebbe anche essere ok):

ListenBackLog 5000

dovresti anche impostare net.ipv4.tcp_max_syn_backlogun valore ragionevole. a mio avviso, il massimo del kernel limiterà il valore, che sarà possibile configurare nella configurazione di Apache. quindi corri:

sudo sysctl -w net.ipv4.tcp_max_syn_backlog=5000

Dopo aver messo a punto la configurazione, non dimenticare di riavviare apache:

sudo service apache2 restart ( or sudo /etc/init.d/apache2 restart )

Nel mio caso, questa modifica alla configurazione ha immediatamente interrotto gli avvisi del kernel. Sono in grado di riprodurre i messaggi impostando un valore ListenBackLog basso nella configurazione di apache.


2
Bella risposta. Supponendo che ciò che dici sia corretto, lo contrassegnerei come la risposta accettata ma non riesco davvero a provarlo - riducendo il carico ho risolto il problema e ho una politica di non armeggiare con i server di produzione senza una buona causa :)
Alex Forbes

Posso confermare che funziona essenzialmente, è una funzionalità anti-DDOS del kernel, tuttavia quando ricevi molto traffico web finisce per bloccare i tuoi utenti legittimi!
Areeb Soo Yasir il

5

Dopo alcuni test con il kernel 3.4.9 dipende il numero di connessioni SYN_RECV in netstat

  • /proc/sys/net/core/somaxconn arrotondato per eccesso alla potenza successiva di 2 (ad es. 128 -> 256)
  • Il 75% di /proc/sys/net/ipv4/tcp_max_syn_backlogif /proc/sys/net/ipv4/tcp_syncookiesè impostato su 0o il 100% se /proc/sys/net/ipv4/tcp_syncookiesè impostato su1
  • ListenBackLog nella configurazione di Apache arrotondata per eccesso alla potenza successiva di 2 (ad es. 128 -> 256)

viene utilizzato il minimo di ciascuno di questi parametri. Dopo aver modificato somaxconn o ListenBackLog, è necessario riavviare l'apache.

E dopo aver aumentato tcp_max_syn_backlog anche apache deve essere riavviato.

Senza tcp_syncookies apache sta bloccando, perché in questo caso solo il 75% di tcp_max_syn_backlog è il limite è strano. e aumentando questo parametro aumenta le connessioni SYN_RECV al 100% del vecchio valore senza riavviare apache.


Inoltre, la chiamata /bin/echo m >/proc/sysrq-triggerporta spesso a un possibile allagamento SYN sulla porta 80. Invio di un messaggio sui cookie .
usoft,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.