SSD Nodes Learn Hosting plans →
Przewodniki Matt ConnorAutor: Matt Connor

Jak sprawdzić otwarte porty w Linux i nasłuchujące usługi

Dowiedz się, jak działają porty TCP i UDP w systemie Linux. Poznaj praktyczne zastosowanie komendy ss do weryfikacji nasłuchujących usług oraz różnice między portami lokalnymi.

Czym właściwie jest port

Port to numer, który pozwala jednemu serwerowi obsługiwać wiele usług jednocześnie bez mieszania się ich ruchu. Twój VPS ma jeden adres IP, ale może w tym samym czasie uruchamiać serwer WWW, serwer SSH i bazę danych. Gdy pakiet dociera do serwera, system operacyjny musi wiedzieć, dla której z tych usług jest przeznaczony. Odpowiedzią jest numer portu. Ruch HTTPS zazwyczaj trafia na port 443, a SSH na port 22. Adres IP dostarcza pakiet do serwera, a port kieruje go do właściwego programu na tym serwerze.

Port jest liczbą 16-bitową: 16 bitów daje zakres od 0 do 65535, przy czym 0 jest zarezerwowane, więc w praktyce porty działają w zakresie od 1 do 65535. Porty poniżej 1024 to porty „dobrze znane” (well-known ports) i domyślnie Linux pozwala otwierać je tylko użytkownikowi root (lub programowi z uprawnieniem CAP_NET_BIND_SERVICE). Dlatego standardowe usługi działają właśnie tam: 22 dla SSH, 80 dla HTTP, 443 dla HTTPS, 53 dla DNS. Parametr net.ipv4.ip_unprivileged_port_start w sysctl pozwala zmienić tę granicę, ale domyślnie wynosi ona 1024. Wszystko od 1024 wzwyż jest dostępne dla zwykłych programów.

Istnieją dwa rodzaje portów: TCP i UDP, a numer portu w jednym protokole jest niezależny od tego samego numeru w drugim. TCP to protokół oparty na połączeniach, używany przez większość usług, takich jak SSH, HTTP i bazy danych. UDP jest bezpołączeniowy i używany w usługach takich jak DNS oraz niektóre VPN-y. Podczas otwierania portu w zaporze sieciowej zazwyczaj określa się protokół, na przykład 22/tcp.

Nasłuchiwanie oznacza, że program oczekuje na połączenie na porcie

Program, który chce odbierać połączenia, prosi jądro systemu o "nasłuchiwanie" na danym porcie. Od tego momentu port jest otwarty na maszynie, a program odpowiada na każde przychodzące żądanie, o ile pozwala na to firewall. Port, na którym nic nie nasłuchuje, po prostu odrzuca połączenia. Dlatego pierwszym pytaniem w każdej kontroli bezpieczeństwa jest: co nasłuchuje i gdzie.

Polecenie służące do sprawdzenia tego stanu to ss:

sudo ss -tlnp

Flagi oznaczają TCP (t), tylko gniazda w stanie nasłuchiwania (l), numeryczne porty (n, dzięki czemu widoczny jest 22, a nie ssh) oraz proces właściciela (p). Typowy wynik:

State   Recv-Q  Local Address:Port   Process
LISTEN  0       0.0.0.0:22           sshd
LISTEN  0       127.0.0.1:5432       postgres
LISTEN  0       [::]:80              nginx

Kolumna Process wskazuje, który program jest właścicielem każdego portu, co pozwala namierzyć usługę, która nie powinna być uruchomiona.

Kolumna Local Address jest kluczowa

Czytaj uważnie adres przed każdym portem, ponieważ decyduje on o tym, kto może uzyskać dostęp do usługi. Wyróżniamy trzy przypadki, które będziesz stale napotykać.

0.0.0.0:22 oznacza „nasłuchuj na każdym adresie IPv4, jaki posiada ta maszyna”, w tym na adresie publicznym. Usługa jest dostępna z Internetu przez IPv4, o ile pozwala na to zapora sieciowa.

[::]:80 oznacza to samo dla IPv6: nasłuchuj na każdym adresie IPv6, w tym publicznych. Wiele programów domyślnie wiąże się z tym adresem, a w systemie Linux gniazdo :: często akceptuje również ruch IPv4.

127.0.0.1:5432 oznacza „nasłuchuj tylko na interfejsie zwrotnym (loopback)”. 127.0.0.1 to adres, którego maszyna używa do komunikacji z samą sobą i przy domyślnych ustawieniach jądra nie jest on osiągalny z zewnątrz. Usługa powiązana z tym adresem jest dostępna tylko z poziomu tego samego serwera, a nie z Internetu, nawet jeśli zapora sieciowa zezwala na dany port. Wspomniana wcześniej linia Postgres jest domyślnie bezpieczna. Wyjątkiem jest ustawienie jądra o nazwie route_localnet: domyślnie jest wyłączone, ale niektóre narzędzia (np. kube-proxy w Kubernetes) włączają je. W połączeniu z odpowiednimi regułami routingu lub NAT, ruch z interfejsu zwrotnego może dotrzeć z zewnątrz. sysctl -a | grep route_localnet powinno pokazywać = 0 w każdej linii.

