Зачем проверять порты снаружи и изнутри
Утилиты вроде ss показывают, какие порты слушает программа на самом сервере. Но это взгляд изнутри: он не учитывает брандмауэр на узле, правила облачной панели или проброс на роутере. Пользователь снаружи видит другое. Поэтому для проверки нужны обе точки зрения: изнутри — что запущено, снаружи — что реально доступно.
Nmap решает вторую задачу: он посылает пакеты на порты и по ответам определяет состояние. Сравнивая результат с ожидаемым списком, вы обнаруживаете лишнее: забытую тестовую службу, базу данных, открытую всем, панель управления без защиты.
Условие использования простое: только свои узлы. Это ваш сервер, домашний роутер, устройство, за которое вы отвечаете, либо система, где владелец дал письменное согласие. Проверка чужого адреса без разрешения может считаться попыткой несанкционированного доступа, а провайдеры и хостеры вправе ограничить такому клиенту доступ.
Где запускать проверку, чтобы результат был честным
Если запустить сканирование с самого сервера на его же внешний адрес, вы получите картину, искажённую особенностями локальной маршрутизации. Правильный подход выглядит так.
- Запишите ожидаемый список открытых портов, например 22, 80 и 443.
- Выберите точку проверки в другой сети: другой сервер, мобильный интернет на телефоне в режиме точки доступа, знакомый с ноутбуком в иной сети.
- Выполните nmap -p 1-1024 адрес или nmap -p 22,80,443,3389 адрес, подставив адрес своего узла.
- Сравните результат со списком. Всё лишнее с состоянием open — повод разобраться.
- Повторите проверку изнутри локальной сети: расхождение подскажет, где стоит фильтр.
Для домашней сети внешним адресом служит адрес вашего роутера в интернете. Если провайдер использует общий адрес для многих абонентов, внешняя проверка невозможна, и порты недоступны снаружи по определению.
Как читать статусы портов
Nmap различает шесть состояний. Первые три встречаются чаще всего.
| Статус | Смысл | Что обычно значит |
|---|---|---|
| open | Служба принимает соединения | Порт доступен, проверьте, что так и задумано |
| closed | Узел ответил отказом | Порт достижим, но никто его не слушает |
| filtered | Ответа нет | Пакеты отбрасывает межсетевой экран или фильтр |
| unfiltered | Порт доступен, но состояние неясно | Бывает при ACK-сканировании |
| open или filtered | Неясно: открыт или отфильтрован | Типично для UDP |
| closed или filtered | Неясно: закрыт или отфильтрован | Редкие режимы |
Различие closed и filtered важно для выводов. Если у вас на сервере брандмауэр настроен на отбрасывание, закрытые порты будут выглядеть как filtered, и скан будет идти дольше из-за ожидания. Если настроен отказ, вы увидите closed. Оба варианта считаются безопасными: важно, чтобы не было лишних open.
Пример вывода (пример): 22/tcp open ssh, 80/tcp open http, 443/tcp open https, 3306/tcp filtered mysql. Последняя строка означает, что порт базы данных снаружи не отвечает, и это хороший результат.
Ключи и режимы, которые нужны в работе
- -p 1-1024 — сканирование заданного диапазона; -p- проверит все 65535 портов и займёт заметное время.
- --top-ports N — самые распространённые N портов, быстрый контроль.
- -sT — обычное подключение; работает без прав администратора.
- -sS — полуоткрытое SYN-сканирование, режим по умолчанию при запуске с правами администратора, быстрее и меньше нагружает узел.
- -sU — сканирование UDP; медленное, требует прав администратора, результат часто open|filtered.
- -Pn — не проверять, жив ли узел; нужен, если узел не отвечает на ping и nmap пропускает его.
- --reason — показать причину, по которой порту присвоен статус.
- -sV — определить программу и версию, удобно для инвентаризации.
- -oN файл — записать отчёт для сравнения в будущем.
В Windows установщик nmap ставит драйвер Npcap; без него запуск некоторых режимов невозможен. В Linux и macOS права администратора получают через sudo. Синтаксис ключей одинаков на всех платформах.
Как сделать из проверки регулярную практику
Один раз проверить порты недостаточно: конфигурация меняется, ставятся новые службы, обновления включают ранее отключённое. Договоритесь с самим собой о ритме: проверка после каждого изменения правил брандмауэра, проброса портов или установки службы, плюс плановая раз в месяц. Сохраняйте отчёты в файл и сравнивайте два последних, например командой diff в Linux и macOS или fc в Windows.
Для найденных лишних портов порядок такой: определить программу на сервере через ss или netstat; решить, нужна ли она; при необходимости ограничить доступ по адресам в брандмауэре или слушать только 127.0.0.1; иначе отключить службу. Не забывайте про UDP: забытая служба на UDP-порту тоже может быть открыта, хотя проверка TCP покажет чистоту.
Ограничьте темп на небольших каналах и слабых устройствах ключом -T3 и не запускайте полное сканирование в часы пиковой нагрузки. И ещё раз о границах: свои узлы либо явное разрешение владельца.
Ошибки интерпретации, которые встречаются чаще всего
Первая ошибка — считать закрытый порт признаком защищённости. Закрытый порт лишь означает, что на нём ничего нет, а вот открытый порт с устаревшей программой может оказаться уязвимым. Поэтому список открытых портов дополняйте контролем версий и обновлений.
Вторая ошибка — доверять единственному запуску. Фильтры бывают динамическими: часть систем блокирует адрес после серии обращений, и вторая половина сканирования покажет filtered там, где на самом деле порт открыт. Если результат необъяснимо меняется, снизьте темп и повторите проверку с другого адреса.
Третья ошибка — забыть про IPv6. У узла может быть и адрес IPv6, на котором брандмауэр настроен слабее, чем на IPv4. Ключ -6 включает сканирование по IPv6, и вам нужно выполнить его отдельно для адреса, который принадлежит вашему узлу. Четвёртая — забыть о виртуальных сетях и контейнерах, которые публикуют порты автоматически: список, увиденный снаружи, всегда сверяйте со списком опубликованных портов.
Для контроля результата достаточно простой таблицы: порт, служба, зачем открыт, кто отвечает. Любая строка без ответа на вопрос «зачем» — кандидат на закрытие.