Czy protokół TCP może zapewnić więcej niż 65535 portów?


50

Czy można skonfigurować system Linux tak, aby zapewniał ponad 65 535 portów? Chodzi o to, aby ponad 65 000 demonów nasłuchiwało w danym systemie.

Oczywiste jest, że używane są porty, więc nie jest to możliwe z tych powodów, więc pomyśl o tym jako o teoretycznym ćwiczeniu próbującym zrozumieć, gdzie TCP byłby ograniczający w robieniu czegoś takiego.


11
Jaka jest motywacja tego pytania? Dlaczego chcesz słuchać tak wielu demonów?
Warren Young

1
Będziesz miał trudności z uruchomieniem tak wielu procesów. (Zakładam, że masz na myśli jeden proces na demona).
Warren Young

13
Chociaż nie ma nic, co formalnie powstrzymałoby cię od noszenia 65 par spodni jednocześnie, praktycznym idiotyzmem byłoby wypróbowanie. Jeśli możesz mi pokazać maszynę, która może owocnie przetwarzać 10 000 portów TCP jednocześnie, może to być interesujące abstrakcyjne pytanie.
msw

13
Charakter tego Q jest całkowicie teoretyczny i nie ma innego celu niż zrozumienie ograniczeń TCP i liczby portów.
slm

1
Chodzi o to, że sformułowałeś to w sposób, który wiąże go z różnymi praktycznymi kwestiami związanymi z przestrzenią RAM wymaganą przez procesy demona 64k +. Każda maszyna, którą prawdopodobnie będziesz mieć teraz lub przez następną dekadę, skończy się pamięć RAM, zanim osiągniesz limit słuchaczy. Jeśli przeredagujesz pytanie, aby mówić tylko o słuchaczach TCP , pozostawiając całkowicie dyskusję na temat demonów, problem zniknie. Możesz amortyzować przestrzeń stosu, przypisując na przykład tysiąc gniazd do każdego demona sterowanego zdarzeniem jednowątkowym.
Warren Young

Odpowiedzi:


84

Patrząc na RFC dla TCP: RFC 793 - Protokół kontroli transmisji , odpowiedź wydaje się być nie, ponieważ nagłówek TCP jest ograniczony do 16 bitów dla pola portu źródłowego / docelowego.

    ss # 1

Czy IPv6 poprawia sytuację?

Nie. Mimo że IPv6 da nam znacznie większą przestrzeń adresów IP, 32-bitową w porównaniu do 128-bitowej, nie próbuje poprawić ograniczenia pakietów TCP dla 16-bitowych numerów portów. Co ciekawe, specyfikacja RFC dla IPv6: protokół internetowy, wersja 6 (IPv6) , pole IP wymagało rozszerzenia.

Gdy TCP działa na IPv6, metoda obliczania sumy kontrolnej jest zmieniana zgodnie z RFC 2460 :

Każdy protokół transportowy lub inny górny protokół, który uwzględnia adresy z nagłówka IP w obliczeniach sumy kontrolnej, musi zostać zmodyfikowany do użycia przez IPv6, aby uwzględnić 128-bitowe adresy IPv6 zamiast 32-bitowych adresów IPv4.

                 ss # 2

Jak więc zdobyć więcej portów?

Jednym z podejść byłoby zestawianie dodatkowych adresów IP za pomocą większej liczby interfejsów. Jeśli twój system ma wiele kart sieciowych, jest to łatwiejsze, ale nawet z jedną kartą sieciową, można skorzystać z interfejsów wirtualnych ( aliasów ), aby w razie potrzeby przydzielić więcej adresów IP.

UWAGA: Zastąpiono użycie aliasów, za pomocą iproute2których można eth0zamiast tego ustawiać adresy IP na jednym interfejsie .

Przykład

$ sudo ip link set eth0 up
$ sudo ip addr add 192.0.2.1/24 dev eth0
$ sudo ip addr add 192.0.2.2/24 dev eth0
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
      pfifo_fast state DOWN qlen 1000
    link/ether 00:d0:b7:2d:ce:cf brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.1/24 brd 192.0.2.255 scope global eth1
    inet 192.0.2.2/24 scope global secondary eth1

Źródło: iproute2: Życie po ifconfig

Bibliografia


3
Nie byłoby możliwe wybranie spośród 65 536 demonów przy użyciu samego portu docelowego, ale gdyby ktoś miał nieograniczoną pamięć i przepustowość, mógłby mieć ponad 32 000 połączeń z każdym odrębnym adresem TCP na każdym porcie przychodzącym.
supercat

7

Czy można skonfigurować system Linux tak, aby zapewniał ponad 65 535 portów?

Nie.

Chodzi o to, aby ponad 65 000 demonów nasłuchiwało w danym systemie.

