Проверка на отворени и слушащи портове на Linux с помощта на netstat и ss
Мониторирането на отворени и слушащи портове на Linux система е една от най-критичните практики за поддържане на сигурност на сървъра, диагностициране на проблеми с мрежата и ефективно управление на инфраструктурата. Чрез редовно одитиране кои портове са отворени и кои услуги са свързани към тях, можете проактивно да идентифицирате неоторизирани опити за достъп, да открийте неправилни конфигурации и да елиминирате ненужни повърхности за атака преди да станат сериозни уязвимости.
Независимо дали управлявате приложение с висок трафик на VPS Hosting план или администрирате флот от bare-metal машини, разбирането на мрежовата експозиция на вашия Linux сървър е неотложно. Това ръководство предоставя всеобхватно, технически точно обяснение как да използвате както netstat така и ss — двата най-широко използвани инструмента от командния ред за инспекция на портове на Linux — заедно с допълнителни инструменти и практики от реалния свят.
Съдържание
- Разбиране на портовете и техните типове
- Проверка на портове с netstat
- Проверка на портове със ss
- Сравнение netstat срещу ss
- Други инструменти за проверка на отворени портове
- Най-добри практики за сигурност при управление на отворени портове
- Заключение
1. Разбиране на портовете и техните типове {#understanding-ports}
Преди да се потопим в самите инструменти, е важно да установим ясно разбиране какво са портовете, как се категоризират и защо мониторирането им е важно.
Какво е мрежов порт?
Мрежовият порт е логична крайна точка за комуникация, свързана със специфичен процес или услуга на хост. Портовете позволяват един сървър с един 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?
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?
ss (статистика на сокети) е съвременната замяна на 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Това показва таймери за повторно предаване и таймери за keepalive за TCP връзки, което е безценно за диагностициране на проблеми със стабилност на връзката.
4. Сравнение netstat срещу ss {#comparison}
И двата инструмента постигат същата фундаментална цел, но има значими разлики, които трябва да ръководят вашия избор:
| Функция | 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. Други инструменти за проверка на отворени портове {#other-tools}
Отвъд netstat и ss, няколко други утилити са полезни за инспекция на портове и анализ на мрежата на Linux.
lsof — Списък на отворени файлове (включително сокети)
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. Най-добри практики за сигурност при управление на отворени портове {#security}
Знанието как да проверите отворени портове е само половината от битката. Действието на базата на тази информация е това, което поддържа вашия сървър сигурен. Ето някои практически най-добри практики, които всеки Linux администратор трябва да следва:
Принцип на най-малката експозиция
Експонирайте само портове, които са абсолютно необходими за функциониране на вашето приложение. Всеки отворен порт е потенциален вектор на атака. Редовно одитирайте слушащите портове и затворете или защитете с firewall всичко, което не трябва да бъде публично достъпно.
Свързване на услуги към специфични интерфейси
Избягвайте свързване на услуги към 0.0.0.0 (всички интерфейси), освен ако не е необходимо. Например, сървър на база данни MySQL трябва да слуша само на 127.0.0.1 ако е достъпен само локално:
###PPT_NOTR_44
