Polecenie ss: sprawdzanie portów i procesów w Linuksie, porównanie z netstat

Środowisko testoweRodzina DebianDebian 12iproute2 6.1.0zwykłe konto użytkownikaSprawdzono 2026-11-04
Polecenia sieciowessLokalizacja/usr/bin/ss

To, które porty na serwerze Linux są otwarte i kto jest połączony, sprawdzisz poleceniem ss. ss to narzędzie iproute2 do przeglądania gniazd, które zastępuje netstat. Sprawdzenie poleceniem ss nasłuchujących (LISTEN) portów i połączeń na serwerze Debian 12 pokazało, że na zwykłym koncie nazwy programów uruchomionych przez inne konta nie pojawiają się w kolumnie Process nawet z -p.

Poniższe wyniki uzyskano przy angielskim locale. Adresy serwera i drugiej strony podano jako adresy przykładowe.

1️⃣ Podstawowe użycie polecenia ss i kolumny wyniku

Jeśli uruchomisz ss bez opcji, nasłuchujące porty zostaną pominięte i pojawią się tylko gniazda z nawiązanym połączeniem. Na serwerze testowym pierwsze wiersze były w całości gniazdami Unix (u_str, u_dgr), przez które programy wewnątrz serwera komunikują się ze sobą.

ss | head -n 5
Netid State Recv-Q Send-Q                              Local Address:Port       Peer Address:Port    Process
u_str ESTAB 0      0                                               * 1013903               * 1013904
u_dgr ESTAB 0      0                                               * 1013960               * 13394
u_str ESTAB 0      0                                               * 1013907               * 1013908
u_str ESTAB 0      0                                               * 46066198              * 46066199

Dlatego, aby zobaczyć tylko połączenia TCP, dodaj -t. Gniazda Unix znikają, a w miejscu portu zamiast numerów pojawiają się nazwy usług, takie jak ssh i https.

ss -t
State Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
ESTAB 0      0       203.0.113.10:ssh   198.51.100.7:51114
ESTAB 0      0       203.0.113.10:26676   192.0.2.15:https
ESTAB 0      0       203.0.113.10:29714   192.0.2.16:https

Jeśli dodasz też -n, numery portów zostaną bez zmian i nie zamienią się w nazwy usług.

ss -tn
State Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
ESTAB 0      0       203.0.113.10:22    198.51.100.7:51114
ESTAB 0      0       203.0.113.10:26676   192.0.2.15:443
ESTAB 0      0       203.0.113.10:29714   192.0.2.16:443

Kolumny Recv-Q i Send-Q znaczą co innego zależnie od stanu gniazda. W połączonym gnieździe Recv-Q to liczba odebranych bajtów, których program jeszcze nie odczytał, a Send-Q to liczba wysłanych bajtów, których odbioru druga strona jeszcze nie potwierdziła.

W nasłuchującym gnieździe Recv-Q oznacza liczbę połączeń czekających w kolejce, a Send-Q maksymalny rozmiar kolejki. Te znaczenia pochodzą ze strony man netstat(8) z pakietu net-tools.

2️⃣ Sprawdzanie portów w Linuksie (-tln, -uln, -tulpn)

Wynik bez opcji nie pokazuje portów czekających na połączenia, więc do sprawdzania otwartych portów dodaj -l, które wybiera tylko nasłuchujące gniazda. [ss -tln] wypisuje nasłuchujące porty TCP jako numery.

ss -tln
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*
LISTEN 0      511          0.0.0.0:80        0.0.0.0:*
LISTEN 0      511          0.0.0.0:443       0.0.0.0:*
LISTEN 0      511        127.0.0.1:8080      0.0.0.0:*
LISTEN 0      128             [::]:22           [::]:*
LISTEN 0      511             [::]:80           [::]:*
LISTEN 0      511             [::]:443          [::]:*

Gdy Local Address to 0.0.0.0, gniazdo przyjmuje połączenia przychodzące na wszystkie adresy IPv4 serwera, a przy 127.0.0.1 połączyć się można tylko z wnętrza serwera. [::] oznacza wszystkie adresy IPv6, więc porty 22, 80 i 443 są otwarte zarówno w IPv4, jak i w IPv6.

Bez -n numery portów zamieniają się w nazwy usług. Port 8080 pojawia się jako http-alt.

