Jak zarezerwować listę portów dla własnych aplikacji?
Mówiąc ściślej, produkt, który tworzę, ma wiele procesów i dużo komunikacji między nimi.
Problemem jest to, że - od czasu do czasu - system operacyjny kradnie moje porty. To rzadkie, ale się zdarza.
Może to być spowodowane tym, że inna aplikacja użyła „:: bind” bez określonego portu.
A czasem moje własne aplikacje kradną port, gdy wywołuję „:: connect” z niezwiązanym gniazdem. Jak widać ze strony podręcznika:
Jeśli gniazdo nie zostało już powiązane z adresem lokalnym, funkcja connect () powiąże go z adresem, który, chyba że rodziną adresów gniazda jest AF_UNIX, jest nieużywanym adresem lokalnym.
Więc moje pytanie brzmi: czy mogę zarezerwować porty, których potrzebuję, aby system operacyjny ich nie używał? Czy można tego dokonać za pomocą / etc / services? A może jest inny sposób?
SELinux
w trybie wymuszania może spełnić twoje wymagania, wciąż się tego uczę. Więc tylko domyślać, może można zdefiniować własną politykęSELinux
do rezerwy Twoi portów, takich jakmy_server_port_t tcp 1111, 2222, 3333, 4444-4600
. Jeśli Twoja aplikacja będzie działać wszędzie (nie aplikacja serwera), obawiam się, że nie możesz kontrolować, czySELinux
jest WŁĄCZONA, czy WYŁĄCZONA.Odpowiedzi:
Technicznie nie ma czegoś takiego jak „zarezerwowany port”.
W TCP / UDP jedynym sposobem na „zarezerwowanie” portu jest w rzeczywistości
bind()
gniazdo do niego. Powiązany port nie będzie używany przez inne aplikacje; nieużywany port jest, no cóż, nieużywany, więc inne aplikacje mogą z niego korzystać.Jeśli piszesz oprogramowanie serwera, możesz powiązać gniazda z określonymi portami tak wcześnie, jak chcesz w kodzie aplikacji. Skonfiguruj numery portów lub przynajmniej wyraźnie je podaj w dokumentacji, aby administrator systemu mógł szybko zidentyfikować kolizje i przenieść sprzeczne aplikacje na osobne serwery.
źródło
Aby upewnić się, że jądro nie przekaże 49000 i 49001 klientom, ponieważ chcesz ich używać na swoich serwerach w systemie Linux.
upuść to
/etc/sysctl.conf
, a następnie uruchomsysctl -p
.Pamiętaj, że jest to niesprawdzone.
Referencje
źródło
/etc/services
?W rzeczywistości powyższa odpowiedź nie jest całkowicie dokładna. Sysctls net.inet.ip.portrange.first i net.inet.ip.portrange.last określają zakres portów, które system operacyjny może przydzielić dla portów losowych. Chcesz się upewnić, że zakres zarezerwowanych portów dla twojej aplikacji nie mieści się w tych zmiennych.
Zajrzyj do Podręcznika FreeBSD, sekcja: 12.14. Strojenie limitów jądra . Ale ta sama podstawowa przesłanka powinna dotyczyć również Linuksa.
źródło
net.ipv4.ip_local_port_range