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 rzeczywistości jest port
Port to liczba, która pozwala jednemu serwerowi obsługiwać wiele usług jednocześnie bez mieszania się ich ruchu. Twój VPS posiada jeden adres IP, ale może w tym samym czasie uruchamiać serwer WWW, serwer SSH oraz 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 WWW trafia na port 443, a SSH na port 22. Adres IP dostarcza pakiet do serwera, natomiast 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 tak zwane porty "dobrze znane" (well-known ports), których otwarcie wymaga uprawnień root, dlatego standardowe usługi działają właśnie tam: 22 dla SSH, 80 dla HTTP, 443 dla HTTPS, 53 dla DNS. Wszystkie porty powyżej 1024 są dostępne dla zwykłych programów.
Istnieją dwa rodzaje portów: TCP oraz 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 czy bazy danych. UDP jest bezpołączeniowy i wykorzystywany w usługach takich jak DNS oraz niektóre sieci VPN. Podczas otwierania firewalla zazwyczaj określa się, którego rodzaju dotyczy reguła, 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 -tlnpFlagi 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 nginxKolumna 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
Należy uważnie analizować adres przed każdym portem, ponieważ decyduje on o tym, kto może uzyskać dostęp do usługi. W praktyce występują trzy stale powtarzające się przypadki.
0.0.0.0:22 oznacza „nasłuchiwanie na każdym adresie IPv4 dostępnym na tej maszynie”, w tym na adresie publicznym. Usługa jest dostępna z Internetu przez IPv4, o ile pozwala na to firewall.
[::]:80 oznacza to samo w przypadku IPv6: nasłuchiwanie 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ż połączenia IPv4.
127.0.0.1:5432 oznacza „nasłuchiwanie wyłącznie na interfejsie zwrotnym (loopback)”. 127.0.0.1 to adres, którego maszyna używa do komunikacji z samą sobą i nie jest on osiągalny z zewnątrz. Usługa powiązana z tym adresem jest dostępna tylko z poziomu tego samego serwera i nigdy z Internetu, niezależnie od konfiguracji firewalla. Powyższy wpis dotyczący Postgres jest zatem bezpieczny z założenia.
Praktyczna zasada wynika bezpośrednio z powyższego: baza danych, pamięć podręczna lub panel administracyjny używany wyłącznie przez własne aplikacje powinny być powiązane z 127.0.0.1, a nie z 0.0.0.0. Jeśli usługa nigdy nie nasłuchuje na adresie publicznym, atakujący nie ma możliwości nawiązania z nią połączenia.
Nasłuchiwanie to nie to samo co osiągalność
Jeszcze jedno rozróżnienie pozwala uniknąć wielu nieporozumień. Otwarty port na maszynie, co oznacza, że program nasłuchuje, to nie to samo co port osiągalny z zewnątrz, co oznacza, że firewall zezwala na ruch. Oba warunki muszą być spełnione, aby klient zdalny mógł nawiązać połączenie. Te dwa rodzaje awarii wyglądają inaczej z perspektywy klienta: odrzucone połączenie oznacza, że nikt nie nasłuchiwał, natomiast połączenie, które zawisa, a następnie przekracza limit czasu, zazwyczaj oznacza, że firewall odrzucił pakiet, co dokładnie wyjaśniają 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 również, co jest osiągalne dla świata zewnętrznego, za pomocą firewalla. Prawidłowo skonfigurowany serwer wykorzystuje oba te mechanizmy: usługi wiążą się tylko tam, gdzie jest to konieczne, a firewall blokuje wszystko, na co nie zezwolono w sposób jawny. Sprawdzenie, co nasłuchuje za pomocą ss, to pierwszy krok; decyzja o tym, co zezwala firewall, to krok drugi, omówiony w podstawach firewalla z UFW.
Istnieje pewien szczegół, który często sprawia problemy. IPv4 i IPv6 to oddzielne protokoły, a firewall obejmujący tylko IPv4 pozostawia usługi [::] otwarte w sieci IPv6. Ta konkretna pułapka została opisana w osobnym artykule: pułapka firewalla IPv6.
FAQ
Jak sprawdzić, które porty są otwarte na serwerze Linux?
Uruchom sudo ss -tlnp dla protokołu TCP lub sudo ss -ulnp dla UDP. Polecenie to wyświetla wszystkie gniazda nasłuchujące, numer portu, lokalny adres, do którego są przypisane, oraz proces, który je obsługuje. Sprawdź kolumnę Local Address: 0.0.0.0 lub [::] oznacza, że usługa jest wystawiona na sieć, natomiast 127.0.0.1 oznacza, że usługa nasłuchuje wyłącznie na danej 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 adresie publicznym, dzięki czemu usługa jest dostępna z sieci. 127.0.0.1 to adres pętli zwrotnej (loopback), którego maszyna używa do komunikacji z samą sobą. Nie jest on osiągalny z zewnątrz, więc usługa przypisana do tego adresu jest dostępna tylko lokalnie. Usługi wewnętrzne należy wiązać z 127.0.0.1, aby nigdy nie były wystawione na zewnątrz.
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 przypisana do 127.0.0.1 nie wymaga reguły w zaporze, ponieważ żaden zewnętrzny podmiot nie może się z nią połączyć. Usługa działająca na 0.0.0.0 lub [::] wymaga reguły zezwalającej na ruch; domyślnie dostęp powinien być zablokowany do momentu dodania odpowiedniego wpisu.
Jaka jest różnica między portem TCP a portem UDP?
TCP jest protokołem połączeniowym i jest używany przez większość usług, takich jak SSH, serwery WWW czy bazy danych. UDP jest protokołem bezpołączeniowym, wykorzystywanym przez DNS oraz niektóre sieci VPN. Ten sam numer portu w TCP i UDP to dwa odrębne porty, dlatego 53/tcp oraz 53/udp to różne zasoby. Podczas tworzenia reguł zapory sieciowej należy określić protokół, na przykład 22/tcp.