ss -tl
State  Recv-Q Send-Q Local Address:Port     Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:ssh           0.0.0.0:*
LISTEN 0      511          0.0.0.0:http          0.0.0.0:*
LISTEN 0      511          0.0.0.0:https         0.0.0.0:*
LISTEN 0      511        127.0.0.1:http-alt      0.0.0.0:*
LISTEN 0      128             [::]:ssh              [::]:*
LISTEN 0      511             [::]:http             [::]:*
LISTEN 0      511             [::]:https            [::]:*

UDP nie nawiązuje połączeń, więc nawet jego nasłuchujące gniazda nie mają stanu LISTEN. W kolumnie stanu wyniku [ss -uln] wszędzie było UNCONN. Port 68 (bootpc) to klient DHCP, a port 123 (ntp) służy do synchronizacji czasu.

ss -uln
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
UNCONN 0      0            0.0.0.0:68        0.0.0.0:*
UNCONN 0      0       203.0.113.10:123       0.0.0.0:*
UNCONN 0      0          127.0.0.1:123       0.0.0.0:*
UNCONN 0      0            0.0.0.0:123       0.0.0.0:*
UNCONN 0      0              [::1]:123          [::]:*
UNCONN 0      0               [::]:123          [::]:*

Aby zobaczyć TCP i UDP naraz, połącz opcje, jak w [ss -tulpn]. Gdy rodzajów jest więcej niż jeden, na początku pojawia się kolumna Netid.

ss -tulpn
Netid State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp   UNCONN 0      0            0.0.0.0:68        0.0.0.0:*
udp   UNCONN 0      0       203.0.113.10:123       0.0.0.0:*
udp   UNCONN 0      0          127.0.0.1:123       0.0.0.0:*
udp   UNCONN 0      0            0.0.0.0:123       0.0.0.0:*
udp   UNCONN 0      0              [::1]:123          [::]:*
udp   UNCONN 0      0               [::]:123          [::]:*
tcp   LISTEN 0      128          0.0.0.0:22        0.0.0.0:*
tcp   LISTEN 0      511          0.0.0.0:80        0.0.0.0:*
tcp   LISTEN 0      511          0.0.0.0:443       0.0.0.0:*
tcp   LISTEN 0      511        127.0.0.1:8080      0.0.0.0:*
tcp   LISTEN 0      128             [::]:22           [::]:*
tcp   LISTEN 0      511             [::]:80           [::]:*
tcp   LISTEN 0      511             [::]:443          [::]:*

3️⃣ Sprawdzanie procesów poleceniem ss (-p)

-p to opcja, która wypisuje w kolumnie Process program używający gniazda. Jednak po uruchomieniu [ss -tlnp] na zwykłym koncie serwera testowego kolumna Process pozostała pusta, jak poniżej, jakby opcja nie zadziałała.

ss -tlnp
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*
LISTEN 0      511          0.0.0.0:80        0.0.0.0:*
LISTEN 0      511          0.0.0.0:443       0.0.0.0:*
LISTEN 0      511        127.0.0.1:8080      0.0.0.0:*
LISTEN 0      128             [::]:22           [::]:*
LISTEN 0      511             [::]:80           [::]:*
LISTEN 0      511             [::]:443          [::]:*

ss znajduje proces używający gniazda, czytając folder fd każdego procesu w /proc. Zwykłe konto nie może otworzyć folderu fd procesu uruchomionego przez inne konto, więc nazwa tego programu nie trafia do kolumny. Próba otwarcia ze zwykłego konta folderu procesu 1, uruchomionego przez root, kończy się błędem uprawnień.

ls /proc/1/fd
ls: cannot open directory '/proc/1/fd': Permission denied

Programy uruchomione z własnego konta pojawiają się w kolumnie Process także na zwykłym koncie. Sprawdzono to, uruchamiając prosty serwer WWW z python3 na porcie 8000 adresu 127.0.0.1.

python3 -m http.server 8000 --bind 127.0.0.1 &

Po uruchomieniu dodaj [sport = :8000], aby wyświetlić tylko wiersz portu 8000.

ss -tlnp sport = :8000
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      5          127.0.0.1:8000      0.0.0.0:*    users:(("python3",pid=343015,fd=3))

W nawiasie po users znajdują się kolejno nazwa programu, pid i numer deskryptora pliku (fd).

