Проверка на отворени и слушащи портове в 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 -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-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 -i3. Проверка портове със 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
И двата инструмента постигат една и съща основна цел, но има значими разлики, които трябва да ръководят вашия избор:
| Функция | netstat | ss |
|---|---|---|
| Пакет | 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 -tuln | sudo ss -tuln | |
| Всички слушащи портове с PID | sudo netstat -tulnp | sudo ss -tulnp | |
| Само слушащи TCP портове | sudo netstat -tln | sudo ss -tl | |
| Само слушащи UDP портове | sudo netstat -uln | sudo ss -ul | |
| Филтриране по порт 80 | `sudo netstat -tuln | grep ":80"` | sudo ss -tuln sport = :80 |
| Всички установени връзки | sudo netstat -tunp | sudo ss -t state established | |
| Показване на таблица за маршрутизиране | sudo netstat -r | ip route show |
Заключение
Мониторирането на отворени и слушащи портове е основно умение за всеки администратор на Linux системи или DevOps инженер. Независимо дали защитавате production уеб сървър, отстранявате проблем със свързаност или извършвате рутинен одит на сигурност, netstat и ss ви дават незабавна, практична видимост на експозицията на мрежата на вашата система.
За да обобщим ключовите изводи:
- Използвайте
ssкато основен инструмент във всяко модерно Linux разпределение — той е по-бърз, с повече функции и активно поддържан. - Използвайте
netstatпри работа на наследени системи или когато съществуващи скриптове и работни процеси зависят от него. - Допълнете с
lsofиnmapза по-дълбока инспекция на ниво процес и външно сканиране на портове. - Винаги действайте на основата на вашите находки — затворете ненужни портове, свържете услугите към правилните интерфейси и налагайте правила на защитната стена.
- Защитете експозирани услуги с правилни SSL сертификати и контрол на достъпа.
Ако търсите хостинг среда, която ви дава пълен root достъп за прилагане на тези практики за сигурност, AlexHost’s VPS хостинг планове осигуряват пълен контрол над конфигурацията на вашия Linux сървър — включително управление на защитната стена, укрепване на услугите и мониторинг на мрежата. За екипи, които имат нужда от максимална производителност и посветени ресурси, нашите Dedicated сървъри доставляват необходимата мощност и изолация за операции на сигурност на корпоративно ниво. И ако предпочитате управлявана среда с познат интерфейс, разгледайте нашите VPS с cPanel опции за опростено управление на сървър без жертване на контрол.
Редовният одит на портове, комбиниран с укрепена конфигурация на сървър, е една от най-ефективните защити срещу неоторизиран достъп и нарушения на данни. Направете го редовна част от вашата практика на администриране на системи.
от всички хостинг услуги