С чего начать Первые шаги трек · 15 ступеней
Linux Labs

nmap: какие порты видны снаружи

8 мин Ubuntu 24.04 · nmap 7.94

Сканер портов: показывает, какие порты машины открыты, закрыты или отфильтрованы — глазами другой машины.

Шпаргалка

9 команд Версия для печати
  • 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 — «чужой машины» на той же ВМ:

text
student@ubuntu:~$ sudo ip netns exec lab-outside \
> nmap -p 22,80,5432,8080 192.0.2.1
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-10-21 05:35 UTC
Nmap scan report for 192.0.2.1
Host is up (0.000022s latency).
PORT     STATE  SERVICE
22/tcp   open   ssh
80/tcp   open   http
5432/tcp closed postgresql
8080/tcp open   http-proxy
MAC Address: 22:C9:B6:56:61:18 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 13.09 seconds

Без -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:

text
PORT     STATE    SERVICE         REASON
22/tcp   open     ssh             syn-ack ttl 64
8080/tcp filtered http-proxy      no-response
8081/tcp closed   blackice-icecap reset ttl 64

Столбец SERVICE — только имя порта из справочника nmap: на 8081 никакой blackice-icecap нет. Какая программа отвечает на самом деле, показывает -sV:

text
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.20
  (Ubuntu Linux; protocol 2.0)
80/tcp open  http    nginx 1.24.0 (Ubuntu)

У UDP ответа часто нет вовсе, и такой порт nmap пишет как open|filtered; closed — если пришёл ICMP «порт недоступен».

Как nmap сканирует

Кто запускает Способ Строка в итоге
root SYN-скан -sS: шлёт SYN, соединение не устанавливает closed tcp ports (reset)
обычный пользователь -sT: полное соединение через connect() closed tcp ports (conn-refused)

Сырые пакеты требуют root. student без sudo получает:

text
student@ubuntu:~$ nmap -sS -p 22 127.0.0.1
You requested a scan type which requires root privileges.
QUITTING!

Перед сканом nmap проверяет, жив ли узел: в своей подсети — по ARP (Host is up, received arp-response), дальше — ping и пробами на 80 и 443. Узел, который на них молчит, пропускается:

text
Note: Host seems down. If it is really up, but blocking our ping
  probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 1.46 seconds

-Pn сканирует порты без этой проверки.

Снаружи и изнутри

Скан машины с неё самой идёт через интерфейс lo, а файрвол обычно пропускает lo целиком. Порт, закрытый политикой drop, изнутри выглядит открытым. Проверяй файрвол с другой машины или из отдельного сетевого пространства — подробнее в firewall.

Ключи

10

Основные ключи — в таблице ниже; полный список — 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

Ничего не найдено. Попробуй запрос короче.

Рецепты

3

Что машина показывает наружу

bash
sudo ss -tlnp                         # что слушает, изнутри
sudo ip netns exec lab-outside nmap 192.0.2.1   # что видно снаружи

Порт, который слушает на 0.0.0.0 и виден снаружи как open, — часть поверхности атаки. Закрыть его — привязать службу к 127.0.0.1 или закрыть фильтром.

Вывод для скрипта

bash
sudo nmap -oG - -p 22,80,8080 192.0.2.1 | grep Ports
text
Host: 192.0.2.1 ()	Ports: 22/open/tcp//ssh///, 80/open/tcp//http///,
  8080/filtered/tcp//http-proxy///

Каждый порт — номер/состояние/протокол//имя///: такую строку легко разобрать grep и cut.

Проверить один порт

bash
nmap -p 5432 192.0.2.1 | grep 5432
nc -zvw3 192.0.2.1 5432           # то же без nmap

Неполадки

4

Host seems down

Узел не ответил на пробы обнаружения: он выключен, адрес неверный или файрвол отбрасывает ping. Сверь адрес (ip -br a на той машине) и повтори с -Pn.

Порт closed, а служба запущена

Служба слушает другой адрес. 127.0.0.1:5432 в ss -tlnp снаружи не виден: nmap получает RST и пишет closed. Нужен адрес интерфейса или 0.0.0.0 в настройке службы.

Порт filtered, хотя правила нет

Пакеты отбрасывает политика цепочки (policy drop) или правило в другой таблице — sudo nft list ruleset покажет все таблицы, в том числе fail2ban и Docker.

You requested a scan type which requires root privileges

SYN-скан, UDP (-sU) и определение ОС шлют сырые пакеты. Запусти с sudo или оставь обычный скан — без root nmap сам выбирает -sT.

Опасно

1

Скан чужих машин

Скан портов чужого сервера без разрешения владельца выглядит как подготовка к атаке: его ловят IDS, адрес попадает в бан, а в договоре с хостингом это бывает запрещено. Сканируй свои машины.

См. также

  • ss — что слушает на самой машине.
  • firewall — nftables и закрытие портов.
  • nc — проверить один порт без nmap.
  • network-diagnostics — ping, traceroute и другие проверки сети.
  • ip — адреса и сетевые пространства имён.
Загрузка…