Esaurimento della porta di rete Linux


10

Ho fatto quante più ricerche possibili su questo senza scavare subito nel sorgente del kernel. Sembra che ci sia una grande quantità di disinformazione / informazioni errate sull'argomento, quindi spero che questo risponda alla domanda per me e per gli altri una volta per tutte.

A rigor di termini IPv4, è davvero possibile l'esaurimento delle porte? Lasciatemi spiegare:

  • Apparentemente ci sono 65535 porte disponibili per l'uso. 0 non è disponibile.
  • Ho letto che l'esaurimento delle porte richiede che la tupla (src ip, src port, dst ip, dst port) sia unica.
  • Per essere chiari e supponendo di poter usare il 100% delle porte effimere tramite l'impostazione sysctl net.ipv4.ip_local_port_range

E questa è la domanda: è così che funziona?

  • Potrei avere 65k connessioni da 127.0.0.1:(x) a 127.0.0.1:80
  • Potrei avere 65k connessioni da 127.0.0.1:(x) a 127.0.0.1:555
  • Fondamentalmente ancora una volta, la domanda è (srcip, srcport, dstip, dstport) deve essere unica, corretta?
  • Impossibile aprire più di 65k connessioni da ip "A" a IP "B", porta "N"
  • Allo stesso modo, un singolo IP non potrebbe aprire più di 65k connessioni al mio server web su xxxx: 80, tuttavia potrei supportare molto più di 65k complessivamente purché provengano da IP di origine diversi ?

Infine, sono un po 'confuso riguardo alle porte (in uscita) effimere e alle porte in entrata che stanno ascoltando. Mi rendo conto che una volta stabilita la connessione, ogni lato della connessione è uguale e uguale, ma prima che ciò accada:

Ad esempio, se effettivamente la tupla (srcip, srcport, dstip, dstport) deve essere unica, perché abilitarlo, ad esempio

net.ipv4.ip_local_port_range = 1024 65535

Ciò consente l'uso di porte effimere da 1024-65535, che se ho servizi che si collegano alla porta 3306 (mySQL, ad esempio), a volte non si avviano perché la porta è in uso.

È relativo al fatto che: (E questa è una dichiarazione che sto chiedendo di essere convalidata):

  • (srcip, srcport, dstip, dstport) sono necessari per essere univoci per ogni connessione con l'intervallo di porte 1-65535 (non prestando attenzione all'utilizzo delle porte effimere da parte del sistema operativo)
  • Tuttavia, per un socket da associare, potrebbe essere visto come (srcip, srcport, *, *). O un altro modo per dirlo, l'IP non deve usare quella porta per nessun motivo a cui collegarsi?

Posso verificare il comportamento sopra riportato, ovvero utilizzo esattamente la riga sysctl sopra riportata, e per questo motivo ho spostato mySQL su una porta inferiore a 1024 perché non riusciva a riavviarsi occasionalmente e in modo molto casuale perché supponendo che il sistema operativo stesse usando quella porta (3306) per un porto effimero.


Ho aggiornato la mia risposta con ulteriori informazioni. Sentiti libero di rispondere a qualsiasi domanda.
89c3b1b8-b1ae-11e6-b842-48d705

Risposte:


8

Hai due domande principali qui:

1.

A rigor di termini IPv4, è davvero possibile l'esaurimento delle porte?

Sì. Prendi, ad esempio, un router di bilanciamento del carico che invia tutte le connessioni a un indirizzo IP NAT. È probabile che ciò accada quando hai molti SRC IPs che si collegano al collo di bottiglia di un singolo DST IP.

Ciò significa che il tuo server web potrebbe avere un sacco di connessioni come:

root@buglab:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 173.200.1.18:80      10.100.1.100:49923        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.200.1.200:10155        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:14400        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:50652        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.20.1.20:57554        ESTABLISHED 13939/nginx: worker 

e va benissimo. Tuttavia, se tutti gli "Indirizzi esterni" fossero uguali, ciò potrebbe causare un problema (ad esempio "grande router che esegue un server NAT <---> con un indirizzo IP").

Se dovessi postulare il motivo per cui l'esaurimento delle porte effimero non è un problema comune, suggerirei perché ogni porta richiede un servizio di ascolto e risorse sufficienti per rispondere - un'altra risorsa (memoria, CPU) è normalmente prima un collo di bottiglia.

Tuttavia, ho riscontrato personalmente alcuni problemi di esaurimento del porto quando lavoravo in una società di bilanciamento del carico.

2. Perché una porta utilizzata può presentare un problema per un servizio di ascolto?

"Il che consente l'uso di porte effimere da 1024-65535, che se ho servizi che si collegano alla porta 3306 (mySQL, ad esempio), a volte non si avviano perché la porta è in uso."

Il server mySQL non può collegarsi a quella porta se è in uso, ad esempio localhost: 3306 o su tutte le interfacce. Ad esempio, vedere la riga 0.0.0.0:80 nel seguente netstatoutput?

root@buglab:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      964/php-fpm.conf)
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1660/mysqld     
tcp        0      0 0.0.0.0:842             0.0.0.0:*               LISTEN      1317/inetd      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13938/nginx     

Ciò significa che la porta 80 è in ascolto su tutte le interfacce locali al server. Se un altro processo mantiene la porta 80 prima dell'avvio del mio nginxserver, nginxnon sarà in grado di assumere il controllo di quella porta e probabilmente fallirà la sua procedura di avvio.

Normalmente, la porta 3306 va bene perché i servizi di ascolto hanno porte (o intervalli) predefiniti richiesti dalla macchina host, ad esempio le porte 80 e 443 per i server web.


0

Potrei avere connessioni 65k da 127.0.0.1:(x) a 127.0.0.1:80 Potrei avere connessioni 65k da 127.0.0.1:(x) a 127.0.0.1:555

a: sì, se la porta locale è 1-65535, il conteggio delle connessioni è 65k-1 (una porta è in ascolto)

Fondamentalmente ancora una volta, la domanda è (srcip, srcport, dstip, dstport) deve essere unica, corretta? a: si

Non potevo aprire più di 65k connessioni da ip "A" a IP "B", porta "N" Allo stesso modo, un singolo IP non poteva aprire più di 65k connessioni al mio server web a xxxx: 80, tuttavia potrei supportare molto di più di 65k complessivi purché provengano da IP di origine diversi?

a: Un singolo IP non ha potuto aprire più di 65k connessioni al mio server web a xxxx: 80, perché srcip, srcport, dstip, dstport è unico. sì, potresti supportare molto più di 65k, se soruce ip è diverso

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.