Что машина показывает наружу
Порт, который слушает на 0.0.0.0 и виден снаружи как open, — часть
поверхности атаки. Закрыть его — привязать службу к 127.0.0.1 или
закрыть фильтром.
Сканер портов: показывает, какие порты машины открыты, закрыты или отфильтрованы — глазами другой машины.
nmap 192.0.2.1
1000 частых TCP-портов
nmap -p 22,80,5432,8080 192.0.2.1
только эти порты
nmap -p- 192.0.2.1
все 65535 портов
nmap --open 192.0.2.1
только открытые
sudo nmap --reason -p 8080 192.0.2.1
почему такое состояние
sudo nmap -sV -p 22,80 192.0.2.1
программа и версия
sudo nmap -sU -p 53 192.0.2.1
UDP
nmap -Pn -p 22 192.0.2.1
не проверять, жив ли узел
nmap -n -p 22 192.0.2.1
без DNS — быстрее
nmap шлёт пакеты на порты машины и по ответам делит порты на открытые,
закрытые и отфильтрованные. ss -tlnp на самой машине показывает, что
слушает; nmap с другой машины — до чего можно достучаться через
файрвол. Вместе они дают поверхность атаки.
Скан учебной машины 192.0.2.1 из сетевого пространства lab-outside —
«чужой машины» на той же ВМ:
Без -p проверяется 1000 самых частых портов, остальные строки
сворачиваются в Not shown: 997 closed tcp ports (reset).
13 секунд из этого скана nmap ждал DNS: в пространстве lab-outside
/etc/resolv.conf указывает на 127.0.0.53, а этого адреса там нет. С
-n (без поиска имён) тот же скан занимает 0.09 секунды.
| Состояние | Ответ на пробу | Что значит |
|---|---|---|
open |
SYN-ACK | служба слушает, и пакеты до неё доходят |
closed |
RST | машина ответила, но порт никто не слушает — или правило reject with tcp reset |
filtered |
нет ответа | пакет отброшен по дороге: файрвол, политика drop |
--reason пишет, по какому ответу выбрано состояние. Порт 8080 здесь
закрыт правилом tcp dport 8080 drop, 8081 — reject with tcp reset:
Столбец SERVICE — только имя порта из справочника nmap: на 8081 никакой
blackice-icecap нет. Какая программа отвечает на самом деле,
показывает -sV:
У UDP ответа часто нет вовсе, и такой порт nmap пишет как
open|filtered; closed — если пришёл ICMP «порт недоступен».
| Кто запускает | Способ | Строка в итоге |
|---|---|---|
| root | SYN-скан -sS: шлёт SYN, соединение не устанавливает |
closed tcp ports (reset) |
| обычный пользователь | -sT: полное соединение через connect() |
closed tcp ports (conn-refused) |
Сырые пакеты требуют root. student без sudo получает:
Перед сканом nmap проверяет, жив ли узел: в своей подсети — по ARP
(Host is up, received arp-response), дальше — ping и пробами на 80 и 443.
Узел, который на них молчит, пропускается:
-Pn сканирует порты без этой проверки.
Скан машины с неё самой идёт через интерфейс lo, а файрвол обычно
пропускает lo целиком. Порт, закрытый политикой drop, изнутри выглядит
открытым. Проверяй файрвол с другой машины или из отдельного сетевого
пространства — подробнее в firewall.
Основные ключи — в таблице ниже; полный список — nmap --help и man
nmap. Ключи можно сочетать: sudo nmap -sV --reason -p 22,80 <адрес>.
| Ключ | Что делает | Пример |
|---|---|---|
-p PORTS |
Какие порты сканировать — список, диапазон или -p- для всех 65535. | nmap -p 22,80,8000-8100 192.0.2.1 |
--open |
Показывать только открытые порты. | nmap --open 192.0.2.1 |
--reason |
Писать, по какому ответу выбрано состояние порта (syn-ack, reset, no-response). | sudo nmap --reason -p 8080 192.0.2.1 |
-sV |
Определить программу и версию на открытых портах. | sudo nmap -sV -p 22,80 192.0.2.1 |
-sS |
SYN-скан без полного соединения; нужен root, у root выбран по умолчанию. | sudo nmap -sS 192.0.2.1 |
-sT |
Скан полным соединением connect(); у обычного пользователя выбран по умолчанию. | nmap -sT -p 22 192.0.2.1 |
-sU |
Скан UDP-портов; нужен root. | sudo nmap -sU -p 53,123 192.0.2.1 |
-Pn |
Не проверять, жив ли узел, — сразу сканировать порты. | nmap -Pn -p 22 192.0.2.1 |
-n |
Не искать имена адресов в DNS. | nmap -n 192.0.2.0/24 |
-oG FILE |
Вывод одной строкой на узел для grep; - — на экран. | sudo nmap -oG - -p 22,80 192.0.2.1 |
Ничего не найдено. Попробуй запрос короче.
Порт, который слушает на 0.0.0.0 и виден снаружи как open, — часть
поверхности атаки. Закрыть его — привязать службу к 127.0.0.1 или
закрыть фильтром.
Каждый порт — номер/состояние/протокол//имя///: такую строку легко
разобрать grep и cut.
Узел не ответил на пробы обнаружения: он выключен, адрес неверный или
файрвол отбрасывает ping. Сверь адрес (ip -br a на той машине) и повтори
с -Pn.
Служба слушает другой адрес. 127.0.0.1:5432 в ss -tlnp снаружи не
виден: nmap получает RST и пишет closed. Нужен адрес интерфейса или
0.0.0.0 в настройке службы.
Пакеты отбрасывает политика цепочки (policy drop) или правило в другой
таблице — sudo nft list ruleset покажет все таблицы, в том числе
fail2ban и Docker.
SYN-скан, UDP (-sU) и определение ОС шлют сырые пакеты. Запусти с
sudo или оставь обычный скан — без root nmap сам выбирает -sT.
Скан портов чужого сервера без разрешения владельца выглядит как подготовка к атаке: его ловят IDS, адрес попадает в бан, а в договоре с хостингом это бывает запрещено. Сканируй свои машины.
Есть неточность? Сообщить об ошибке в статье