Спестете 15% от всички хостинг услуги

Тествай уменията си и получи Отстъпка за всеки хостинг план

Използвайте код: Skills За начало
Заглавия
Linux Защита

Проверка на отворени и слушащи портове в Linux с помощта на netstat и ss

Мониторирането на отворени и слушащи портове на Linux система е една от най-критичните практики за поддържане на сигурност на сървъра, диагностициране на мрежови проблеми и ефективно управление на вашата инфраструктура. Чрез редовно одитиране кои портове са отворени и кои услуги са свързани с тях, можете проактивно да идентифицирате неоторизирани опити за достъп, да открийте неправилни конфигурации и да елиминирате ненужни повърхности за атака преди те да станат сериозни уязвимости.

Независимо дали управлявате приложение с висок трафик на VPS Hosting план или управлявате флот от bare-metal машини, разбирането на мрежовата експозиция на вашия Linux сървър е неоспоримо. Това ръководство предоставя всеобхватно, технически точно обяснение как да използвате както netstat така и ss — двата най-широко използвани инструменти от командния ред за инспекция на портове на Linux — заедно със допълнителни инструменти и практики от реалния свят.

1. Разбиране на портовете и техните типове

Преди да се потопим в самите инструменти, е важно да установим ясно разбиране на това какво са портовете, как се категоризират и защо мониторирането им е важно.

Какво е мрежов порт?

Мрежовият порт е логична точка на комуникация, свързана с конкретен процес или услуга на хост. Портовете позволяват на един сървър с един IP адрес да работи с множество мрежови услуги едновременно — например, уеб сървър на порт 80, SSH демон на порт 22 и база данни на порт 3306.

Категории портове

ДиапазонКатегорияОписание
0–1023Добре известни портовеЗапазени за стандартни системни услуги (HTTP, SSH, FTP и т.н.)
1024–49151Регистрирани портовеИзползвани от приложения и middleware (MySQL, PostgreSQL и т.н.)
49152–65535Динамични/Временни портовеВременно присвоени за изходящи клиентски връзки

Състояния на портовете, които ще срещнете

  • LISTEN — Портът е отворен и услуга активно чака входящи връзки.
  • ESTABLISHED — Съществува активна връзка между две точки.
  • TIME_WAIT — Връзката се затваря; системата чака, за да се уверим, че отдалеченият край е получил финалното потвърждение.
  • CLOSE_WAIT — Отдалеченият край е затворил връзката; локалното приложение все още не е затворило своята страна.

Транспортни протоколи

  • TCP (Transmission Control Protocol): Ориентиран към връзката, надежден, с проверка на грешки и гарантирана доставка. Използван от HTTP, HTTPS, SSH, FTP и повечето протоколи на приложния слой.
  • UDP (User Datagram Protocol): Без връзка, по-бърз, но без гаранции за доставка. Използван от DNS, NTP, DHCP и услуги за потоково предаване.

2. Проверка портове с netstat

Какво е netstat?

netstat (мрежова статистика) е класическа команда за командния ред, която показва активни мрежови връзки, таблици за маршрутизиране, статистика на интерфейсите и слушащи портове. Въпреки че официално е остаряла в полза на ss в съвременните дистрибуции на Linux, netstat остава широко разпространена — особено в наследени системи и в среди, където администраторите са дълбоко запознати със синтаксиса й.

Инсталиране на netstat

netstat е част от пакета net-tools, който вече не се инсталира по подразбиране в много съвременни дистрибуции. Инсталирайте го както следва:

Debian / Ubuntu:

sudo apt update && sudo apt install net-tools -y

CentOS / RHEL / AlmaLinux / Rocky Linux:

sudo yum install net-tools -y
# or on newer versions:
sudo dnf install net-tools -y

Arch Linux:

sudo pacman -S net-tools

Основен синтаксис на netstat

sudo netstat [options]

Проверка на всички слушащи TCP и UDP портове

sudo netstat -tuln

Разбивка на флаговете:

ФлагЗначение
-tПоказване на TCP връзки и портове
-uПоказване на UDP връзки и портове
-lПоказване само на слушащи сокети (портове, които очакват връзки)
-nПоказване на числови IP адреси и номера на портове (пропускане на DNS разрешаване за скорост)