Praktyczna zasada wynika z tego bezpośrednio: baza danych, pamięć podręczna lub panel administracyjny, z których korzystają tylko Twoje własne aplikacje, powinny wiązać się z 127.0.0.1, a nie 0.0.0.0. Jeśli usługa nigdy nie nasłuchuje na adresie publicznym, atakujący nie ma jak uzyskać do niej dostępu.

Nasłuchiwanie to nie to samo co osiągalność

Jeszcze jedno rozróżnienie pozwala uniknąć wielu nieporozumień. Fakt, że port jest otwarty na maszynie (program nasłuchuje), różni się od tego, czy port jest osiągalny z zewnątrz (zapora sieciowa na to pozwala). Oba warunki muszą być spełnione, aby zdalny klient mógł nawiązać połączenie. Te dwa rodzaje awarii wyglądają inaczej z perspektywy klienta: połączenie odrzucone (refused) zazwyczaj oznacza, że nikt nie nasłuchiwał, natomiast połączenie, które zawisa i kończy się przekroczeniem czasu (timeout), zazwyczaj oznacza, że zapora sieciowa odrzuciła pakiet, co jest dokładnie tym, o czym informują te dwa błędy SSH.

Istnieją zatem dwie warstwy kontroli. Decydujesz, co nasłuchuje, ustawiając adres powiązania (bind address) dla każdej usługi. Decydujesz, co jest dostępne dla świata zewnętrznego, za pomocą zapory sieciowej. Dobrze skonfigurowany serwer wykorzystuje obie te metody: usługi wiążą się tylko tam, gdzie to konieczne, a zapora sieciowa blokuje wszystko, na co nie zezwolono wyraźnie. Sprawdzenie, co nasłuchuje za pomocą ss, to pierwszy krok; decyzja o tym, co przepuszcza zapora, to krok drugi, opisany w podstawach zapory sieciowej z UFW.

Istnieje subtelność, która często sprawia problemy. IPv4 i IPv6 są od siebie odseparowane, a zapora sieciowa obejmująca tylko IPv4 pozostawia usługi [::] otwarte w sieci IPv6. Ta konkretna pułapka ma swój własny artykuł: pułapka zapory sieciowej IPv6.

FAQ

Jak sprawdzić, jakie porty są otwarte na moim serwerze Linux?

Uruchom sudo ss -tlnp dla TCP lub sudo ss -ulnp dla UDP. Wyświetli to listę wszystkich gniazd nasłuchujących, port, lokalny adres, z którym są powiązane, oraz proces, do którego należą. Sprawdź kolumnę Local Address: 0.0.0.0 lub [::] oznacza, że usługa jest wystawiona na sieć, podczas gdy 127.0.0.1 oznacza, że nasłuchuje tylko na samej maszynie.

Jaka jest różnica między 0.0.0.0 a 127.0.0.1?

0.0.0.0 oznacza „nasłuchuj na wszystkich adresach IPv4”, w tym na publicznym, więc usługa jest dostępna z sieci. 127.0.0.1 to adres zwrotny (loopback), którego maszyna używa do komunikacji z samą sobą. Przy domyślnych ustawieniach jądra nie jest on osiągalny z zewnątrz, więc usługa powiązana z tym adresem jest dostępna tylko lokalnie. Wiąż usługi wewnętrzne z 127.0.0.1, aby nie były widoczne w sieci.

Czy muszę otwierać port w zaporze sieciowej, aby usługa działała?

Tylko w przypadku usług, które muszą być dostępne z innych maszyn. Usługa powiązana z 127.0.0.1 nie wymaga reguły zezwalającej, ponieważ przy domyślnych ustawieniach jądra nic zewnętrznego nie może się z nią połączyć. Usługa na 0.0.0.0 lub [::] wymaga reguły zezwalającej, jeśli Twoja zapora domyślnie blokuje ruch przychodzący (co jest zalecaną praktyką). Jeśli zapora nie jest aktywna lub jej polityka domyślna zezwala na wszystko, usługa jest dostępna bez żadnych dodatkowych reguł.

Jaka jest różnica między portem TCP a portem UDP?

TCP jest protokołem opartym na połączeniach i używanym przez większość usług, takich jak SSH, serwery WWW i bazy danych. UDP jest bezpołączeniowy i używany przez DNS oraz niektóre VPN-y. Ten sam numer w TCP i UDP to osobne porty, więc 53/tcp i 53/udp to różne porty. Tworząc reguły zapory sieciowej, określasz protokół, na przykład 22/tcp.