Polecenie ss: sprawdzanie portów i procesów w Linuksie, porównanie z netstat
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 5Netid 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 * 46066199Dlatego, 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 -tState 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:httpsJeśli dodasz też -n, numery portów zostaną bez zmian i nie zamienią się w nazwy usług.
ss -tnState 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:443Kolumny 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 -tlnState 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 -tlState 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 -ulnState 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 -tulpnNetid 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 -tlnpState 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/fdls: cannot open directory '/proc/1/fd': Permission deniedProgramy 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 = :8000State 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 = :443State 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.
4️⃣ Opcje filtrowania ss według stanu i portu
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 establishedRecv-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:443Porty 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 = :443State 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:443Używając sport razem z -l, sprawdzisz tylko, czy dany port nasłuchuje.
ss -tln sport = :22State 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:51114TIME-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-waitRecv-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]:80Jeś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 fooss: wrong state name: foo📌 Główne opcje: wyniki z tego artykułu
| Opcja | Zadanie | Wynik w tym artykule | |
|---|---|---|---|
| -t | Pokazuje tylko gniazda TCP | Gniazda Unix znikają, a w miejscu portu pojawiają się nazwy usług, takie jak ssh i https | |
| -n | Pokazuje numery portów zamiast nazw usług | W ss -tn ssh pojawia się jako 22, a https jako 443 | |
| -l | Pokazuje tylko nasłuchujące (LISTEN) gniazda | ss -tln pokazuje nasłuchujące porty, takie jak 22, 80 i 443 | |
| -u | Pokazuje tylko gniazda UDP | W kolumnie stanu ss -uln wszędzie jest UNCONN | |
| -p | Pokazuje w kolumnie Process program używający gniazda | Na zwykłym koncie nazwę i pid ma tylko python3 uruchomiony z mojego konta, programy innych kont są puste | |
| -s | Podsumowuje liczbę według rodzaju zamiast listy gniazd | estab 9 w wierszu TCP zgadza się z 9 wierszami wyniku state established bez nagłówka | |
| -4 | Pokazuje tylko gniazda IPv4 | W ss -t4ln znikają wiersze zaczynające się od [::] | |
| -6 | Pokazuje tylko gniazda IPv6 | W ss -t6ln znikają wiersze zaczynające się od 0.0.0.0 i 127.0.0.1 | |
| -H | Pokazuje tylko wiersze gniazd, bez nagłówka | Liczba wierszy ss -H -tln | wc -l nie obejmuje nagłówka | |
| state STAN | Zostawia tylko gniazda w tym stanie | Wynik state established zaczyna się od Recv-Q bez kolumny State, nieistniejąca nazwa daje [wrong state name: foo] | |
| dport = :PORT | Filtruje według portu drugiej strony | dport = :443 pokazuje dwa wiersze połączeń wychodzących do zewnętrznych serwerów https | |
| sport = :PORT | Filtruje według portu po twojej stronie | sport = :22 razem z -l pokazuje dwa nasłuchujące wiersze portu 22, IPv4 i IPv6 | |
| src ADRES | Zostawia tylko gniazda tego adresu | ss -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
| Opcja | Zadanie | |
|---|---|---|
| -a, --all | Pokazuje razem gniazda nasłuchujące i połączone | |
| -r, --resolve | Zamienia adresy i numery portów na nazwy | |
| -e, --extended | Pokazuje dla każdego gniazda szczegóły, takie jak uid i inode | |
| -o, --options | Pokazuje informacje o zegarach, takie jak retransmisja TCP i keepalive | |
| -m, --memory | Pokazuje pamięć używaną przez każde gniazdo | |
| -i, --info | Pokazuje wewnętrzne informacje TCP (rtt, cwnd itd.) | |
| -x, --unix | Pokazuje tylko gniazda domeny Unix | |
| -w, --raw | Pokazuje tylko gniazda RAW | |
| -f RODZINA | Wybiera według rodziny gniazd, takiej jak unix, inet, inet6, link lub netlink | |
| -Q, --no-queues | Pokazuje wynik bez kolumn Recv-Q i Send-Q | |
| -K, --kill | Wymusza zamknięcie gniazd pasujących do filtra, gniazda nieobsługiwane przez jądro są pomijane | |
| -E, --events | Na bieżąco pokazuje zamykane gniazda | |
| -V, --version | Wypisuje 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].
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 -sTotal: 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 0estab 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 -l10Po 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 -tlnActive 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 :::* LISTENW ss stan jest na samym początku, a adresy IPv6 są ujęte w nawiasy kwadratowe, jak [::]:22.
ss -tlnState 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.
| netstat | Polecenie zastępcze / co pokazuje |
|---|---|
| netstat -tln | ss -tlnNasłuchujące porty TCP jako numery |
| netstat -tulpn | ss -tulpnNasłuchujące porty TCP i UDP z programami |
| netstat -tan | ss -tanWszystkie gniazda TCP jako numery |
| netstat -r | ip routeTablica routingu |
| netstat -i | ip -s linkStatystyki interfejsów sieciowych |
🔢 FAQ & polecane treści











ℹ️ 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.