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.