Вы когда-нибудь задумывались, почему веб-сервер на 80-м порту отвечает, а кастомное приложение на 5000-м - недоступно? Сетевые порты "двери" в вашу систему, в которые часто заходят не те кто нужно, а именно - хакеры. Открытый порт сервис, готовый к общщению, но так-же и потенциальный путь для атаки. Закрытая - игнорирует любые попытки подключения.
В этой статье мы превратимся в администратора и хакера одновременно, чтобы понять, как работает сетевая безопасность. Мы пройдем путь от разведки (сканирования) до активной обороны (блокировки), используя де-факто стандарт индустрии - Nmap, и научимся писать скрипты для автоматизации этого багажа знаний.
Поиск открытых портов в Linux
Прежде чем что-то закрывать, нужно понять, что именно слушает вашу сеть. На каждом сервере всегда запущены процессы, которые "слушают" (Listen) определенные порты, ожидая входящих соединений. Не все из них очевидны.
Первый этап - внутренняя инспекция. В арсенале Linux есть команда netstat или её более современная замена ss. Это ваш внутренний аудит. Выполните sudo ss -tulpn. Ключи делают магию: -t (TCP), -u (UDP), -l (слушающие), -p (показать процесс), -n (не резолвить имена). Вы увидите таблицу: колонка Local Address:Port покажет, на каких портах и интерфейсах висит служба.
Особое внимание уделите адресу 0.0.0.0:22 или :::22 (IPv6). Это означает, что сервер слушает все доступные интерфейсы. Если вы видите 127.0.0.1:3306 (MySQL), это отлично - база данных доступна только локально и не светится в интернете. Но если там 0.0.0.0:3306, то любой желающий может попробовать подключиться к вашей БД, если, конечно, вы не отрезали его фаерволом. Это первая ласточка потенциальной проблемы.
Nmap: швейцарский нож сетевой "разведки"
Внутренние команды вроде ss показывают, что должно работать. Но настоящий тест на прочность взгляд со стороны. Nmap (Network Mapper) эмулирует действия злоумышленника, который сканирует ваш IP снаружи. Он отправляет специально сформированные пакеты и анализирует ответы.
Почему Nmap, а не telnet? Потому что он быстрее, умнее и многозадачнее. Он может сканировать тысячи портов за секунды, определять не только состояние порта (открыт/закрыт), но и версию сервиса, а иногда и операционную систему. Для системного администратора это незаменимый инструмент для аудита. Для злоумышленника - первый шаг к взлому. Мы будем использовать его легально - на своих серверах.
Установка элементарна: sudo apt install nmap (Debian/Ubuntu) или sudo yum install nmap (CentOS/RHEL).
Сканирование: от простого к сложному
Базовый синтаксис: nmap [цель]. Если просто запустить nmap 192.168.1.1, Nmap проверит 1000 самых популярных портов, отправив SYN-пакет (полуоткрытое соединение). Но это только вершина айсберга.
Вот несколько незаменимых техник:
- Сканирование всех портов (TCP Full):
sudo nmap -p- -sS target.com. Флаг-p-означает "все порты от 1 до 65535". Это долго, но тщательно. Вы удивитесь, сколько забытых сервисов иногда живет на нестандартных портах вроде 12345. - Определение версий сервисов:
sudo nmap -sV -p 22,80,443 target.com. Этот флаг заставляет Nmap не просто констатировать факт "порт 80 открыт", но и пытаться понять, что именно там: Apache 2.4 или Nginx 1.18? Идеально для инвентаризации ПО. - UDP сканирование:
sudo nmap -sU -p 53,161 target.com. UDP - протокол без установки соединения. Сканировать его сложнее и медленнее, но критически важно, так как DNS (53) или SNMP (161) часто становятся дырами в безопасности.
Магия SYN-скана (-sS)
По умолчанию, запущенный с sudo, Nmap использует SYN-скан. Технически это выглядит так: Nmap отправляет пакет с флагом SYN (запрос на соединение). Если порт открыт, сервер отвечает SYN-ACK. Вместо того, чтобы завершать рукопожатие (ACK), Nmap отправляет RST (сброс), обрывая соединение до того, как приложение на сервере узнает о попытке подключения. Это делает его "тихим" и быстрым. Если порт закрыт, сервер сразу ответит RST. Если пакет потерян или сброшен фаерволом - порт помечается как filtered.
Этот метод идеален для аудита, так как он минимизирует нагрузку на целевые сервисы и не засоряет их логи мусорными подключениями.
Bash + Nmap: Пишем автоматический сканер