Пример на изход:

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:*

Четене на изхода:

  • Proto — Използваният протокол (tcp, udp, tcp6, udp6).
  • Local Address — IP адресът и номерът на порта, на които услугата слуша. 0.0.0.0 означава, че услугата слуша на всички налични интерфейси; 127.0.0.1 означава, че е достъпна само локално.
  • Foreign Address — Адресът на отдалечения клиент (показан като 0.0.0.0:* за слушащи портове без активна връзка).
  • State — Състоянието на връзката (LISTEN, ESTABLISHED, TIME_WAIT, и т.н.).

Включване на информация за процеса

За да видите кой процес притежава всеки слушащ порт, добавете флага -p:

sudo netstat -tulnp

Пример на изход с информация за процеса:

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

> Забележка: Трябва да стартирате тази команда с sudo за да видите имена на процеси за всички потребители, не само за вашите.

Филтриране на изхода за конкретни портове или услуги

Използвайте grep за да стеснете резултатите до конкретен порт или услуга:

# 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"

Преглед на всички активни връзки (не само слушащи)

За да видите всички активни връзки, включително установени, премахнете флага -l:

sudo netstat -tunp

Показване на таблица за маршрутизиране

sudo netstat -r

Показване на статистика на мрежовия интерфейс

sudo netstat -i

3. Проверка портове със ss

Какво е ss?

ss (socket statistics) е модерната замяна на netstat, разработена като част от пакета iproute2. Той комуникира директно с Linux ядрото чрез Netlink сокети, което го прави значително по-бърз и по-ефективен от netstat — особено на системи с хиляди едновременни връзки.

ss е инсталиран по подразбиране на практически всички модерни Linux дистрибуции, включително Ubuntu 18.04+, CentOS 7+, Debian 9+ и техните производни.

Основен синтаксис на ss

ss [options] [filter]

Проверка на всички слушащи TCP и UDP портове

ss -tuln

Флаговете имат идентично значение на netstat:

ФлагЗначение
-tПоказване на TCP сокети
-uПоказване на UDP сокети
-lПоказване само на слушащи сокети
-nПоказване на числови адреси (без DNS разрешаване)

Пример на изход:

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:*

Включване на информация за процеса

sudo ss -tulnp

Пример на изход:

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))

Филтриране по протокол

Показване само на слушащи TCP портове:

ss -tl

Показване само на слушащи UDP портове:

ss -ul

Показване на всички TCP връзки (включително установени):

ss -t

Напредналото филтриране със ss

Една от най-мощните функции на ss е вградено филтриране на базата на изрази, което ви позволява да филтрирате по порт, адрес, състояние и други — без да разчитате на grep.

Филтриране по конкретен номер на порт:

ss -tuln sport = :80
ss -tuln sport = :443
ss -tuln sport = :22

Филтриране по порт на дестинация:

ss -tuln dport = :3306

Показване на всички сокети в състояние ESTABLISHED:

ss -t state established

Показване на всички сокети в състояние LISTEN:

ss -t state listening

Филтриране по IP адрес на източника:

ss -tuln src 192.168.1.100

Показване на връзки към конкретен отдалечен хост:

ss -t dst 203.0.113.50

Комбиниране на множество филтри:

ss -t state established '( dport = :443 or sport = :443 )'

Показване на използване на памет на сокета

ss може също да показва подробно използване на памет за всеки сокет, което е полезно за диагностициране на проблеми с производителността:

ss -tm

Показване на информация за таймер

ss -to

Това показва таймери за повторно предаване и таймери за поддържане на живост за TCP връзки, което е безценно за диагностициране на проблеми със стабилността на връзката.

4. Сравняване на netstat срещу ss

И двата инструмента постигат една и съща основна цел, но има значими разлики, които трябва да ръководят вашия избор:

