Sprawdzanie otwartych i nasłuchujących portów w systemie Linux za pomocą netstat i ss
Monitorowanie otwartych i nasłuchujących portów w systemie Linux jest jedną z najkrytyczniejszych praktyk utrzymania bezpieczeństwa serwera, diagnozowania problemów sieciowych i efektywnego zarządzania infrastrukturą. Poprzez regularne audytowanie, które porty są otwarte i które usługi są do nich powiązane, możesz proaktywnie identyfikować nieautoryzowane próby dostępu, wykrywać błędy konfiguracji i eliminować niepotrzebne powierzchnie ataku, zanim staną się poważnymi lukami w zabezpieczeniach.
Niezależnie od tego, czy uruchamiasz aplikację o wysokim ruchu na planie VPS Hosting, czy zarządzasz flotą maszyn bare-metal, zrozumienie ekspozycji sieciowej serwera Linux jest niezbędne. Ten przewodnik zawiera kompleksowy, technicznie dokładny opis sposobu korzystania zarówno z netstat, jak i ss — dwóch najczęściej używanych narzędzi wiersza poleceń do inspekcji portów w Linux — wraz z narzędziami uzupełniającymi i najlepszymi praktykami z rzeczywistego świata.
Spis treści
- Zrozumienie portów i ich typów
- Sprawdzanie portów za pomocą netstat
- Sprawdzanie portów za pomocą ss
- Porównanie netstat vs. ss
- Inne narzędzia do sprawdzania otwartych portów
- Najlepsze praktyki bezpieczeństwa dla zarządzania otwartymi portami
- Podsumowanie
1. Zrozumienie portów i ich typów {#understanding-ports}
Przed przystąpieniem do samych narzędzi ważne jest ustalenie jasnego zrozumienia tego, czym są porty, jak są kategoryzowane i dlaczego ich monitorowanie ma znaczenie.
Co to jest port sieciowy?
Port sieciowy to logiczny punkt końcowy komunikacji powiązany z konkretnym procesem lub usługą na hoście. Porty umożliwiają pojedynczemu serwerowi z jednym adresem IP uruchamianie wielu usług sieciowych jednocześnie — na przykład serwer WWW na porcie 80, demon SSH na porcie 22 i bazę danych na porcie 3306.
Kategorie portów
| Zakres | Kategoria | Opis |
|---|---|---|
| 0–1023 | Porty dobrze znane | Zarezerwowane dla standardowych usług systemowych (HTTP, SSH, FTP, itp.) |
| 1024–49151 | Porty zarejestrowane | Używane przez aplikacje i oprogramowanie pośredniczące (MySQL, PostgreSQL, itp.) |
| 49152–65535 | Porty dynamiczne/efemeryczne | Tymczasowo przydzielane dla wychodzących połączeń klienta |
Stany portów, które napotkasz
- LISTEN — Port jest otwarty i usługa aktywnie czeka na połączenia przychodzące.
- ESTABLISHED — Istnieje aktywne połączenie między dwoma punktami końcowymi.
- TIME_WAIT — Połączenie się zamyka; system czeka, aby upewnić się, że zdalny koniec otrzymał ostateczne potwierdzenie.
- CLOSE_WAIT — Zdalny koniec zamknął połączenie; aplikacja lokalna jeszcze nie zamknęła swojej strony.
Protokoły transportu
- TCP (Transmission Control Protocol): Zorientowany na połączenie, niezawodny, z sprawdzaniem błędów i gwarantowaną dostawą. Używany przez HTTP, HTTPS, SSH, FTP i większość protokołów warstwy aplikacji.
- UDP (User Datagram Protocol): Bezpołączeniowy, szybszy, ale bez gwarancji dostawy. Używany przez DNS, NTP, DHCP i usługi streamingowe.
2. Sprawdzanie portów za pomocą netstat {#netstat}
Co to jest netstat?
netstat (statystyka sieciowa) to klasyczne narzędzie wiersza poleceń, które wyświetla aktywne połączenia sieciowe, tabele routingu, statystyki interfejsu i nasłuchujące porty. Chociaż zostało oficjalnie wycofane na rzecz ss w nowoczesnych dystrybucjach Linux, netstat pozostaje szeroko wdrażane — szczególnie w starszych systemach i w środowiskach, gdzie administratorzy są głęboko zaznajomieni z jego składnią.
Instalacja netstat
netstat jest częścią pakietu net-tools, który nie jest już instalowany domyślnie w wielu nowoczesnych dystrybucjach. Zainstaluj go w następujący sposób:
Debian / Ubuntu:
sudo apt update && sudo apt install net-tools -yCentOS / RHEL / AlmaLinux / Rocky Linux:
sudo yum install net-tools -y
# or on newer versions:
sudo dnf install net-tools -yArch Linux:
sudo pacman -S net-toolsPodstawowa składnia netstat
sudo netstat [options]Sprawdzanie wszystkich nasłuchujących portów TCP i UDP
sudo netstat -tulnRozbicie flag:
| Flaga | Znaczenie |
|---|---|
| -t | Wyświetl połączenia TCP i porty |
| -u | Wyświetl połączenia UDP i porty |
| -l | Pokaż tylko nasłuchujące gniazda (porty czekające na połączenia) |
| -n | Wyświetl numeryczne adresy IP i numery portów (pomiń rozdzielczość DNS dla szybkości) |
Przykładowe wyjście:
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 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp6 0 0 :::443 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*Czytanie wyjścia:
- Proto — Używany protokół (tcp, udp, tcp6, udp6).
- Local Address — Adres IP i numer portu, na którym nasłuchuje usługa. 0.0.0.0 oznacza, że usługa nasłuchuje na wszystkich dostępnych interfejsach; 127.0.0.1 oznacza, że jest dostępna tylko lokalnie.
- Foreign Address — Adres zdalnego klienta (pokazany jako * dla nasłuchujących portów bez aktywnego połączenia).
- State — Stan połączenia (LISTEN, ESTABLISHED, TIME_WAIT, itp.).
Włączenie informacji o procesie
Aby zobaczyć, który proces jest właścicielem każdego nasłuchującego portu, dodaj flagę -p:
sudo netstat -tulnpPrzykładowe wyjście z informacją o procesie:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1023/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2847/nginx
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 3102/mysqld> Uwaga: Musisz uruchomić to polecenie z sudo, aby zobaczyć nazwy procesów dla wszystkich użytkowników, a nie tylko swoich.
Filtrowanie wyjścia dla określonych portów lub usług
Użyj grep, aby zawęzić wyniki do określonego portu lub usługi:
# Check if anything is listening on port 80
sudo netstat -tuln | grep ":80"
# Check for SSH (port 22)
sudo netstat -tuln | grep ":22"
# Check for MySQL (port 3306)
sudo netstat -tuln | grep ":3306"
# Check for HTTPS (port 443)
sudo netstat -tuln | grep ":443"Wyświetlanie wszystkich aktywnych połączeń (nie tylko nasłuchujących)
Aby zobaczyć wszystkie aktywne połączenia, w tym ustalone, usuń flagę -l:
sudo netstat -tunpWyświetlanie tabeli routingu
sudo netstat -rWyświetlanie statystyk interfejsu sieciowego
sudo netstat -i3. Sprawdzanie portów za pomocą ss {#ss}
Co to jest ss?
ss (statystyka gniazda) to nowoczesna zamiana dla netstat, opracowana jako część pakietu iproute2. Komunikuje się bezpośrednio z jądrem Linux poprzez gniazda Netlink, co czyni go znacznie szybszym i bardziej wydajnym niż netstat — szczególnie w systemach z tysiącami jednoczesnych połączeń.
ss jest instalowany domyślnie na praktycznie wszystkich nowoczesnych dystrybucjach Linux, w tym Ubuntu 18.04+, CentOS 7+, Debian 9+ i ich pochodnych.
Podstawowa składnia ss
ss [options] [filter]Sprawdzanie wszystkich nasłuchujących portów TCP i UDP
ss -tulnFlagi mają identyczne znaczenie do netstat:
| Flaga | Znaczenie |
|---|---|
| -t | Pokaż gniazda TCP |
| -u | Pokaż gniazda UDP |
| -l | Pokaż tylko nasłuchujące gniazda |
| -n | Pokaż adresy numeryczne (bez rozdzielczości DNS) |
Przykładowe wyjście:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
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 128 127.0.0.1:3306 0.0.0.0:*
tcp LISTEN 0 511 [::]:443 [::]:*
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*Włączenie informacji o procesie
sudo ss -tulnpPrzykładowe wyjście:
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=1023,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2847,fd=6))
tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=3102,fd=21))Filtrowanie według protokołu
Pokaż tylko nasłuchujące porty TCP:
ss -tlPokaż tylko nasłuchujące porty UDP:
ss -ulPokaż wszystkie połączenia TCP (w tym ustalone):
ss -tZaawansowane filtrowanie za pomocą ss
Jedną z najpotężniejszych cech ss jest jego wbudowane filtrowanie oparte na wyrażeniach, które pozwala filtrować po porcie, adresie, stanie i nie tylko — bez polegania na grep.
Filtruj według określonego numeru portu:
ss -tuln sport = :80
ss -tuln sport = :443
ss -tuln sport = :22Filtruj według portu docelowego:
ss -tuln dport = :3306Pokaż wszystkie gniazda w stanie ESTABLISHED:
ss -t state establishedPokaż wszystkie gniazda w stanie LISTEN:
ss -t state listeningFiltruj według adresu IP źródła:
ss -tuln src 192.168.1.100Pokaż połączenia do określonego hosta zdalnego:
ss -t dst 203.0.113.50Połącz wiele filtrów:
ss -t state established '( dport = :443 or sport = :443 )'Wyświetlanie użycia pamięci gniazda
ss może również wyświetlać szczegółowe użycie pamięci na gniazdo, co jest przydatne do diagnozowania problemów z wydajnością:
ss -tmWyświetlanie informacji o timerze
ss -toTo pokazuje timery retransmisji i timery keepalive dla połączeń TCP, co jest nieocenione do diagnozowania problemów ze stabilnością połączenia.
4. Porównanie netstat vs. ss {#comparison}
Oba narzędzia osiągają ten sam fundamentalny cel, ale istnieją znaczące różnice, które powinny kierować Twoim wyborem:
| Funkcja | netstat | ss |
|---|---|---|
| Pakiet | net-tools (często nie preinstalowany) | iproute2 (preinstalowany w nowoczesnych dystrybucjach) |
| Szybkość | Wolniejszy (czyta z /proc) | Szybszy (używa interfejsu jądra Netlink) |
| Wydajność na dużą skalę | Pogarsza się przy tysiącach połączeń | Efektywnie obsługuje dużą liczbę połączeń |
| Zaawansowane filtrowanie | Wymaga potoku do grep | Wbudowane filtrowanie oparte na wyrażeniach |
| Szczegółowość wyjścia | Dobra | Bardziej szczegółowa (pamięć, timery, itp.) |
| Obsługa IPv6 | Odpowiednia | Doskonała |
| Status konserwacji | Wycofane | Aktywnie utrzymywane |
| Krzywa uczenia się | Znana długoletnim administratorom | Nieco inna składnia, ale dobrze udokumentowana |
Kiedy używać netstat
- Podczas administrowania starszymi systemami Linux (CentOS 6, Debian 7, itp.), gdzie ss może być niedostępne.
- Podczas pracy ze skryptami lub dokumentacją, która już używa składni netstat.
- Gdy bardziej czujesz się komfortowo z jego formatem wyjścia i nie potrzebujesz zaawansowanego filtrowania.
Kiedy używać ss
- Na każdej nowoczesnej dystrybucji Linux (Ubuntu 18.04+, CentOS 7+, Debian 9+ i nowsze).
- Podczas zarządzania serwerami z dużą liczbą jednoczesnych połączeń — takimi jak te uruchamiane na Dedicated Servers pod dużym obciążeniem.
- Gdy potrzebujesz zaawansowanego filtrowania, informacji o timerze lub statystyk pamięci gniazda.
- Do automatyzacji i skryptowania, gdzie wydajność ma znaczenie.
5. Inne narzędzia do sprawdzania otwartych portów {#other-tools}
Poza netstat i ss, kilka innych narzędzi jest przydatnych do inspekcji portów i analizy sieci w Linux.
lsof — Lista otwartych plików (w tym gniazd)
lsof (List Open Files) traktuje gniazda sieciowe jako pliki (zgodnie z filozofią Linux „wszystko jest plikiem”) i może wyświetlić, który proces ma otwarty określony port.
Zainstaluj lsof:
# Debian/Ubuntu
sudo apt install lsof -y
# CentOS/RHEL
sudo yum install lsof -ySprawdź, który proces używa portu 80:
sudo lsof -i :80Sprawdź, który proces używa portu 443:
sudo lsof -i :443Wyświetl wszystkie połączenia sieciowe:
sudo lsof -iWyświetl wszystkie nasłuchujące gniazda TCP:
sudo lsof -i TCP -s TCP:LISTENPrzykładowe wyjście:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 2847 root 6u IPv4 23456 0t0 TCP *:http (LISTEN)
nginx 2848 www-data 6u IPv4 23456 0t0 TCP *:http (LISTEN)nmap — Network Mapper
nmap to potężne narzędzie do skanowania sieci używane do audytów bezpieczeństwa, odkrywania sieci i skanowania portów. W przeciwieństwie do netstat i ss (które sprawdzają system lokalny), nmap może skanować zarówno hosty lokalne, jak i zdalne.
Zainstaluj nmap:
# Debian/Ubuntu
sudo apt install nmap -y
# CentOS/RHEL
sudo yum install nmap -ySkanuj wszystkie porty TCP na localhost:
sudo nmap -sT localhostSkanuj otwarte porty z detekcją systemu operacyjnego:
sudo nmap -sT -O localhostSkanuj określony zakres portów:
sudo nmap -p 1-1024 localhostSkanuj porty UDP (wymaga root):
sudo nmap -sU localhostSkanuj zdalny serwer:
sudo nmap -sT 203.0.113.50> Ważne: Skanuj tylko systemy, które posiadasz lub masz wyraźne pozwolenie na skanowanie. Nieautoryzowane skanowanie portów może naruszać prawa i warunki świadczenia usług.
fuser — Identyfikuj procesy używające plików lub gniazd
# Find which process is using port 80 (TCP)
sudo fuser 80/tcp
# Find which process is using port 53 (UDP)
sudo fuser 53/udp/proc/net/ — Bezpośredni interfejs jądra
Do celów skryptowania możesz czytać informacje o portach bezpośrednio z wirtualnego systemu plików jądra Linux:
# View raw TCP socket table
cat /proc/net/tcp
# View raw UDP socket table
cat /proc/net/udpZwróć uwagę, że adresy i porty w /proc/net/tcp są wyświetlane w formacie szesnastkowym i wymagają konwersji dla czytelności człowieka. Narzędzia takie jak netstat i ss automatycznie analizują te dane.
6. Najlepsze praktyki bezpieczeństwa dla zarządzania otwartymi portami {#security}
Wiedza o tym, jak sprawdzić otwarte porty, to tylko połowa bitwy. Działanie na podstawie tych informacji to to, co utrzymuje Twój serwer w bezpiecznym stanie. Oto praktyczne najlepsze praktyki, które powinien znać każdy administrator Linux:
Zasada najmniejszej ekspozycji
Odsłaniaj tylko porty, które są absolutnie niezbędne do funkcjonowania aplikacji. Każdy otwarty port to potencjalny wektor ataku. Regularnie audytuj nasłuchujące porty i zamykaj lub blokuj firewallem wszystko, co nie musi być publicznie dostępne.
Powiąż usługi z określonymi interfejsami
Unikaj powiązania usług z 0.0.0.0 (wszystkie interfejsy), chyba że jest to wymagane. Na przykład serwer bazy danych MySQL powinien nasłuchiwać tylko na 127.0.0.1, jeśli jest dostępny tylko lokalnie:
# In /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 127.0.0.1Użyj zapory sieciowej
Użyj ufw (Ubuntu) lub firewalld / iptables (CentOS/RHEL), aby ograniczyć dostęp do otwartych portów według adresu IP, podsieci lub interfejsu sieciowego:
# Allow SSH only from a specific IP (ufw)
sudo ufw allow from 203.0.113.10 to any port 22
# Deny all other access to port 22
sudo ufw deny 22Regularnie audytuj nasłuchujące porty
Zaplanuj regularne audyty portów za pomocą zadań cron lub narzędzi monitorowania. Nowy nasłuchujący port może wskazywać na zagrożoną usługę, błąd konfiguracji lub — w najgorszym przypadku — złośliwe oprogramowanie:
# Quick audit command — save output and compare over time
sudo ss -tulnp > /var/log/port_audit_$(date +%F).txtZabezpiecz usługi za pomocą SSL/TLS
Każda usługa eksponowana w Internecie — serwery WWW, serwery poczty, panele sterowania — powinna używać szyfrowanych połączeń. Połącz otwarte porty z ważnymi SSL Certificates, aby chronić dane w tranzycie i zapobiegać atakom man-in-the-middle.
Monitoruj nieoczekiwane zmiany
Użyj narzędzi do wykrywania włamań, takich jak Aide, Tripwire lub Osquery, aby otrzymywać alerty, gdy nowe procesy zaczynają nasłuchiwać na portach. Integruj z centralizowanym logowaniem (np. ELK Stack, Graylog) w celu uzyskania kompleksowej widoczności.
Wyłącz nieużywane usługi
Jeśli usługa nie jest potrzebna, zatrzymaj ją i wyłącz jej uruchamianie przy starcie:
# Stop and disable a service (systemd)
sudo systemctl stop <service-name>
sudo systemctl disable <service-name>Szybka referencja: najczęściej używane polecenia
| Zadanie | Polecenie netstat | Polecenie ss |
|---|---|---|
| Wszystkie nasłuchujące porty TCP/UDP | netstat -tuln | ss -tuln |
