Wyczerpanie portu sieciowego Linux

10

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.

AB Carroll
źródło
Zaktualizowałem odpowiedź o więcej informacji. Odpowiedz na dowolne pytanie.
89c3b1b8-b1ae-11e6-b842-48d705 24.04.2013

Odpowiedzi:

8

Masz tutaj dwa główne pytania:

1.

Ściśle mówiąc IPv4, czy wyczerpanie portów jest rzeczywiście możliwe?

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 jednego DST IP.

Oznacza to, że twój serwer może mieć kilka połączeń, takich jak:

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 

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?

„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), czasem się nie uruchamiają, ponieważ port jest zajęty”.

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 netstatwyjściu?

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     

Oznacza to, że port 80 nasłuchuje na wszystkich interfejsach lokalnych dla serwera. Jeśli inny proces przechowuje port 80 przed uruchomieniem mojego nginxserwera, nginxnie 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.

89c3b1b8-b1ae-11e6-b842-48d705
źródło
0

Mógłbym mieć 65k połączeń od 127.0.0.1:(x) do 127.0.0.1:80 Miałem 65k połączeń od 127.0.0.1:(x) do 127.0.0.1:555

Odp .: tak, jeśli twój port lokalny to 1-65535, liczba połączeń wynosi 65k-1 (jeden port nasłuchuje)

Zasadniczo ponownie pytanie brzmi (srcip, srcport, dstip, dstport) musi być unikalne, prawda? Odp .: tak

Nie mogłem otworzyć więcej niż 65 tys. Połączeń z adresu IP „A” do IP „B”, portu „N”. Podobnie, pojedynczy adres IP nie mógł otworzyć więcej niż 65 tys. Połączeń z moim serwerem WWW o xxxx: 80, ale mógłbym obsługiwać znacznie więcej ponad 65 000 ogółem, o ile pochodzą one z różnych źródłowych adresów IP?

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

wow qing
źródło