Функцияnetstatss
Пакетnet-tools (често не е прединсталиран)iproute2 (прединсталиран на модерни дистрибуции)
СкоростПо-бавен (чете от /proc/net/)По-бърз (използва Netlink интерфейс на ядрото)
Производителност при мащабДеградира с хиляди връзкиОбработва голям брой връзки ефективно
Разширено филтриранеИзисква пайпване към grepВградено филтриране на базата на изрази
Детайл на изходаДобърПо-детайлен (памет, таймери и т.н.)
Поддръжка на IPv6АдекватнаОтлична
Статус на поддръжкатаОстарялАктивно поддържан
Крива на обучениеПозната на администраторите с дълъг стажМалко различен синтаксис, но добре документиран

Кога да използвате netstat

  • При администриране на по-стари Linux системи (CentOS 6, Debian 7 и т.н.), където ss може да не е налична.
  • При работа със скриптове или документация, които вече използват синтаксис на netstat.
  • Когато сте по-удобни с неговия формат на изхода и не се нуждаете от разширено филтриране.

Кога да използвате ss

  • На всяка модерна Linux дистрибуция (Ubuntu 18.04+, CentOS 7+, Debian 9+ и по-нови).
  • При управление на сървъри с голям обем едновременни връзки — като тези, работещи на Dedicated Servers под тежко натоварване.
  • Когато се нуждаете от разширено филтриране, информация за таймери или статистика за памет на сокета.
  • За автоматизация и скриптване, където производителността е важна.

5. Други инструменти за проверка на отворени портове

Освен netstat и ss, няколко други утилити са полезни за инспекция на портове и анализ на мрежата на Linux.

lsof — List Open Files (Including Sockets)

lsof (List Open Files) третира мрежовите сокети като файлове (в съответствие с философията на Linux “всичко е файл”) и може да покаже кой процес има отворен определен порт.

Инсталирайте lsof:

# Debian/Ubuntu
sudo apt install lsof -y

# CentOS/RHEL
sudo yum install lsof -y

Проверете кой процес използва порт 80:

sudo lsof -i :80

Проверете кой процес използва порт 443:

sudo lsof -i :443

Изведете всички мрежови връзки:

sudo lsof -i

Изведете всички TCP слушащи сокети:

sudo lsof -i TCP -s TCP:LISTEN

Пример на резултат:

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 е мощен инструмент за сканиране на мрежа, използван за одит на сигурността, откритие на мрежа и сканиране на портове. За разлика от ss и netstat (които инспектират локалната система), nmap може да сканира както локални, така и отдалечени хостове.

Инсталирайте nmap:

# Debian/Ubuntu
sudo apt install nmap -y

# CentOS/RHEL
sudo yum install nmap -y

Сканирайте всички TCP портове на localhost:

sudo nmap -sT localhost

Сканирайте за отворени портове с детекция на операционната система:

sudo nmap -sT -O localhost

Сканирайте определен диапазон портове:

sudo nmap -p 1-1024 localhost

Сканирайте UDP портове (изисква root):

sudo nmap -sU localhost

Сканирайте отдалечен сървър:

sudo nmap -sT 203.0.113.50

> Важно: Сканирайте само системи, които притежавате или имате изрично разрешение да сканирате. Неоторизираното сканиране на портове може да нарушава закони и условия на услугата.

fuser — Идентифицирайте процесите, които използват файлове или сокети

# 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/ — Преки интерфейс на ядрото

За целите на скриптирането можете да прочетете информацията за портовете директно от виртуалната файлова система на ядрото на Linux:

# View raw TCP socket table
cat /proc/net/tcp

# View raw UDP socket table
cat /proc/net/udp

Имайте предвид, че адресите и портовете в /proc/net/tcp се показват в шестнадесетична система и изискват преобразуване за четимост от човека. Инструменти като ss и netstat автоматично анализират тези данни.

6. Най-добри практики за сигурност при управление на отворени портове

Знанието как да проверите отворени портове е само половината от битката. Действието на базата на тази информация е това, което поддържа вашия сървър сигурен. Ето практически препоръки, които всеки администратор на Linux трябва да следва:

Принцип на минимална експозиция

Експозирайте само портовете, които са абсолютно необходими за функционирането на вашето приложение. Всеки отворен порт е потенциален вектор на атака. Редовно одитирайте слушащите портове и затворете или защитете с firewall всичко, което не трябва да бъде публично достъпно.

Свързване на услуги към конкретни интерфейси

