Zrobiłem jak najwięcej badań na ten temat, nie odkopując bezpośrednio źródła jądra. Wydaje się, że istnieje duża ilość dezinformacji / niepoprawnych informacji na ten temat, więc mam nadzieję, że to raz na zawsze odpowiada na pytanie dla mnie i innych.
Ściśle mówiąc IPv4, czy wyczerpanie portów jest rzeczywiście możliwe? Pozwól mi wyjaśnić:
- Pozornie do użytku jest 65535 portów. 0 nie jest dostępne.
- Czytałem, że wyczerpanie portów wymaga krotki (src ip, src port, dst ip, dst port), aby były unikalne.
- Dla jasności i przy założeniu, że mogę używać 100% efemerycznych portów poprzez ustawienie sysctl net.ipv4.ip_local_port_range
I to jest pytanie: czy tak to działa?
- Mogę mieć 65 tys. Połączeń od 127.0.0.1:(x) do 127.0.0.1:80
- Mogę mieć 65 tys. Połączeń od 127.0.0.1:(x) do 127.0.0.1:555
- Zasadniczo ponownie pytanie brzmi (srcip, srcport, dstip, dstport) musi być unikalne, prawda?
- Nie mogłem otworzyć więcej niż 65 tys. Połączeń z adresu IP „A” na adres IP „B”, port „N”
- Podobnie, pojedynczy adres IP nie może otworzyć więcej niż 65 tys. Połączeń z moim serwerem sieciowym pod xxxx: 80, ale mógłbym obsługiwać znacznie więcej niż 65 tys. Połączeń, o ile pochodzą one z różnych źródłowych adresów IP ?
Wreszcie, jestem trochę zdezorientowany co do (wychodzących) efemerycznych portów i portów przychodzących, które nasłuchują. Zdaję sobie sprawę, że po ustanowieniu połączenia każda strona połączenia jest równorzędna i równa, ale zanim to nastąpi:
Na przykład jeśli krotka (srcip, srcport, dstip, dstport) musi być unikalna, dlaczego tak jest, jeśli na przykład ją włączę
net.ipv4.ip_local_port_range = 1024 65535
Co pozwala na użycie efemerycznych portów z 1024-65535, które, jeśli mam usługi, które łączą się z portem 3306 (na przykład mySQL), czasami się nie uruchamiają, ponieważ port jest zajęty.
Czy odnosi się to do faktu, że: (I jest to stwierdzenie, które proszę o potwierdzenie):
- (srcip, srcport, dstip, dstport) muszą być unikalne dla każdego połączenia z zakresem portów 1-65535 (nie zwracając uwagi na użycie efemerycznych portów przez system operacyjny)
- Jednak, aby gniazdo mogło się powiązać, może być postrzegane jako (srcip, srcport, *, *). Innymi słowy, czy adres IP nie może używać tego portu z jakiegokolwiek powodu, aby się z nim połączyć?
Mogę zweryfikować powyższe zachowanie, tzn. Używam dokładnej linii sysctl powyżej i dlatego przeniosłem mySQL do portu niższego niż 1024, ponieważ czasami i bardzo losowo nie można go zrestartować, ponieważ zakładając, że system operacyjny używa tego portu (3306) dla efemerycznego portu.
źródło
Odpowiedzi:
Masz tutaj dwa główne pytania:
1.
Tak. Weźmy na przykład router równoważący obciążenie wysyłający wszystkie połączenia do adresu IP NAT. Może się to zdarzyć, gdy wiele osób
SRC IP
łączy się z wąskim gardłem jednegoDST IP
.Oznacza to, że twój serwer może mieć kilka połączeń, takich jak:
i to jest w porządku. Jeśli jednak wszystkie „adresy zagraniczne” były takie same, może to powodować problem (np. „Duży router, który wykonuje serwer NAT <---> z jednym adresem IP”).
Gdybym musiał postulować, dlaczego efemeryczne wyczerpanie portów nie jest częstym problemem, sugerowałbym, że to dlatego, że każdy port wymaga usługi nasłuchiwania i wystarczającej ilości zasobów, aby odpowiedzieć - inny zasób (pamięć, procesor) jest zwykle wąskim gardłem.
Jednak osobiście natknąłem się na kilka problemów z wyczerpaniem portów podczas pracy w firmie zajmującej się równoważeniem obciążenia.
2. Dlaczego używany port może stanowić problem dla usługi nasłuchiwania?
Serwer mySQL nie może się połączyć z tym portem, jeśli jest w użyciu - powiedzmy przez localhost: 3306 lub na wszystkich interfejsach. Na przykład zobacz wiersz 0.0.0.0:80 w poniższym
netstat
wyjściu?Oznacza to, że port 80 nasłuchuje na wszystkich interfejsach lokalnych dla serwera. Jeśli inny proces przechowuje port 80 przed uruchomieniem mojego
nginx
serwera,nginx
nie będzie w stanie przejąć kontroli nad tym portem i prawdopodobnie zakończy się niepowodzeniem jego procedury uruchamiania.Zwykle port 3306 jest w porządku, ponieważ usługi nasłuchiwania mają wstępnie zdefiniowane porty (lub zakresy), które są wymagane od komputera hosta - np. Port 80 i 443 dla serwerów WWW.
źródło
Odp .: tak, jeśli twój port lokalny to 1-65535, liczba połączeń wynosi 65k-1 (jeden port nasłuchuje)
Odp .: Pojedynczy adres IP nie może otworzyć więcej niż 65 000 połączeń z moim serwerem WWW o xxxx: 80, ponieważ srcip, srcport, dstip, dstport jest unikalny. tak, możesz obsłużyć znacznie więcej niż 65 tys., jeśli soruce ip jest inny
źródło