15%

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

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

Използвайте код:

Skills
За начало
30.10.2024

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

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

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

Съдържание

  1. Разбиране на портовете и техните типове
  2. Проверка на портове с netstat
  3. Проверка на портове със ss
  4. Сравнение netstat срещу ss
  5. Други инструменти за проверка на отворени портове
  6. Най-добри практики за сигурност при управление на отворени портове
  7. Заключение

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

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}

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

Функция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. Други инструменти за проверка на отворени портове {#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

15%

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

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

Използвайте код:

Skills
За начало