Что означают данные netstat и ss
Далее мы научимся понимать, что именно выводит netstat. Но для полного понимания нам нужно изучить немного теории — совсем кратко. Я расскажу только о том, что нам действительно понадобиться.
Что означает 0.0.0.0 в netstat. различные виды нотаций в netstat и ss
0.0.0.0 — это самый первый IP адрес. Но он относится к IP специального назначения (как например 127.0.0.1) и выполняет разные функции.
Обозначение 0.0.0.0 может иметь разное значение в зависимости от того, где используется. Когда говорят о прослушиваемых портах, это обозначение в Linux символизирует заполнитель, то есть означает «любой IP адрес».
Чем это отличается от * (звёздочки) или от записи :::, которые также встречаются в выводе рассматриваемых программ? В программе ss IPv6 адрес 0:0:0:0:0:0:0:0 (который является аналогом IPv4 адреса 0.0.0.0) обозначается звёздочкой (*).
В программе netstat также используется запись 0.0.0.0:* которая также обозначает «любой IPv4 адрес с любого порта».
Но в netstat для обозначения «любой IPv6 адрес с любого порта» используется :::*.
Помните об этих различиях, чтобы не запутаться. А также помните о том, что если показано, что прослушивается протокол tcp6 (IPv6), то одновременно может прослушиваться порт и на tcp (IPv4) — при этом данные в выводимой информации отсутствуют!
В Windows в качестве Локального адреса, когда прослушивается любой IP адрес на определённом порту, используется запись вида 0.0.0.0:80 (в этом примере прослушивается любой IP адрес, доступный в системе, на 80 порту). Для IPv6 адресов в этом случае используется запись вида [::]:80.
В качестве внешнего адреса, когда доступно подключения с любого IP и с любого порта, для TCP протокола пишется 0.0.0.0:0, а для UDP протокола в этих же условиях пишется *:*. Что тоже не особо логично и сбивает с толку. Точнее говоря, объяснение есть и оно вытекает из разницы протоколов TCP и UDP. Но это объяснение скорее философское и в практическом плане ничего не даёт.
Если информация относится к IPv6, то для TCP когда имеется ввиду любой адрес на любом порту, используется запись вида [::]:0. А для UDP используются одинаковые нотации как для IP, так и для IPv6, то есть *:*
Нужно помнить, что некоторые из этих обозначений пересекаются с нотациями из Linux, где они имеют своё собственное значение.
Чтобы чуть облегчить жизнь, я составил такую табличку, которую можно использовать в качестве шпаргалки:
Определённый локальный IPv4 адрес на определённом порту | Любой локальный IPv4 адрес на определённом порту | Определённый локальный IPv6 адрес на определённом порту | Любой локальный IPv6 адрес на определённом порту | Любой внешний IPv4 адрес на любом порту | Любой внешний IPv6 адрес на любом порту | |
---|---|---|---|---|---|---|
Netstat (Windows) | 127.0.0.1:9050 | 0.0.0.0:80 | [2a02:f680:1:1100::3d5f]:80 | [::]:443 | Для TCP: 0.0.0.0:0 Для UDP: *:* | Для TCP: [::]:0 Для UDP: *:* |
Netstat (Linux) | 2a02:f680:1:1100::3d:80 | :::443 | 0.0.0.0:* | :::* | ||
ss (Linux) | [2a02:f680:1:1100::3d5f]:80 | *:443 | 0.0.0.0:* | *:* ИЛИ [::]:* |
Ip адрес 0.0.0.0
Кстати, IP адрес 0.0.0.0 довольно интересный, так как используется в разных случаях.
Например, некоторые службы в качестве адреса привязки (bind) позволяют установить 0.0.0.0. Это означает, что служба будет прослушивать порт на всех сетевых интерфейсах данного компьютера, то есть на всех IP адресах. В некоторых службах (например, веб-сервер Apache), просто не нужно указывать никакой определённый IP адрес (в том числе 0.0.0.0) и по умолчанию они будут прослушивать входящие соединения на всех сетевых интерфейсах.
Важно понимать, что 0.0.0.0 и 127.0.0.1 это совершенно разные вещи. Хотя если в Linux пинговать 0.0.0.0, то пинги будут отправляться именно к 127.0.0.1. В Windows попытка пинга 0.0.0.0 вызовет сообщение о сбое передачи данных, то есть о недоступности адреса. Адрес 0.0.0.0 означает «любой IP данного компьютера» и включает в себя в том числе 127.0.0.1.
Адрес 0.0.0.0 обычно означает, что IP адрес ещё не настроен или не присвоен. Такой адрес указывает хост, который обращается к DHCP для получения IP адреса.
Если 0.0.0.0 указан в качестве адреса получателя, то он должен расцениваться как широковещательный адрес 255.255.255.255.
Адрес 0.0.0.0 с маской 0.0.0.0, то есть 0.0.0.0/0 используется для обозначения маршрута по умолчанию (default route).
Этот адрес не является валидным адресом для назначения сетевому интерфейсу, точно также как и вся подсеть 0.0.0.0/8 (то есть любой адрес, начинающийся с 0.).
Tcp и udp
TCP и UDP это протоколы транспортного уровня. Самое главное что вам нужно о них знать: любой из них может использоваться для передачи информации.
Кстати, про протокол TCP вы практически наверняка слышали, по крайней мере должны были встречать запись TCP/IP — эта связка протоколов очень важна для Интернета. Протокол IP отвечает за то, куда отправлять данные, а TCP отвечает за непосредственную передачу данных и проверку их целостности.
Работу протокола TCP можно представить как создание соединения между двумя компьютерами, по этому соединению передаются данные. Внутри этого соединения данные проверяются на предмет повреждения — если какая-то часть повреждена, то она отправляется повторно.
Протокол UDP тоже передаёт данные, но вместо того, чтобы создавать устойчивое соединение, внутри которого данные проверяются на целостность, он просто «пуляет» свой пакет на определённый адрес. В принципе, это и есть главное отличие между этими протоколами.
Udp и listening
Про UDP уже сказано чуть выше, что этот протокол не создаёт соединений в том смысле, как это делает TCP. Поэтому для этого протокола нет никаких состояний соединения — это просто неприменимо к нему. По этой причине в графе Состояние для него никогда не пишется LISTENING.
Но значит ли это, что UDP порт не может быть прослушиваемым? Нет! Порт UDP также может быть прослушиваемым и доступным для соединений. В том числе этот порт может использоваться вирусами и злоумышленниками, поэтому эти порты также подлежат исследованию.
Вешаем службу отвечающую по нужному порту
Как я и писал выше, пока сервисы не развернуты, то и порты никто не слушает, но нам необходимо произвести проверку, чтобы потом к этому не обращаться. Нам необходимо с помощью специальной утилиты, эмулировать прослушивание нужного нам порта (сокета), те кто из вас знает такую операционную систему, как Centos 7, то они помнят, в ней была отличная утилита под названием netcat. Она позволяла с помощью определенных команд слушать нужный администратору порт.
netcat
– утилита Unix, позволяющая устанавливать соединения TCP и UDP, принимать оттуда данные и передавать их. На Windows платформах, она так же присутствует.
Распаковываем архив на сервере, где в будущем будет работать служба. В папке вам будут необходимы файлы nc.exe и nc64.exe. Далее зажимаете Shift и щелкаете правым кликом по папке, из контекстного меню выбираете пункт “Открыть окно команд”
Теперь представим, что я хочу чтобы на сервере работал 80 порт, ну типа IIS сервер. Открываем netcat, для начала посмотрите справку:
Нас интересует команда вот такого вида:
netcat-win32-1.12>nc.exe -l -p 80
В результате чего, на сервере поднимается виртуальный сокет, который слушает 80 соединение, симулируя веб сервер.
Звёздочка (*) вместо адреса или порта
Мы можем увидеть записи вроде *:80 или даже *:*
Как в windows узнать, какая программа прослушивает порт
Открытых для прослушивания портов может оказаться достаточно много и обычно они используются легитимными программами. Поэтому при анализе полученных данных также важно знать, какая именно служба прослушивает определённый порт.
Для поиска службы, можно добавить к приведённой команде опцию -b, которая означает показать исполнимый файл, прослушивающий порт:
netstat -anb
Также имеется альтернативный способ определения исполнимого файла, привязанного к порту. Для него откройте Командную строку Windows. Для этого нажмите сочетание клавиш Win x, там выберите Windows PowerShell (Администратор). В открывшемся окне введите:
cmd
чтобы перейти в обычную командную строку.
Там запустите команду вида:
Как заблокировать доступ к портам на компьютере?
Для настройки доступа к портам используйте файервол (в Windows называется Брандмауэр).
Многие антивирусы сейчас имеют файерволы. Настройки для входящих подключений регулируют, к каким службам, прослушивающим порт, разрешено подключаться. Эти правила не подействуют, если какая-либо служба сама инициирует соединение — для таких случаев настраиваются правила для исходящих подключений.
Если какая-то программа кроме системной просит выход в сеть, то вы должны понимать, зачем ей это нужно.
Связанные статьи:
Как проверить открыт ли порт на компьютере с windows 10?
Порты компьютера обеспечивают связь с приложениями и службами компьютера, поэтому часто возникает необходимость проверить открыт ли порт на вашем компьютере. Часто в этом кроется причина неработоспособности сервиса в Интернете.
Итак, для того, чтобы проверить открыт порт или нет на Вашем локальном компьютере Windows, необходимо:
1. Нажать сочетание клавиш «Win R»
2. В поле «Открыть» вписать команду appwiz.cpl :
нажать на клавишу «ОК»
3. В окне «Программы и компоненты» нажать на «Включение и отключение компонентов Windows» и в списке компонент отметить «Клиент Telnet«:
нажмите на кнопку «ОК» и перезагрузите, если потребует, компьютер.
4. Далее нажмите на сочетание клавиш «Win R» и впишите команду вызова cmd:
нажмите на кнопку «ОК»
5. В окне командной строки впишите telnet:
и нажмите клавишу «Enter«.
6. После перехода в консоль Telnet впишите команду open 127.0.0.1 <номер порта>. Например, для порта 443:
Нажмите клавишу «Enter»
7. В случае установки соединения появится окно:
В случае, если соединение не удалось установить:
Как открыть или закрыть порт смотрите в статье.
Еще один вариант для просмотра открытых портов — воспользоваться командой в CMD:
, которая выводит список всех портов, находящихся в режиме прослушивания (listening).
для просмотра всех активных процессов процессов возможно воспользоваться командой:
Список возможных статусов:
LISTENING — процесс находится в режиме прослушивания;
ESTABLISHED — связь установлена, происходит передача данных;
CLOSE_WAIT — ожидает закрытия;
TIME_WAIT — превышено время ответа.
Как проверить открыт ли порт на сервере
Теперь перейдем на другой сервер и попытаемся проверить открытые порты на удаленном сервере. В решении нашей задачи, мы будем использовать утилиту telnet, как ее устанавливать смотрите тут. Открываем командную строку и вводим такую строку:
telnet 10.242.17.134 80
Как видите я указал нужный мне ip адрес и нужный номер порта
Кстати проверить открытые порты на компьютере, где расположена служба, можно командой:
telnet localhost номер 80
Если ip адрес вам не отвечает на ваш запрос, то вы увидите попытку подключения, после чего вам покажут, что этого сделать не удалось.
Если подключение удачное, то вы вы увидите черный экран, либо без текста, либо с каким-то приветственным сообщением, о том, что вам ответила какая-то служба.
Как проверить открытые порты в linux. как узнать, какая служба прослушивает порт
Для Linux тоже есть команда netstat, но она, вроде как, теперь считается устаревшей и на её замену рекомендуется команда ss. Показываемая информация у ss и netstat очень похожи. Даже основные опции идентичны.
Итак, для вывода открытых портов TCP и UDP протоколов вместе с показом процессов, которые их прослушивают, используется команда:
sudo ss -lntup
Больше опций, а также больше способов найти, какие порты прослушиваются, смотрите в статье «4 способа узнать, какие порты прослушиваются в Linux».
Как проверить работу порта
Для обмена информацией в сети транспортный протокол TCP устанавливает связь между приложениями, работающими на компьютерах. В поле адреса каждого пакета данных входит числовой идентификатор, который указывает, какое приложение будет обрабатывать информацию. Эти числовые идентификаторы называются сетевыми портами. Нумеруются они в диапазоне от 1 до 65535.
Инструкция
Массовая проверка открытых портов в сети и локально
Существуют специальные утилиты, в задачи которых входит сканирование компьютера или сервера, на предмет доступных портов, по которым есть соединение, они называются сканеры портов. Таких программ очень много, я приведу пример в виде XSpider 7.7. Как проверить открыт ли порт в утилите XSpider 7.7. Щелкаем правым кликом по “сканированные хосты” и добавляем хост или диапазон ip адресов.
Прописываете, что именно будет подвергаться проверке.
Нажимаем значок запуска и запускаем процедуру.
Вы можете увидеть предупреждение, что ваши действия могут быть признаны как ddos атака и многие фаэрволы в сети могут вас просто забанить, так что будьте осторожны.
В итоге сканер мне указал, на то, что есть проблемные места, например, 445 подключение, через которое не так давно лезли шифровальщики, быстро его закрываем.
Как видите проверить открытые соединения очень просто. Еще существуют две полезные утилиты, показывающие слушаемые локальные сервисы, о них я так же рассказывал подробно, это утилита netstat и программка TCPView (советую ознакомиться)
Они обе показывают, что случает ваша операционная система. Думаю у вас не осталось вопросов, как проверить открытые порты и понять кем они слушаются.
На какие открытые порты нужно обращать внимание
Я упоминал, что если на компьютер попала вредоносная программа, которая открыла соединение для связи со злоумышленником, то она будет прослушивать один из портов. В этом случае для TCP состояние подключения будет LISTENING. Протокол UDP является «безстатусным», поэтому для него ничего не пишется, но нужно знать, что через UDP точно также может происходить обмен информацией.
Трояны и бэкдоры могут действовать двумя методами:
- открывать порт и ждать подключения злоумышленника;
- самостоятельно подключаться к удалённой системе злоумышленника.
При втором варианте состояние подключения НЕ будет LISTENING — вредоносную программу можно найти только путём полного анализа всех соединений.
Как правило, службы, которые прослушивают только IP адрес 127.0.0.1, то есть слушающие на петлевых интерфейсах, предназначены для обслуживания каких-либо легитимных программ, запущенных на вашей системе.
Пример анализа открытых портов
Я начну с анализа открытых портов на Linux. Просто потому, что мне так проще, а затем мы постепенно перейдём изучить открытые порты на Windows.
Пример информации об открытых портах, полученных командой:
sudo ss -lntup
Пример прослушиваемых портов на Linux:
Проверить порты
Проверить порты не сложно, есть много инструментов, благодаря которым можно выполнить это действие. Но сначала надо разобраться, что это такое, зачем нужно.
Итак, разные программы, которых понаписали очень много, часто умеют взаимодействовать с данными из компьютерной сети. Для того, чтобы было понятно, какой программный продукт хочет использовать сетевые ресурсы, придумали идентификатор, который называется порт и однозначно определяет, что работать нужно именно с этой програмкой. За основу взяли обычные числа от 0 до 65536.
При этом есть программы, за которыми закреплены определённые числа (порты), на постояннной основе, а имеются и другие, которые работают с разными портами или сразу используют много портов. Имеется спецификация и разделение такое:
- системные: 0 – 1023;
- зарегистрированные: 1024 – 49151;
- динамические: 49152 – 65535.
Следует отметить, что сканировать порты надо осторожно. Если вы будете проводить сканирование без разрешения, то вас заблокируют или могут даже привлечь к ответственности. Призыв один, сканируйте только свои ресурсы или ресурсы, с которыми вам разрешили взаимодействовать.
Помогут определить наличие открытых и закрытых портов следующие программные продукты:
Работает netstat в Windows и Linux. Команда немного различается в синтаксисе в различных операционных системах. Справку можно получить с помощью:
Для Windows:
netstat /?
Для Linux:
# man netstat
Получить открытые порты можно с помощью следующей команды:
netstat -aon
или для постраничного вывода в Windows:
netstat -aon | more
или Linux:
# netstat -aon | less
Где, a – отображение всех подключений и портов прослушивания,
o – отображение ИД процесса каждого подключения,
n – отображение адресов и номеров портов в числовом формате.
Добавим букву b для отображения исполняемого файла, участвующего в создании каждого подключения или порта прослушивания.
netstat -aonb
Или например используем отображение статистики по протоколу tcp с отображением полного имени домена (FQDN) для внешних адресов:
netstat -s -p tcp -f
Можно использовать фильтры. Выводить каждые 5 секунд соединение со статусом “LISTENING” для 135 порта:
netstat -a -n 5 | find /I "LISTENING" | find /I "135"
или записывать вывод в файл:
netstat -a -n 5 | find /I "LISTENING" | find /I "135" > C:135LISTEN.txt
Утилита netstat считается устаревшей в Linux. Вместо неё рекомендуют использовать ss. Для того, чтобы посмотреть опции используем man:
# man ss
Просмотр информации о всех портах, открытых в системе, и приложения, которое их открыло:
# ss -lp
Посмотреть какое приложение открыло конкретный порт:
# ss -lp | grep 8080
Отобразить все TCP или UDP соединения:
# ss -ta
# ss -ua
Просмотр PID процесса, использующих сокет:
# ss -ltp
А если нужно определить наличие открытых (закрытых) портов на удалённой машине, то здесь пригодятся такие программные приложения, как nc, nmap.
Программа работает как в Windows, так и в Linux, только придётся её устанавливать. В Windows дистрибутив копируется в любую папку, например в папку С:Program Files, далее прописываем путь к запускающему файлу в переменные среды и запускаем программу в командной строке, или в командной строке прописываем полный путь к файлу и затем запускаем его. В Linux после установки програмного обеспечения, не нужно прописывать путь к запускающему файлу.
Программа позволяет принимать и отсылать данные, работать в роли простенького веб-сервера или чата.
Просканировать на наличие открытого порта:
# nc -vn 192.168.10.243 22
или диапaзона портов:
# nc -vnz 192.168.10.243 0-65536
Просканировать UDP-порты:
# nc -vnzu 192.168.10.243 0-65536
Для запуска help для netcat:
# nc -h
Одним из лучших инструментов для сканирования является nmap. Умеет работать в различных операционных системах. Много опций и различных сочетаний, различные виды сканирования, даже имеется возможность добавления скриптов.
Умеет сканировать один порт, множество портов, различное их сочетание:
# nmap -p 8080 192.168.10.243
# nmap -p 80, 8080 192.168.10.243
# nmap -p 0-65536 192.168.10.243
# nmap -p T:80,U:5547,22,137-139
Сканировать все TCP или UDP порты:
# nmap -sT 192.168.10.243
# nmap -sU 192.168.10.243
Определить открытые порты:
# nmap --open 192.168.10.243
Распознавать версии программ, запущенных на хосте:
# nmap -sV 192.168.10.243
Сохранить результаты в текстовый файл:
# nmap 192.168.10.243 > nmap-out.txt
В целях тестирования разрешено сканировать scanme.nmap.org, но небольшое количество раз в течение одного дня.
В powershell можно делать всё, что и в командной строке, и даже больше. Для этого есть командлеты. Для проверки сетевых соединений – Test-NetConnection (TNC). Но данный командлет появился в PowerShell 4.0. Если версия powershell ниже 4.0, то нужно обновиться. Запускаем программу и проверяем версию:
$PSVersionTable.PSVersion
Проверить порт на удалённом компьютере:
TNC 192.168.44.131 -Port 22
По имени компьютера:
TNC -ComputerName z1 -Port 22
Имеются также специальные утилиты с графическим интерфейсом, например Advanced Port Scanner, XSpider, а также онлайн-сервисы, которые предлагают проверить порты на ресурсе. Так выглядит интерфейс программы Advanced Port Scanner и вывод результатов о доступности портов.
Также есть и другие программы, но сделать вывод о доступности порта на компьютере уже возможно и с помощью вышеперечисленных средств.
Сокеты
В Linux вместо запуска службы на определённом порту можно настроить сокет для прослушивания порта. Схема работы следующая: сетевая служба (например, это можно настроить для SSH) по умолчанию не запущена и, следовательно, не потребляет системные ресурсы.
Тем не менее её порт прослушивается системным процессом, который и без того бы работал. Как только на этот порт (допустим на 22) поступает запрос соединения, системный процесс запускает нужную службу, и она начинает работать как будто бы всегда была включена. После прекращения связи, служба вновь отключается, и порт вновь начинает прослушивать системный процесс.
В этом случае в качестве программы, открывшей порт, не указывается служба, которая фактически будет работать с поступившим соединением.
Например, для SSH netstat будет показывать примерно следующие данные (1/init вместо sshd):
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp6 0 0 :::22 :::* LISTEN 1/init
А ss будет показывать примерно так:
Через внешние утилиты
Проверить открыть ли порт, можно и внешними утилитами, тут главное требование, чтобы у вас был белый ip имеющий доступ в интернет. Представим себе, все туже ситуацию, что вам необходимо протестировать 80 соединение, на котором будет сайт компании. Вы его развернули, но он почему-то не работает.
Не так давно, я вам рассказывал про сервис ping.eu (вот тут). Одним из пунктов этого инструментария был port check (проверка открытых портов). В поле “ip address or host name” вы пишите ip адрес или dns имя сервиса, что требует проверки, а в соседнем поле, необходимый номер сокета, в моем случае 80, нажимаете “Go”. Через секунду, вы получите результат, открыты порты 80 или 443 у сайта или нет. В моем случае статус “open”.
Listening, established, close_wait и другие состояния
Как вы можете увидеть в выводе команды netstat для протокола TCP доступны разные варианты состояний.
Самые популярные из них это LISTENING — означает, что порт прослушивает запущенное на данном компьютере приложение, что оно готово принять соединение, например, от другого компьютера или от другой службы, запущенной на этом же компьютере.
ESTABLISHED означает уже установленное соединение. Пример такого соединения: веб-браузер инициализировал загрузку страницы сайта и пока данные передаются по этому соединению, у этого соединения статус ESTABLISHED.
Имеются и другие виды состояний, но для наших целей они не очень важны. По большому счёту нас интересует только LISTENING, так как это означает открытые порты на нашем компьютере и возможность подключаться к нему.