Strona główna » Blog » Otwarte porty w Linuksie: ss, netstat, lsof, nmap
Otwarte porty w Linuksie: ss, netstat, lsof, nmap
- 15 września 2026
- 09:00
- Autor: Adrien Roche
- Zaktualizowano 3 października 2026
- Sieci

Sprawdzanie otwartych portów za pomocą ss, nowoczesnego standardu
Każdy otwarty port w systemie Linux istnieje, ponieważ jakiś proces poprosił jądro o nasłuch na nim. Narzędziem, które pokazuje dziś te gniazda, jest ss (socket statistics), część pakietu iproute2 zainstalowanego w każdej nowoczesnej dystrybucji. Jedno polecenie obejmuje większość sytuacji:
sudo ss -tulpnKażda opcja pełni jedno zadanie:
-t: uwzględnia gniazda TCP-u: uwzględnia gniazda UDP-l: pokazuje tylko gniazda nasłuchujące (pomiń tę opcję, aby zobaczyć także połączenia ustanowione)-p: pokazuje proces, który zajął dane gniazdo; dlatego potrzebujeszsudo, bo bez niego widzisz tylko własne procesy-n: wynik liczbowy; wypisuje:22zamiast:sshi pomija odwrotne zapytania DNS, co dodatkowo przyspiesza działanie polecenia
Typowy wiersz wyniku wygląda tak:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=712,fd=3))Kolumna Local Address jest tą, która liczy się dla bezpieczeństwa. 0.0.0.0:22 oznacza, że gniazdo przyjmuje połączenia na każdym interfejsie IPv4, [::]:22 to odpowiednik dla IPv6, a 127.0.0.1:5432 oznacza, że usługa odpowiada wyłącznie na pętli zwrotnej i nie można jej w ogóle osiągnąć z sieci.
Kilka wariantów warto zapamiętać:
ss -tlnp # TCP listeners only
ss -ulnp # UDP listeners only
sudo ss -tlnp 'sport = :22' # who is listening on port 22
ss -tn state established # active TCP connections right nownetstat nadal działa, ale to relikt
Miliony poradników wciąż podają netstat -tulpn, a opcje odpowiadają jedna do jednej powyższemu poleceniu ss, więc pamięć mięśniowa przenosi się w obie strony. Różnica jest pod spodem: netstat należy do utrzymywanego jedynie awaryjnie pakietu net-tools i czyta pliki w /proc, natomiast ss odpytuje jądro bezpośrednio przez netlink, co jest wyraźnie szybsze na maszynach obsługujących tysiące gniazd.
Większość aktualnych dystrybucji nie dostarcza już net-tools domyślnie. Jeśli jednak go potrzebujesz:
sudo netstat -tulpn
# if the command is missing:
sudo apt install net-tools # Debian / Ubuntu
sudo dnf install net-tools # RHEL / FedoraNie ma powodu instalować go na nowym serwerze. Traktuj netstat jako opcję zgodności dla starszych systemów, które przejmujesz, a wszędzie indziej używaj ss.
lsof: porty widziane od strony procesów
W Linuksie wszystko jest plikiem, w tym gniazda sieciowe, dlatego lsof (list open files) działa też jako inspektor portów. Sprawdza się najlepiej, gdy myślisz raczej kategoriami procesów niż portów:
sudo lsof -i -P -n # every process with a network socket
sudo lsof -iTCP -sTCP:LISTEN -P -n # TCP listeners only
sudo lsof -i :443 # everything touching port 443-P i -n wyłączają rozwiązywanie nazw portów i hostów: ta sama idea co -n w ss -tulpn. Trzecia forma to ta codzienna: wskazujesz port i otrzymujesz nazwę polecenia, PID, użytkownika i deskryptor pliku w jednej czytelnej tabeli. W przeciwieństwie do ss, lsof wypisuje także ustanowione połączenia każdego procesu obok jego nasłuchów, co pomaga, gdy chcesz wiedzieć, kto aktualnie rozmawia z usługą, a nie tylko że usługa istnieje.
nmap: nasłuch to nie to samo co osiągalność
Wszystko dotąd odpowiada na jedno pytanie: co nasłuchuje na tej maszynie. Dla bezpieczeństwa ważniejsze jest inne pytanie: co da się rzeczywiście osiągnąć z zewnątrz. Obie listy rzadko są identyczne, bo zapory na hoście, filtrowanie po stronie dostawcy i przypisania tylko do pętli zwrotnej tworzą między nimi luki. Dlatego też skanowanie siebie z samego siebie niczego nie dowodzi: nmap localhost idzie przez interfejs loopback, całkowicie omija zewnętrzne reguły zapory i chętnie raportuje usługi, do których żaden atakujący nigdy by nie dotarł.
Uruchom skan z innej maszyny, wskazując publiczny adres IP serwera:
nmap 203.0.113.10 # top 1000 TCP ports
nmap -p- 203.0.113.10 # all 65535 TCP ports
sudo nmap -sU --top-ports 100 203.0.113.10 # common UDP ports (slow)nmap raportuje trzy stany warte zrozumienia: open oznacza, że usługa odpowiedziała, closed oznacza, że pakiet dotarł, ale nic tam nie nasłuchuje, a filtered oznacza, że pakiet został po cichu odrzucony, niemal zawsze przez zaporę. Port, który ss pokazuje jako LISTEN, a zdalny nmap raportuje jako filtered, to dokładnie obraz działającej zapory. Jedna zasada obowiązuje bez wyjątków: skanuj wyłącznie hosty, które są twoje lub do których testowania masz wyraźne upoważnienie.
Ustal dokładnie, który proces trzyma port
Załóżmy, że coś okupuje port 8080 i twoja aplikacja nie może się przypisać. Do PID-u prowadzą trzy drogi:
sudo ss -tlnp 'sport = :8080'
sudo lsof -i :8080
sudo fuser -v 8080/tcpfuser jest najbardziej zwięzły: wypisuje PID, a -v dodaje użytkownika i nazwę polecenia. Może nawet od razu zabić winowajcę przez fuser -k 8080/tcp, ale wysyła to sygnał bez żadnego porządkowania na poziomie usługi, więc traktuj to jako ostatnią deskę ratunku. Gdy masz PID, ps -fp PID pokazuje pełny wiersz polecenia, a systemctl status PID mówi, która jednostka systemd go uruchomiła.
Kiedy nie masz żadnych narzędzi (na przykład w oszczędnym obrazie kontenera), własna tabela jądra jest zawsze na miejscu: cat /proc/net/tcp. Porty pojawiają się szesnastkowo (0016 to 22), a stan 0A oznacza LISTEN. Ta surowa tabela to dokładnie te dane, które pozostałe narzędzia parsują i formatują za ciebie.
Wszystko, co przypisuje gniazdo, pojawia się w tych listach w ten sam sposób, czy to baza danych, czy stos proxy. Na przykład inbound V2Ray to po prostu kolejny nasłuch na skonfigurowanym przez ciebie porcie, co wyjaśniamy w naszym przewodniku po protokole V2Ray.
Zamykanie otwartego portu: kill czy zapora
Port jest otwarty, ponieważ jakiś proces na nim nasłuchuje, co daje ci dwie odrębne dźwignie: usunięcie nasłuchu albo zablokowanie osiągalności. Nie są wymienne i w przypadku czegokolwiek istotnego zwykle warto pociągnąć obie.
Czystym rozwiązaniem jest zatrzymanie i wyłączenie usługi, która zajęła gniazdo. Zabicie PID-u wygląda na szybsze, ale rzadko działa trwale: systemd automatycznie restartuje nadzorowane usługi i port wraca, zanim ponownie uruchomisz ss. Zachowaj kill dla procesów uruchomionych ręcznie. Aby zobaczyć, co działa, i wyłączyć to, czego nie potrzebujesz, nasz przewodnik po wypisywaniu usług za pomocą systemctl omawia ten proces od początku do końca.
sudo systemctl stop cups
sudo systemctl disable cupsZapora obsługuje drugą dźwignię. W Ubuntu zezwól na SSH przed włączeniem ufw, w przeciwnym razie zablokujesz sobie dostęp do maszyny:
sudo ufw default deny incoming
sudo ufw allow 22/tcp
sudo ufw enableW systemach z rodziny RHEL domyślna strefa firewalld już odrzuca niezamawiany ruch; usuń wszystko, co wcześniej otworzyłeś, poleceniem firewall-cmd --permanent --remove-port=8080/tcp, a następnie firewall-cmd --reload. Jedna rzecz, która rozwiązaniem nie jest: przenoszenie usługi na niestandardowy port. Ukrywa cię przed najbardziej leniwymi skanami i wycisza logi, ale nmap -p- znajdzie nowy port w kilka minut. Ukrycie to nie bezpieczeństwo — zamknij port albo zablokuj go zaporą.
Pięciominutowy audyt portów nowego serwera
Przy pierwszym logowaniu na świeżo przygotowanej maszynie wykonaj inwentaryzację poleceniem sudo ss -tulpn. Czysta, minimalna instalacja powinna pokazać bardzo niewiele: sshd na porcie 22 oraz, w dystrybucjach korzystających z systemd-resolved, stub DNS na 127.0.0.53:53. Wszystko inne wymaga wyjaśnienia. Następnie przejdź tę listę kontrolną:
- Zidentyfikuj każdy nasłuch po nazwie procesu i PID-zie; wyłącz każdą usługę, o którą nie prosiłeś.
- Podważ każde przypisanie do
0.0.0.0lub[::]: bazy danych i panele administracyjne należą do127.0.0.1, chyba że naprawdę obsługują sieć. - Rozpoznawaj typowe porty na pierwszy rzut oka: 22 SSH, 80/443 web, 3306 MySQL, 5432 PostgreSQL, 6379 Redis. Port 3389 to pulpit zdalny. W Linuksie oznacza, że działa xrdp, a zasady jego ekspozycji i utwardzania omawia nasz przewodnik po porcie RDP 3389.
- Przeskanuj publiczny adres IP z własnej maszyny poleceniem
nmap -p-i porównaj wynik z listą zss; każda różnica to albo zapora robiąca swoje, albo przypisanie do pętli zwrotnej. - Zakończ zaporą w trybie domyślnej odmowy, która przepuszcza tylko porty świadomie przez ciebie udostępnione.
Oto cała skrzynka narzędziowa, po jednym wierszu na narzędzie:
| Polecenie | Co pokazuje | Kiedy używać |
|---|---|---|
sudo ss -tulpn | Nasłuchujące gniazda TCP/UDP wraz z procesem | Codzienne pierwsze spojrzenie na dowolną maszynę |
netstat -tulpn | Ten sam widok przez przestarzałe net-tools | Starsze systemy, w których brakuje ss |
sudo lsof -i :PORT | Procesy i połączenia na jednym porcie | Powiązanie portu z procesem i jego plikami |
sudo fuser -v PORT/tcp | PID-y przypisane do portu | Szybkie ustalenie PID-u, skrypty |
nmap SERVER_IP (zdalnie) | Porty rzeczywiście osiągalne z zewnątrz | Weryfikacja zapory i faktycznej ekspozycji |
cat /proc/net/tcp | Surowa tabela gniazd jądra (szesnastkowo) | Minimalne kontenery bez zainstalowanych narzędzi |
Polecenia stają się odruchem tylko na maszynie, na której masz prawdziwego roota i nic ważnego nie może się zepsuć. Linux VPS od rdp.monster daje dokładnie taką piaskownicę: pełny dostęp administracyjny, dedykowany procesor i RAM, nielimitowane pasmo (fair-use), brak KYC, a serwer jest online po około 10 sekundach od potwierdzenia płatności, czyli wystarczająco szybko, aby uruchomić na nim pierwsze ss -tulpn, zanim wystygnie kawa.
Najczęściej zadawane pytania
Czy potrzebuję roota, aby sprawdzić otwarte porty w Linuksie?
ss -tuln lub odczytać /proc/net/tcp, więc lista nasłuchujących portów nigdy nie jest ukryta. Ograniczenie dotyczy opcji -p: bez roota ss, lsof i fuser ujawniają tylko procesy należące do twojego użytkownika, a pozostałe gniazda pojawiają się z pustą kolumną procesu. W nmapie domyślny skan SYN (-sS) wymaga roota; nieuprzywilejowaną alternatywą jest skan connect (-sT), który działa dobrze, ale jest nieco bardziej hałaśliwy.Jak sprawdzić, czy konkretny port jest otwarty na zdalnym serwerze?
nc -zv example.com 443 próbuje ustanowić połączenie TCP i raportuje sukces lub porażkę bez przesyłania danych. Jeśli brakuje netcata, poradzi sobie sam Bash: timeout 3 bash -c '</dev/tcp/example.com/443' && echo open. Oba dowodzą tylko tego, że coś przyjęło połączenie, ale nie mówią nic o tym, która usługa odpowiedziała ani czy jest sprawna. Dla UDP nie ma niezawodnego szybkiego testu, bo milczący port może być otwarty albo filtrowany; tam użyj nmap -sU.Dlaczego ss pokazuje port jako nasłuchujący, a nie mogę się połączyć z zewnątrz?
127.0.0.1:PORT lub [::1]:PORT oznacza, że usługa przyjmuje wyłącznie połączenia lokalne, co jest zamierzone i częste w bazach danych. Jeśli jest przypisana do 0.0.0.0, pakiety są filtrowane gdzieś na trasie: przez zaporę na hoście, taką jak ufw, firewalld czy surowe nftables, albo przez filtrowanie brzegowe twojego dostawcy. Zewnętrzny skan nmap raportujący port jako filtered potwierdza zaporę; closed oznacza, że ruch dochodzi, ale na tym interfejsie nic nie nasłuchuje.Które porty powinny być otwarte na nowym serwerze Linux?
sshd na porcie 22. Resolver stub DNS na 127.0.0.53:53 (systemd-resolved) jest normalny i nieosiągalny z zewnątrz. Obrazy chmurowe czasem dodają agenta lub demona monitorującego. Zidentyfikuj każdy nasłuch przez ss -tulpn i wyłącz to, o co nie prosiłeś. Każda usługa instalowana później powinna domyślnie trzymać się pętli zwrotnej, chyba że naprawdę musi obsługiwać sieć, a zapora powinna przepuszczać tylko to, co publiczne.Adrien Roche, Redaktor ds. infrastruktury i hostingu
Inżynier systemowy z ponad 10-letnim doświadczeniem w utrzymaniu flot Windows Server i Linux. Adrien prowadzi dokumentację infrastruktury rdp.monster i pisze nasze poradniki o RDP, hostingu VPS, administracji serwerami, sieciach i narzędziach prywatności.
Powiązane artykuły




