Рубрики: Аудит

TTY: Полный контроль над сетевыми портами сервера. Поиск через nmap cканирование и блокировка UFW

Вы когда-нибудь задумывались, почему веб-сервер на 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 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 - ваш выбор. По умолчанию он выключен.

  • Блокировка входящего трафика на порт:
    sudo ufw deny 3306/tcp
    Это запретит всем и каждому стучаться в MySQL.
  • Разрешить только с вашего IP:
    sudo ufw allow from 123.123.123.123 to any port 22
    Закрываем SSH от брутфорса, оставляя доступ только для офиса или домашнего IP.
  • Включение и проверка:
    sudo ufw enable
    sudo ufw status verbose
    Будьте осторожны: если вы по SSH, и не добавили правило allow 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

Типичные ошибки и их диагностика

Вы добавили правило, но порт все еще виден снаружи? Проверьте три вещи.

  1. Порядок правил (Iptables). Правила читаются сверху вниз. Если у вас в самом верху висит ACCEPT all, то нижестоящий DROP для конкретного порта никогда не сработает. Используйте iptables -L -n -v --line-numbers, чтобы увидеть порядок и удалить ненужное: iptables -D INPUT 3 (удалить правило номер 3).
  2. Привязка к интерфейсу. Вы открыли порт в фаерволе, но ss -tulpn показывает 127.0.0.1:5432. Это значит, что сервис (например, Postgresql) слушает только localhost. Он физически не принимает внешние соединения. Вам нужно править конфиг сервиса (обычно listen_addresses = '*' в postgresql.conf), а не фаервол.
  3. 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-скриптов. Только так вы сможете спать спокойно, зная, что ваши двери надежно заперты.

Похожие записи

Вам также может понравиться