Po zakończeniu sprawdzania zatrzymaj prosty serwer WWW poleceniem [kill %1]. Jeśli potem ponownie uruchomisz [ss -tln sport = :8000], zostanie tylko wiersz nagłówka, a wiersz portu 8000 już się nie pojawi.

Na koncie root ss może odczytać informacje o wszystkich procesach, więc kolumna Process jest wypełniona. Gdy na jednym porcie nasłuchuje razem kilka procesów, w nawiasie users pojawia się wpis dla każdego z nich. Nazwy programów i pid w poniższym wyniku root to wartości przykładowe.

ss -tlnp sport = :443
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      511          0.0.0.0:443       0.0.0.0:*    users:(("app",pid=2101,fd=6),("app",pid=2100,fd=6))
LISTEN 0      511             [::]:443          [::]:*    users:(("app",pid=2101,fd=7),("app",pid=2100,fd=7))

Aby znaleźć program po numerze portu, możesz też użyć polecenia lsof w postaci [lsof -i :443].

Jak kolumna Process zmienia się zależnie od konta, porównasz na poniższym diagramie, przełączając konta.

🧭 ss -p i konta: kiedy kolumna Process się wypełnia
Diagram objaśniający
👤 Konto
$# ss -tlnp
Nasłuchujące gniazdoInformacje o procesieKolumna Process
0.0.0.0:22LISTEN
➜
/proc/812/fdWłaściciel: root
➜
Procesy innych kont: nieczytelneroot: czyta wszystkie procesyKolumna Process pustausers:(("sshd",pid=812,fd=3))
127.0.0.1:8080LISTEN
➜
/proc/2100/fdWłaściciel: root
➜
Procesy innych kont: nieczytelneroot: czyta wszystkie procesyKolumna Process pustausers:(("app",pid=2100,fd=3))
127.0.0.1:8000LISTEN
➜
/proc/343015/fdWłaściciel: user
➜
Procesy mojego konta: czytelneroot: czyta wszystkie procesyusers:(("python3",pid=343015,fd=3))
Zwykłe konto nie może odczytać informacji /proc procesów uruchomionych przez inne konta, więc kolumna Process w tych wierszach jest pusta, a wypełnia się tylko wiersz python3 uruchomionego z własnego konta.
root może odczytać informacje o wszystkich procesach, więc dla każdego nasłuchującego gniazda w kolumnie Process pojawiają się nazwa programu i pid.

4️⃣ Opcje filtrowania ss według stanu i portu

  • ↪️ state, dport, sport

Nawet po sprawdzeniu otwartych portów trzeba osobno wybrać, kto jest teraz połączony z tymi portami. ss zostawia tylko potrzebne wiersze, gdy po opcjach dodasz warunki filtra.

Gdy po state wpiszesz nazwę stanu, zostaną tylko gniazda w tym stanie. Wynik [ss -tn state established] nie ma kolumny State i zaczyna się od kolumny Recv-Q.

ss -tn state established
Recv-Q Send-Q Local Address:Port  Peer Address:Port Process
0      0       203.0.113.10:22    198.51.100.7:51114
0      0       203.0.113.10:26676   192.0.2.15:443
0      0       203.0.113.10:29714   192.0.2.16:443

Porty filtrujesz przez dport (port drugiej strony) i sport (port po twojej stronie). Połączenia wychodzące z serwera do zewnętrznych serwerów https wybierasz przez [dport = :443].

ss -tn dport = :443
State Recv-Q Send-Q Local Address:Port  Peer Address:PortProcess
ESTAB 0      0       203.0.113.10:26676   192.0.2.15:443
ESTAB 0      0       203.0.113.10:29714   192.0.2.16:443

Używając sport razem z -l, sprawdzisz tylko, czy dany port nasłuchuje.

ss -tln sport = :22
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*
LISTEN 0      128             [::]:22           [::]:*

Kilka warunków łączysz nawiasami i or, a całość ujmujesz w pojedyncze cudzysłowy, żeby powłoka nie zinterpretowała nawiasów wcześniej. Poniżej wynik wybrania tylko połączeń ssh według przykładu ze strony man.

ss -tn state established '( dport = :ssh or sport = :ssh )'
Recv-Q Send-Q Local Address:Port Peer Address:Port Process
0      0       203.0.113.10:22   198.51.100.7:51114

