Zde máte dvě hlavní otázky:
1.
Přesně řečeno, je vyčerpání portů skutečně možné?
Ano. Vezměme si například směrovač pro vyrovnávání zátěže, který posílá všechna připojení na IP adresu NAT. To se pravděpodobně stane, když máte mnoho SRC IP
s připojením k úzkému hrdlu jednoho DST IP
.
To znamená, že váš webový server může mít spoustu připojení jako:
[email protected]:~# 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
a to je naprosto v pořádku. Pokud by však byly všechny „cizí adresy“ stejné, může to způsobit problém (např. „velký směrovač, který provádí NAT <---> server s jednou IP adresou“).
Pokud bych měl postulovat, proč není pomíjivé vyčerpání portů běžným problémem, navrhoval bych, že je to proto, že každý port vyžaduje naslouchací službu a dostatek zdrojů k reakci - jiný zdroj (paměť, procesor) je obvykle úzkým hrdlem jako první.
Osobně jsem však při práci ve společnosti pro vyrovnávání zátěže narazil na několik problémů s vyčerpáním portů.
2. Proč může použitý port představovat problém pro službu naslouchání?
"Což umožňuje použití pomíjivých portů z 1024-65535, že pokud mám služby, které se vážou na port 3306 (například mySQL), někdy se nespustí, protože se port používá."
Server mySQL se nemůže vázat na tento port, pokud je používán - řekněme pomocí localhost:3306 nebo na všech rozhraních. Podívejte se například na řádek 0.0.0.0:80 v následujícím textu netstat
výstup?
[email protected]:~# 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
To znamená, že port 80 naslouchá napříč všem lokální rozhraní na serveru. Pokud jiný proces drží port 80 před mým nginx
server se spustí, nginx
nebude schopen převzít kontrolu nad tímto portem a pravděpodobně selže při jeho spuštění.
Normálně je port 3306 v pořádku, protože naslouchací služby mají předem definované porty (nebo rozsahy), které jsou požadovány od hostitelského počítače - např. porty 80 a 443 pro webové servery.