Избягвайте свързването на услуги към 0.0.0.0 (всички интерфейси), освен ако не е необходимо. Например, сървър на MySQL база данни трябва да слуша само на 127.0.0.1 ако е достъпен само локално:

# In /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 127.0.0.1

Използвайте Firewall

Използвайте ufw (Ubuntu) или firewalld / iptables (CentOS/RHEL) за ограничаване на достъпа до отворени портове по IP адрес, подмрежа или мрежов интерфейс:

# 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 22

Редовно одитирайте слушащите портове

Планирайте редовни одити на портове, използвайки cron задачи или инструменти за мониторинг. Нов слушащ порт може да указва компрометирана услуга, неправилна конфигурация или — в най-лошия случай — malware:

# Quick audit command — save output and compare over time
sudo ss -tulnp > /var/log/port_audit_$(date +%F).txt

Защитете услугите с SSL/TLS

Всяка услуга, експозирана в интернет — уеб сървъри, пощенски сървъри, контролни панели — трябва да използва криптирани връзки. Комбинирайте отворените портове с валидни SSL сертификати за защита на данните при предаване и предотвратяване на атаки man-in-the-middle.

Мониторирайте неочаквани промени

Използвайте инструменти за обнаружаване на проникване като AIDE, Tripwire или auditd за да ви уведомят, когато нови процеси започнат да слушат на портове. Интегрирайте с централизирано логване (напр. ELK Stack, Graylog) за всеобхватна видимост.

Деактивирайте неизползвани услуги

Ако услуга не е необходима, спрете я и деактивирайте я от стартиране при зареждане:

# Stop and disable a service (systemd)
sudo systemctl stop <service-name>
sudo systemctl disable <service-name>

Бърз справочник: Най-полезни команди

Задачаnetstat командаss команда
Всички слушащи TCP/UDP портовеsudo netstat -tulnsudo ss -tuln
Всички слушащи портове с PIDsudo netstat -tulnpsudo ss -tulnp
Само слушащи TCP портовеsudo netstat -tlnsudo ss -tl
Само слушащи UDP портовеsudo netstat -ulnsudo ss -ul
Филтриране по порт 80`sudo netstat -tulngrep ":80"`sudo ss -tuln sport = :80
Всички установени връзкиsudo netstat -tunpsudo ss -t state established
Показване на таблица за маршрутизиранеsudo netstat -rip route show

Заключение

Мониторирането на отворени и слушащи портове е основно умение за всеки администратор на Linux системи или DevOps инженер. Независимо дали защитавате production уеб сървър, отстранявате проблем със свързаност или извършвате рутинен одит на сигурност, netstat и ss ви дават незабавна, практична видимост на експозицията на мрежата на вашата система.

За да обобщим ключовите изводи:

  • Използвайте ss като основен инструмент във всяко модерно Linux разпределение — той е по-бърз, с повече функции и активно поддържан.
  • Използвайте netstat при работа на наследени системи или когато съществуващи скриптове и работни процеси зависят от него.
  • Допълнете с lsof и nmap за по-дълбока инспекция на ниво процес и външно сканиране на портове.
  • Винаги действайте на основата на вашите находки — затворете ненужни портове, свържете услугите към правилните интерфейси и налагайте правила на защитната стена.
  • Защитете експозирани услуги с правилни SSL сертификати и контрол на достъпа.

Ако търсите хостинг среда, която ви дава пълен root достъп за прилагане на тези практики за сигурност, AlexHost’s VPS хостинг планове осигуряват пълен контрол над конфигурацията на вашия Linux сървър — включително управление на защитната стена, укрепване на услугите и мониторинг на мрежата. За екипи, които имат нужда от максимална производителност и посветени ресурси, нашите Dedicated сървъри доставляват необходимата мощност и изолация за операции на сигурност на корпоративно ниво. И ако предпочитате управлявана среда с познат интерфейс, разгледайте нашите VPS с cPanel опции за опростено управление на сървър без жертване на контрол.

Редовният одит на портове, комбиниран с укрепена конфигурация на сървър, е една от най-ефективните защити срещу неоторизиран достъп и нарушения на данни. Направете го редовна част от вашата практика на администриране на системи.