TIME-WAIT to stan, w którym połączenie pozostaje przez chwilę po rozłączeniu. Nie pojawia się w domyślnym wyniku, więc zobaczysz go dopiero po osobnym wybraniu przez [state time-wait].

ss -tn state time-wait
Recv-Q Send-Q Local Address:Port  Peer Address:PortProcess
0      0          127.0.0.1:28750    127.0.0.1:80
0      0          127.0.0.1:57698    127.0.0.1:8080
0      0              [::1]:31936        [::1]:80

Jeśli pomylisz nazwę stanu, polecenie od razu się kończy, zostawiając tylko jeden wiersz błędu [wrong state name]. Poniżej wynik celowego wpisania foo. Dostępne nazwy znajdziesz w wierszu TCP-STATES wyniku [ss -h].

ss -tn state foo
ss: wrong state name: foo

📌 Główne opcje: wyniki z tego artykułu

OpcjaZadanieWynik w tym artykule
-tPokazuje tylko gniazda TCPGniazda Unix znikają, a w miejscu portu pojawiają się nazwy usług, takie jak ssh i https
-nPokazuje numery portów zamiast nazw usługW ss -tn ssh pojawia się jako 22, a https jako 443
-lPokazuje tylko nasłuchujące (LISTEN) gniazdass -tln pokazuje nasłuchujące porty, takie jak 22, 80 i 443
-uPokazuje tylko gniazda UDPW kolumnie stanu ss -uln wszędzie jest UNCONN
-pPokazuje w kolumnie Process program używający gniazdaNa zwykłym koncie nazwę i pid ma tylko python3 uruchomiony z mojego konta, programy innych kont są puste
-sPodsumowuje liczbę według rodzaju zamiast listy gniazdestab 9 w wierszu TCP zgadza się z 9 wierszami wyniku state established bez nagłówka
-4Pokazuje tylko gniazda IPv4W ss -t4ln znikają wiersze zaczynające się od [::]
-6Pokazuje tylko gniazda IPv6W ss -t6ln znikają wiersze zaczynające się od 0.0.0.0 i 127.0.0.1
-HPokazuje tylko wiersze gniazd, bez nagłówkaLiczba wierszy ss -H -tln | wc -l nie obejmuje nagłówka
state STANZostawia tylko gniazda w tym stanieWynik state established zaczyna się od Recv-Q bez kolumny State, nieistniejąca nazwa daje [wrong state name: foo]
dport = :PORTFiltruje według portu drugiej stronydport = :443 pokazuje dwa wiersze połączeń wychodzących do zewnętrznych serwerów https
sport = :PORTFiltruje według portu po twojej stroniesport = :22 razem z -l pokazuje dwa nasłuchujące wiersze portu 22, IPv4 i IPv6
src ADRESZostawia tylko gniazda tego adresuss -tln src 127.0.0.1 pokazuje tylko porty na 127.0.0.1, które przyjmują połączenia wyłącznie z wnętrza serwera

📎 Pozostałe opcje: według oficjalnego podręcznika

OpcjaZadanie
-a, --allPokazuje razem gniazda nasłuchujące i połączone
-r, --resolveZamienia adresy i numery portów na nazwy
-e, --extendedPokazuje dla każdego gniazda szczegóły, takie jak uid i inode
-o, --optionsPokazuje informacje o zegarach, takie jak retransmisja TCP i keepalive
-m, --memoryPokazuje pamięć używaną przez każde gniazdo
-i, --infoPokazuje wewnętrzne informacje TCP (rtt, cwnd itd.)
-x, --unixPokazuje tylko gniazda domeny Unix
-w, --rawPokazuje tylko gniazda RAW
-f RODZINAWybiera według rodziny gniazd, takiej jak unix, inet, inet6, link lub netlink
-Q, --no-queuesPokazuje wynik bez kolumn Recv-Q i Send-Q
-K, --killWymusza zamknięcie gniazd pasujących do filtra, gniazda nieobsługiwane przez jądro są pomijane
-E, --eventsNa bieżąco pokazuje zamykane gniazda
-V, --versionWypisuje informacje o wersji

🔲 Symulator polecenia ss

W poniższym symulatorze możesz sam wpisać omówione dotąd opcje i filtry oraz porównać wynik z [netstat -tln].

