Каждый, кто хоть раз настраивал сервер или пытался понять, почему веб-приложение «не видит» базу в соседнем контейнере, сталкивался с магическим словосочетанием «сканирование портов». Казалось бы, что может быть проще — взять и проверить, открыт ли нужный порт. А потом выясняется, что «нужный» порт неожиданно слушает не тот процесс, а пакеты идут окольными путями через iptables, и вот вы уже по колено в tcpdump, хотя хотели всего лишь узнать: «А 5432-то жив?»
Чтобы не приходилось стартовать wireshark раньше времени, держите подробный (и местами ироничный) гид по самым популярным линуксовым сканерам.
Почему вообще нужно сканировать порты
Сканирование – это не только про «хакинг». Чаще всего его используют для:
- Аудита собственных сетей — вдруг наружу торчит админка Jenkins, о которой забыли?
- Триажа инцидентов — если сервис недоступен, первым делом проверяют, открыт ли порт или файрволл его тихо глушит.
- Мониторинга и инвентаризации — видел я корпоративные сети, где список серверов жили в Excel. Сканер значительно бодрит такие инфраструктуры.
- Пентестов — ну да, тут без порт-сканирования далеко не уехать.
Коротко об анатомии TCP/UDP-порта (чтобы потом не путаться)
Порт — виртуальная «дверь» в процесс, который слушает (listen) входящие соединения. У TCP-двери есть ручка (трёхстадийное рукопожатие), у UDP её нет — заходи, кто хочет, но гарантий доставки ноль. Сканер в самом общем случае:
- Создаёт пакет (SYN для TCP, пустышку для UDP).
- Шлёт его на нужный IP и порт.
- Смотрит, что вернулось: SYN-ACK → порт открыт, RST → закрыт, тишина → фильтруется.
Этого знания достаточно, чтобы понимать логи nmap и не пугаться флага -sS
.
nmap: дедушка всех сканеров, который до сих пор бодр
nmap появился в 1997-м, и с тех пор его интерфейс оброс ветвями опций примерно как новогодняя ёлка, если не обрезать её 28 лет подряд. С другой стороны, nmap – это «швейцарский нож», который умеет практически всё.
Установка
# Debian/Ubuntu
sudo apt install nmap
# RHEL/Fedora
sudo dnf install nmap
Базовые примеры
- Сканирование 1000 популярных портов на одном хосте:
nmap 192.168.1.10
- Полный диапазон TCP + UDP:
nmap -sS -sU -p- 192.168.1.10
- Скан всей подсети /24:
nmap -sn 192.168.1.0/24
(только пинг-скан, быстро выясняет, кто живой) - Определение ОС и сервисов:
nmap -A 192.168.1.10
- Многопоточный режим:
nmap --min-rate 5000 -p 1-65535 192.168.1.10
– шустро, но может вызвать подозрения у IDS.
Флаг -A
добавляет детекцию ОС, попытки входа на сервисы (скрипты NSE) и кучу красивых деталей, но может громко стучать в логи. Поэтому в продакшене сначала «щупаем» — -sS
(полуоткрытый SYN-скан), а уже потом -A
.
Когда nmap не подходит?
Если нужно просканировать /16 за минуту или вы пытаетесь обойтись без sudo
(SYN-скан без raw-сокетов невозможен), тогда в бой выходят «турбоскоростные» инструменты.
masscan: скорость на стероидах
masscan пишет пакеты напрямую в сетевой адаптер, поэтому способен «выливать» миллионы пакетов в секунду. Автор честно предупреждает: «Запускайте с осторожностью, иначе случайно DOS-ните чужую сеть».
Установка
git clone [URL=https://github.com/robertdavidgraham/masscan]https://github.com/robertdavidgraham/masscan[/URL]
cd masscan
make && sudo make install
Основные шоткаты
- Молниеносный скан одного порта по /16:
sudo masscan 10.0.0.0/16 -p80 --max-rate 100000
- Все TCP-порты на одном хосте:
sudo masscan 192.168.1.10 -p0-65535 --rate 2000
- Экспорт в nmap-совместимый XML:
--output-format xml --output-filename scan.xml
masscan хорош для «широких мазков» — быстро находит живые порты, а потом мы детализируем нmap'ом.
rustscan: дружелюбный мост между masscan и nmap
Если masscan — это бездушный автомат, то rustscan пытается быть «красивой обёрткой с призывом к действию». Он скринит хосты masscan-ом, а потом сам передаёт открытые порты в nmap для фингерпринтинга. Всё это с асинхронными I/O благами Rust.
Пример полной цепочки
rustscan -a 192.168.1.10 --ulimit 5000 -- -A -sC
После двоих тире (--
) идут чистые опции nmap, а --ulimit
— хитрый способ поднять количество одновременных сокетов без танцев с ulimit -n.
netcat (nc): швейцарский нож поглаживает порты
nc
обычно знают как «TCP-telnet на стероидах», но ведь он уместен и для сканирования. Правда, без излишеств.
Мини-скан на 10 портов
nc -zv 192.168.1.10 20-30
# -z — zero I/O (просто «постучаться»)
# -v — verbose
Утилита удобна, когда нужно проверить пару портов из скрипта, а таскать громоздкий nmap нет желания.
ss и lsof: локальный взгляд изнутри
Иногда внешний скан покажет, что порт закрыт, а приложение уверено, что всё ок. Тогда открываем «рентген» на самом сервере:
ss — современный netstat
ss -tulwn
# t — TCP, u — UDP, l — listening, w — raw, n — не резолвить DNS
Удобная фишка — фильтр по порту: ss -ltn sport = :8080
lsof — показывает, КТО держит порт
sudo lsof -i :5432
Получаем имя процесса, PID и даже путь к бинарю. Полезно, когда «ещё один Postgres» случайно занял порт продовой базы.
Сканирование UDP: почему всё так больно?
С UDP нехитро: сервис может не ответить вообще, даже если порт открыт (например, syslog ждёт валидный пакет). Поэтому:
- Запускаем nmap с флагом
-sU
и терпеливо ждём — скорости там черепашьи, зато статистика достоверна. - Если нужно быстрее, используем
masscan --udp
, но готовимся к большому числу false-negative. - Для сервис-ориентированных проверок (DNS, SNMP) лучше сразу слать корректные запросы скриптами или тем же
dig
.
Как не нарваться на IDS/IPS и чужих админов
Даже безобидный син-скан может выглядеть подозрительно. Простые правила гигиены:
- Темп. Открываете интернет-подсеть — ставьте
--max-rate 1000
или меньше. - Whitelist. Заранее согласуйте диапазон IP и время окна с ответственными людьми.
- Запускайте скан от рута там, где нужно raw-сокеты. Без
sudo
nmap автоматически падает на connect-скан, а он медленнее и заметнее. - Логируйте. Сохраняйте отчёты в XML/grepable — пригодится для ретроспективы.
Автоматизация: cron + сканер = утренняя телеграм-сводка
Скучное, но полезное: еженочно сканируем критическую зону DMZ и пушим diff, если внезапно появился лишний «открытый» порт. Делается скромным bash-скриптом:
#!/usr/bin/env bash
TODAY=$(date +%F)
OUTPUT="/var/reports/scan-$TODAY.xml"
nmap -sS -p 1-1024 -oX "$OUTPUT" 203.0.113.0/28
# diff с предыдущим днём и отправка через telegram-bot
Если нужна красота, взгляните на nmap-vulners — плагин, который сразу тыкает обнаруженные версии в базу CVE.
Завершаем: что выбрать под конкретную задачу?
- nmap — универсал на все случаи. Неспешный аудит , глубокий анализ, NSE-скрипты.
- masscan — «радар дальнего действия»: быстро находим живые порты на огромной площади.
- rustscan — удобный гибрид: скорость masscan + мозги nmap.
- netcat/nc — карманный тестер: точечно проверяем пару портов.
- ss/lsof — внутренняя диагностика — смотрим, что творится на самом сервере.
Не забывайте, что сканирование без разрешения — это та ещё юридическая «минное поле». Если на горизонте чужая сеть — доставайте не nmap, а контракт с пермитом на тест.
Полезные ссылки и шпаргалки
Итого
Порт-сканирование — это не про «делать больно соседнему администратору», а про прозрачность собственной инфраструктуры. Знать, какие двери открыты, важно как для безопасности, так и для банальной отладки. Выбирайте инструмент по ситуации, соблюдайте «сетевой этикет» и пусть ваш следующий «nmap -A» покажет только те сервисы, о которых вы и так знали.
Ну а если всё равно «что-то где-то не открывается», помните: у нас всегда есть последний довод — tcpdump -nnvvXSs 0
. Но это уже совсем другая история…