Однострочные команды хороши для разовых проверок. Для регулярного аудита нужна автоматизация. Напишем простой, но мощный bash-скрипт, который проверяет доступность хоста и сканирует только открытые порты.
Создайте файл audit.sh:
#!/bin/bash
TARGET=$1
OUTPUT_DIR="scan_results"
mkdir -p $OUTPUT_DIR
if [ -z "$TARGET" ]; then
echo "Ошибка: укажи цель. Пример: $0 192.168.1.1"
exit 1
fi
echo "[+] Старт сканирования цели: $TARGET"
# 1. Ping sweep (проверка жив ли хост)
echo "[+] Проверка доступности..."
nmap -sn $TARGET -oN $OUTPUT_DIR/${TARGET}_ping.txt
# 2. Быстрый SYN-скан топ-1000 портов
echo "[+] Поиск открытых портов (скоростной)..."
OPEN_PORTS=$(sudo nmap -sS -T4 --min-rate 1000 $TARGET | grep 'open' | cut -d'/' -f1 | tr '\n' ',' | sed 's/,$//')
if [ -n "$OPEN_PORTS" ]; then
echo "[+] Найдены открытые порты: $OPEN_PORTS"
# 3. Глубокий анализ: версии и скрипты
echo "[+] Глубокое сканирование найденных портов..."
sudo nmap -sV -sC -p $OPEN_PORTS $TARGET -oA $OUTPUT_DIR/${TARGET}_detailed
else
echo "[-] Открытых портов не найдено или хост недоступен."
fi
echo "[+] Результаты сохранены в папку $OUTPUT_DIR"
Что здесь происходит? Сначала скрипт проверяет, жив ли хост. Затем запускает агрессивный SYN-скан с повышенной скоростью (-T4 --min-rate). Парсит вывод, чтобы получить список портов, и только по ним запускает тяжелый -sV -sC (определение версий и стандартные NSE-скрипты). Это экономит кучу времени.
Запуск: chmod +x audit.sh && ./audit.sh ваш_сервер.ru
Способы блокировки портов
Обнаружили открытый порт 3306 (MySQL) для всего мира или забытый Redis на 6379? Срочно закрываем. Есть два основных подхода: использование утилиты ufw (Uncomplicated Firewall) для новичков или прямые манипуляции с iptables для профи.
UFW: Простота и элегантность
Если у вас Ubuntu или Debian, ufw - ваш выбор. По умолчанию он выключен.
- Блокировка входящего трафика на порт:
Это запретит всем и каждому стучаться в MySQL.sudo ufw deny 3306/tcp - Разрешить только с вашего IP:
Закрываем SSH от брутфорса, оставляя доступ только для офиса или домашнего IP.sudo ufw allow from 123.123.123.123 to any port 22 - Включение и проверка:
Будьте осторожны: если вы по SSH, и не добавили правилоsudo ufw enable sudo ufw status verboseallow 22до включения - отключите себя от сервера. Это частая ошибка новичков.
Iptables: Хардкорное управление пакетами
ufw просто надстройка над iptables. Если вы на CentOS или хотите тотального контроля, работайте напрямую.
Правила срабатывают последовательно. Обычно политика по умолчанию - DROP (все запрещено), и мы открываем только нужное.
- Закрыть порт (дропнуть пакеты):
sudo iptables -A INPUT -p tcp --dport 8080 -j DROP - Вставить правило в начало (чтобы оно имело приоритет):
sudo iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT - Сохранение правил (важно!): После перезагрузки iptables сбрасывается. Сохраните конфиг:
# Debian/Ubuntu sudo iptables-save > /etc/iptables/rules.v4 # CentOS/RHEL sudo service iptables save
Firewalld: Зоновый подход (CentOS/RHEL 7+)
В CentOS 7+ рулит firewalld. Здесь концепция "зон" (public, internal и т.д.).
- Закрыть порт навсегда (permanent):
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent sudo firewall-cmd --reload - Проверить, что закрыто:
sudo firewall-cmd --list-all
Типичные ошибки и их диагностика
Вы добавили правило, но порт все еще виден снаружи? Проверьте три вещи.
- Порядок правил (Iptables). Правила читаются сверху вниз. Если у вас в самом верху висит
ACCEPT all, то нижестоящийDROPдля конкретного порта никогда не сработает. Используйтеiptables -L -n -v --line-numbers, чтобы увидеть порядок и удалить ненужное:iptables -D INPUT 3(удалить правило номер 3). - Привязка к интерфейсу. Вы открыли порт в фаерволе, но
ss -tulpnпоказывает127.0.0.1:5432. Это значит, что сервис (например, Postgresql) слушает только localhost. Он физически не принимает внешние соединения. Вам нужно править конфиг сервиса (обычноlisten_addresses = '*'в postgresql.conf), а не фаервол. - SELinux. На CentOS/RHEL фаервол может быть выключен, а порт не доступен. Проверьте SELinux:
getenforce. ЕслиEnforcing, он может блокировать приложение. Посмотрите логи:sudo ausearch -m avc -ts recentили временно отключите для теста:sudo setenforce 0. Работает? Значит, нужно править политики SELinux или переключить контекст порта.
Для наглядного сравнения методов управления портами приведем таблицу основных характеристик:
| Инструмент | Сложность | Сохранение правил | Поддержка зон | Рекомендуемый дистрибутив |
|---|---|---|---|---|
| UFW | Низкая | Автоматическое | Нет | Ubuntu/Debian |
| Iptables | Высокая | Ручное (iptables-save) | Нет | CentOS 6, старые системы |
| Firewalld | Средняя | Автоматическое (permanent) | Да (public, internal и др.) | CentOS/RHEL 7+ |
| Nmap (диагностика) | Средняя | Не применимо | Не применимо | Все дистрибутивы |
| Netstat/ss | Низкая | Не применимо | Не применимо | Все дистрибутивы |
Запомните главное: любой открытый порт прецендент для атаки. Если сервис не используется - выключите его. Если используется - ограничьте доступ по IP, используйте фаервол и регулярно проводите аудит с помощью Nmap и Bash-скриптов. Только так вы сможете спать спокойно, зная, что ваши двери надежно заперты.