Symulator polecenia ssiproute2 6.1.0
[root@server work]#
To ekran zwykłego konta (user), który działa tylko w przeglądarce; strzałkami ↑↓ przywołujesz wcześniej wpisane polecenia.

5️⃣ Podsumowanie gniazd w ss (-s)

-s zamiast listy gniazd wypisuje podsumowanie liczby według rodzaju. Według strony man nie liczy listy po kolei, tylko zbiera liczby z różnych statystyk.

ss -s
Total: 340
TCP:   48 (estab 9, closed 15, orphaned 0, timewait 13)

Transport Total     IP        IPv6
RAW       0         0         0
UDP       8         4         4
TCP       33        25        8
INET      41        29        12
FRAG      0         0         0

estab w wierszu TCP to liczba połączeń nawiązanych w tej chwili. Dlatego możesz ją porównać z liczbą wierszy wypisanych przez [state established] w tym samym momencie.

ss -tn state established | wc -l
10

Po odjęciu jednego wiersza nagłówka z 10 wierszy wyniku zostaje 9, tyle samo co estab 9 z -s. timewait 13 to liczba gniazd TIME-WAIT, które były widoczne tylko po wybraniu przez [state time-wait].

6️⃣ Polecenie ss w porównaniu z netstat

netstat należy do pakietu net-tools, którego strona man opisuje netstat jako program już prawie nieużywany (mostly obsolete) i zaleca zamiast niego ss. Skrypty napisane pod format wyniku netstat nie odczytają jednak wyniku ss bez zmian, bo kolejność kolumn i zapis adresów są inne.

Po wypisaniu nasłuchujących portów TCP tego samego serwera oboma poleceniami okazało się, że netstat umieszcza stan na samym końcu i zapisuje adresy IPv6 jako :::22.

netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN
tcp6       0      0 :::443                  :::*                    LISTEN

W ss stan jest na samym początku, a adresy IPv6 są ujęte w nawiasy kwadratowe, jak [::]:22.

ss -tln
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*
LISTEN 0      511          0.0.0.0:80        0.0.0.0:*
LISTEN 0      511          0.0.0.0:443       0.0.0.0:*
LISTEN 0      511        127.0.0.1:8080      0.0.0.0:*
LISTEN 0      128             [::]:22           [::]:*
LISTEN 0      511             [::]:80           [::]:*
LISTEN 0      511             [::]:443          [::]:*

Często używane opcje netstat odpowiadają następującym poleceniom ss i ip.

netstatPolecenie zastępcze / co pokazuje
netstat -tlnss -tlnNasłuchujące porty TCP jako numery
netstat -tulpnss -tulpnNasłuchujące porty TCP i UDP z programami
netstat -tanss -tanWszystkie gniazda TCP jako numery
netstat -rip routeTablica routingu
netstat -iip -s linkStatystyki interfejsów sieciowych
Polecenia ip zastępujące netstat -r i netstat -i są opisane w sekcji NOTES strony man netstat(8) z pakietu net-tools.

🔢 FAQ & polecane treści

Z -4 zostają tylko gniazda IPv4, a z -6 tylko gniazda IPv6. W [ss -t4ln] zniknęły wiersze zaczynające się od [::], a w [ss -t6ln] wiersze zaczynające się od 0.0.0.0 i 127.0.0.1.

Gdy po src wpiszesz adres, zostaną tylko nasłuchujące gniazda tego adresu. [ss -tln src 127.0.0.1] wypisało tylko porty na 127.0.0.1, z którymi nie można się połączyć spoza serwera.

Z -H pojawiają się tylko wiersze gniazd, bez nagłówka. Przy liczeniu wierszy, jak w [ss -H -tln | wc -l], wiersz nagłówka nie jest wliczany.

🧭 Polecane treści o poleceniach sieciowych 13 artykułów · 3 źródła
🗂️ Polecenia sieciowe
📄 Polecenie ip 📄 Polecenia netstat · ifconfig 📄 Polecenie nmtui 📄 Polecenie ss
📄 Polecenie SSH 📄 Polecenie rsync 📄 Polecenie wget 📄 Polecenia rz · sz
📄 Polecenie host 📄 Polecenie nslookup
📄 Polecenie iptables 📄 Polecenie firewall-cmd 📄 Polecenie certbot

ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 10   +   3   =