Quali sono le conseguenze dell'impostazione di tcp_tw_recycle / reuse su 1?


10

Ho impostato tcp_tw_recycle / reuse su 1 nel mio file di configurazione.

Quali sono le conseguenze di farlo?

Se viene riutilizzato un socket tcp, ciò rappresenta un rischio per la sicurezza? cioè 2 connessioni diverse potenzialmente in grado di inviare dati?

È adatto per connessioni di breve durata con poca possibilità di riconnessione?


L'ovvia domanda è: cosa ti aspetti di guadagnare da questo cambiamento?
Robert Munteanu,

1
@RobertMunteanu relativo a: serverfault.com/questions/342501/…
codecompleting

Risposte:


24

Di default, quando entrambi tcp_tw_reusee tcp_tw_recyclesono disabilitati, il kernel si assicurerà che i socket nello TIME_WAITstato rimangano in quello stato abbastanza a lungo - abbastanza a lungo per essere sicuri che i pacchetti appartenenti a connessioni future non verranno scambiati per i pacchetti in ritardo della vecchia connessione.

Quando si abilita tcp_tw_reuse, i socket in TIME_WAITstato possono essere utilizzati prima della scadenza e il kernel tenterà di assicurarsi che non vi siano collisioni tra i numeri di sequenza TCP. Se si abilita tcp_timestamps(noto anche come PAWS, per la protezione contro i numeri di sequenza spostati), si assicurerà che tali collisioni non possano verificarsi. Tuttavia, è necessario che i timestamp TCP siano abilitati su entrambe le estremità (almeno, questa è la mia comprensione). Vedi la definizione di tcp_twsk_unique per i dettagli cruenti.

Quando lo abiliti tcp_tw_recycle, il kernel diventa molto più aggressivo e farà ipotesi sui timestamp usati dagli host remoti. Seguirà l'ultimo timestamp utilizzato da ciascun host remoto con una connessione in TIME_WAITstato) e consentirà di riutilizzare un socket se il timestamp è aumentato correttamente. Tuttavia, se il timestamp utilizzato dall'host cambia (ovvero si sposta indietro nel tempo), il SYNpacchetto verrà eliminato silenziosamente e la connessione non verrà stabilita (verrà visualizzato un errore simile al "timeout di connessione"). Se vuoi immergerti nel codice del kernel, la definizione di tcp_timewait_state_process potrebbe essere un buon punto di partenza.

Ora, i timestamp non dovrebbero mai tornare indietro nel tempo; salvo che:

  • l'host viene riavviato (ma poi, al momento del backup, TIME_WAITprobabilmente il socket sarà scaduto, quindi non sarà un problema);
  • l'indirizzo IP viene rapidamente riutilizzato da qualcos'altro (le TIME_WAITconnessioni rimarranno un po ', ma altre connessioni verranno probabilmente colpite TCP RSTe questo libererà spazio);
  • la traduzione dell'indirizzo di rete (o un firewall smarty-pants) è coinvolta nel mezzo della connessione.

In quest'ultimo caso, è possibile avere più host dietro lo stesso indirizzo IP e, quindi, diverse sequenze di timestamp (o, detti timestamp sono randomizzati ad ogni connessione dal firewall). In tal caso, alcuni host non saranno in grado di connettersi casualmente, poiché sono mappati su una porta per la quale il TIME_WAITbucket del server ha un timestamp più recente. Ecco perché i documenti ti dicono che "i dispositivi NAT o i bilanciatori del carico possono iniziare a eliminare i frame a causa dell'impostazione".

Alcune persone raccomandano di lasciare tcp_tw_recycleda soli, ma abilitare tcp_tw_reusee abbassaretcp_timewait_len . Concordo :-)


grande spiegazione
yanglei,

6

Ho appena avuto questo morso, quindi forse qualcuno potrebbe trarre beneficio dal mio dolore e dalla mia sofferenza. Innanzitutto, un collegamento coinvolto con molte informazioni: http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html

In particolare:

Il semplice risultato di questa mancanza di documentazione è che troviamo numerose guide di tuning che consigliano di impostare entrambe queste impostazioni su 1 per ridurre il numero di voci nello stato TIME-WAIT. Tuttavia, come affermato dalla pagina di manuale di tcp (7), l'opzione net.ipv4.tcp_tw_recycle è piuttosto problematica per i server pubblici in quanto non gestirà le connessioni da due computer diversi dietro lo stesso dispositivo NAT, che è un problema difficile da rilevare e in attesa di morderti:

Ho usato quelle abilitate con successo per fornire la connettività haproxy a bassa latenza possibile dai client a un cluster NDB MySql. Questo era in un cloud privato e nessuna connessione da nessuna a nessuna aveva alcun tipo di NAT nel mix. Il caso d'uso aveva senso, abbassare la latenza per i client radius che colpivano NDB via haproxy il più umanamente possibile. Lo ha fatto.

L'ho fatto di nuovo su un sistema haproxy pubblico, bilanciando il carico del traffico web, senza davvero studiare l'impatto (stupido, giusto ?!) e ho scoperto dopo molti problemi di risoluzione dei problemi e inseguendo i fantasmi che:

  • Creerà caos per i client che si connettono tramite un NAT.
  • È quasi impossibile identificarlo perché è completamente casuale, intermittente e i sintomi colpiranno il cliente A, in tempi completamente diversi (o meno) rispetto al cliente B, ecc.

Dal lato del cliente, vedranno periodi di tempo in cui non ottengono più risposte ai pacchetti SYN, a volte qua e là, a volte per lunghi periodi. Ancora una volta, a caso.

Il racconto qui, nella mia recente, dolorosa esperienza, è lasciare questi soli / disabilitati su server pubblici, indipendentemente dal ruolo!


4

Da 'man 7 tcp' vedrai questo:

   tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
          Enable fast recycling of TIME_WAIT sockets.  Enabling this option is not recommended since this causes problems when working with NAT
          (Network Address Translation).

   tcp_tw_reuse (Boolean; default: disabled; since Linux 2.4.19/2.6)
          Allow  to  reuse  TIME_WAIT  sockets  for  new connections when it is safe from protocol viewpoint.  It should not be changed without
          advice/request of technical experts.

Non c'è molto aiuto lì. Questa domanda ha anche alcune buone intuizioni:

/programming/6426253/tcp-tw-reuse-vs-tcp-tw-recycle-which-to-use-or-both

Ma non informazioni specifiche sul perché il riutilizzo è più sicuro del riciclo. La risposta di base è che tcp_tw_reuse consentirà di utilizzare lo stesso socket se ce n'è già uno in TIME_WAIT con gli stessi parametri TCP e che si trova in uno stato in cui non è previsto ulteriore traffico (credo che sia stato inviato un FIN ). tcp_tw_recycle invece riutilizza solo i socket che sono in TIME_WAIT con gli stessi parametri indipendentemente dallo stato, il che può confondere i firewall con stato che potrebbero aspettarsi pacchetti diversi.

tcp_tw_reuse può essere eseguito in modo selettivo nel codice impostando l'opzione socket SO_REUSEADDR, documentata man 7 socketcome tale:

   SO_REUSEADDR
          Indicates that the rules used in validating addresses supplied in a bind(2) call should allow reuse of local addresses.  For  AF_INET
          sockets  this means that a socket may bind, except when there is an active listening socket bound to the address.  When the listening
          socket is bound to INADDR_ANY with a specific port then it is not possible to bind to this port for any local address.   Argument  is
          an integer boolean flag.

1
Sei sicuro che SO_REUSEADDRsia collegato tcp_tw_reuse? Per quanto ne so, SO_REUSEADDRsi applica solo quando si desidera bind(), mentre tcp_tw_reuseverrà indicato al kernel di riutilizzare la porta di un socket locale nello TIME_WAITstato se è necessario creare una nuova connessione in uscita.
jpetazzo,

No non ne sono sicuro. :-P
SpamapS
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.