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.