Potrzebujesz:

  • iptableskonfiguracja który przekierowuje na zawartość ruchu lub

  • „usługa brokera usług” lub „usługa multipleksera”, która przyjmuje połączenia przychodzące na jednym porcie i kieruje je do odpowiedniego demona „za nim”. Jeśli chcesz, aby standardowe protokoły były niezmodyfikowane, być może będziesz musiał zaimplementować sniffowanie / rozpoznawanie protokołu w tej usłudze multipleksora, w sposób, w jaki zapora ogniowa IDS lub warstwa-7 byłaby anaylze; całkowicie możliwe z ogromną większością protokołów.

Jeśli chodzi o drugi element, możesz zaprojektować tę usługę tak, aby obsługiwała więcej niż 2 ^ 16 „portów”, jeśli naprawdę tego chcesz. Jestem pewien, że wpływ na wydajność będzie minimalny w porównaniu do obciążenia 2 ^ 16 + uruchomionych detektorów.

Demony w systemie Linux mogą nasłuchiwać na gniazdach unix istniejących w systemie plików, więc „usługa multipleksatora” może utrzymywać wewnętrzne mapowanie zewnętrznego portu <-> wewnętrznego gniazda unix. Prawdopodobnie spotkasz się z limitem procesu jądra (procesy 32 Kbyte?), Zanim zabraknie i-węzłów w dowolnym nowoczesnym systemie plików.


Głosowałem za tym, ponieważ mówisz, że nie jest to możliwe, a następnie wyjaśnij, jak to zrobić przy użyciu wielu adresów IP i równoważenia obciążenia, aczkolwiek w bardzo mylący sposób na rondzie.
suprjami

2
Ponad 64 tys. Portów w jednym systemie jest niemożliwe. Prawdopodobnie możliwe jest ponad 64 tys. Słuchaczy , ale musisz mieć detektory proxy lub frontendu, które „dzielą” połączenia przychodzące z właściwymi prawdziwymi odbiornikami „backend”. Na przykład możesz zrobić coś szalonego, jak wewnętrzny NAT do wielu wewnętrznych adresów IP.
LawrenceC

2
Źle. Ludziom udało się uzyskać pół miliona jednoczesnych połączeń w jednym systemie. Tak, wymaganych jest wiele adresów IP i modułów równoważenia obciążenia (niekoniecznie w tym samym systemie), ale jeden system może otworzyć więcej niż 64 tys. Portów i nawet więcej niż 64 tys. Detektorów, jeśli zostanie to wykonane poprawnie.
suprjami

2

Tylko dlatego, że nie ma dobrej odpowiedzi, w którą chciałbym się włączyć.

Jednym ze sposobów na to byłoby dodanie opcji IP, która określa rozszerzenie portu. Opcja musi być zaprojektowana tak, aby pasowała do opcjonalnej części nagłówka IP i byłaby pomijana przez nieznane przeskoki.

Korzystasz z tej opcji i informacji o niej, aby rozszerzyć źródło, miejsce docelowe lub oba numery portów.

Ograniczenia nie będą działały automatycznie w istniejącym oprogramowaniu po prostu poprzez dodanie opcji, będą musiały zostać przepisane, aby skorzystać z opcji bez względu na sposób jej implementacji, istniejące oprogramowanie i zapory ogniowe zignorują pakiet lub przetworzą go jak zwykle przy użyciu wartości w polach portu źródłowego i docelowego.

Krótko mówiąc, nie jest to łatwe i lepiej byłoby to zrobić przy użyciu jednego odbiornika wielokrotnego użytku i danych zawartych w ładunku pakietu.

Możesz także łatwiej zezwolić na ponowne użycie portów w oprogramowaniu, co może pomóc przezwyciężyć to ograniczenie, ponownie wykorzystując porty serwera dla wielu połączeń klienckich.

Rtsp może na przykład używać nagłówka SessionId w połączeniu z różnymi innymi nagłówkami w pakiecie IP, aby określić, dla którego połączenia wysłano żądanie i działać odpowiednio, np. Jeśli gniazdo, z którego wiadomość została dostarczona, nie jest takie samo jak gniazdo zdalny adres, któremu odpowiada sesja, wówczas można zezwolić na aktualizację sesji z nowym gniazdem do przetwarzania, odmówić wiadomości lub szereg innych działań w zależności od aplikacji.

Serwer HTTP może również to zrobić lub dowolny inny typ serwera.

Kluczową rzeczą, o której należy pamiętać przy ponownym użyciu portów, jest to, że należy wziąć pod uwagę źródłowy adres IP.


-2

Tak, możesz !

Dokonano tego wcześniej, na przykład na serwerze szyfrowania Edgehill, który ma ponad 25 000 000 diamonów działających online.


9
Rozważ poszerzenie swojej odpowiedzi, aby zawierała wskazówki, jak PO może to osiągnąć, dokumentację, która popiera twoją odpowiedź lub powiązane wyjaśnienie.
HalosGhost

Czy możesz podać odniesienia do tego oświadczenia? Szybkie wyszukiwanie pozwala mi uwierzyć, że jest to rozpowszechniane na wielu komputerach.
Thomas Guyot-Sionnest
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.