MetrikaYandex

netstat — проверка открытых портов в Linux

0
23332
netstat — проверка открытых портов в Linux
Содержание:

Проверка открытых портов на Ubuntu может понадобиться, чтобы убедиться, что в системе не запущены лишние службы. Если вы помните, порт это число, которое приложение будет использовать для связи с другой программой, предоставлять сервис и т.д. Чтобы получить представление о том, какие службы работают в системе, необходимо проверить открытые порты системы.

Часто мы устанавливаем программу, которая является сервисом, а потом забываем о ней, поэтому наша машина может прослушивать порты в ожидании соединения. Злоумышленники любят, когда порты открыты, так как приложения, прослушивающие эти порты, являются простыми целями. Чтобы обеспечить нашей системе Ubuntu Linux (или любой другой системе в этом отношении) максимальную безопасность, мы должны знать о том, какие порты открыты и для каких служб.

Чтобы проверить, какие порты открыты на нашей рабочей станции Ubuntu, можно выполнить команду, показанную ниже. Обратите внимание, что она должна работать и для других разновидностей Linux, если установлена утилита netstat.

к содержанию ↑

1. Используя команду netstat

netstat -anltp | grep "LISTEN"

CLOSE_WAIT — ожидание закрытия соединения

CLOSED — соединение закрыто

ESTABLISHED — соединение установлено

LISTENING — ожидается соединение (слушается порт)

TIME_WAIT — превышение времени ответа

Утилита netstat позволяет увидеть открытые в системе порты, а также открытые на данный момент сетевые соединения. Для отображения максимально подробной информации надо использовать опции:

  • -l или —listening — посмотреть только прослушиваемые порты;
  • -p или —program — показать имя программы и ее PID;
  • -t или —tcp — показать tcp порты;
  • -u или —udp показать udp порты;
  • -n или —numeric показывать ip адреса в числовом виде.
к содержанию ↑

Узнать, кто использует данные порты:

  • netstat –bno – получить список вех сетевых соединений и связанных с ними программ
    • -n – отображает адреса и номера портов в числовом формате
    • -b – отображает исполняемый файл, участвующий в создании каждого соединения

Обычный веб-сервер, на котором запущены FTP, SSH и MySQL, выведет следующую информацию:

tcp 0 0 127.0.0.1:3306 0.0.0.0:*LISTEN 21432/mysqld
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4090/apache2
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7213/sshd
tcp6 0 0 :::21 :::* LISTEN 19023/proftpd
tcp6 0 0 :::22 :::* LISTEN 7234/sshd

, netstat — проверка открытых портов в Linux

Вышеуказанная команда запускает утилиту netstat с соответствующими флагами и передает вывод функции grep, которая извлекает строки, содержащие слово «LISTEN». В результате мы получаем список открытых портов и имена процессов, прослушивающих эти порты.

Все команды netstat, ss, netcat относится к сетевым утилитам и доступны по-умолчанию в большинстве linux-дистрибутивах.

Команда netstat умеет показывать сетевые соединения (входящие/исходящие), таблицу маршрутизации, статистику по сетевым интерфейсам и т.д.

к содержанию ↑

Список всех открытых портов (TCP)

netstat -at

Список всех открытых портов (UDP)

netstat -au

Список только прослушиваемых портов (TCP)

netstat -lt

Статистика по всем открытым портам

netstat -s

Подробное отображение списка с открытыми портами — добавлен PID и имя процессов

netstat -p

Объединим все ключи в полезную команду для просмотра открытых TCP/UDP портов с именами процессов (может понадобиться root-доступ)

netstat -ltupn

Список подключенных хостов

netstat -lantp | grep ESTABLISHED |awk '{print $5}' | awk -F: '{print $1}' | sort -u

Список всех открытых портов при помощи команды netstat

Это просто. Тут мы используем либо команду netstat. Да, так просто, всего одна строчка и все у нас перед глазами:

$ sudo netstat –tulpn

netstat

Тут мы можем увидеть какие порты находятся в состоянии прослушивания (Listen).

Просмотр статистики по протоколам

Данную информацию отображает команда netstat -s:

# netstat -s
Ip:
    37850 total packets received
    3 with invalid addresses
    1 forwarded
    0 incoming packets discarded
    17349 incoming packets delivered
    17635 requests sent out
Icmp:
    0 ICMP messages received
    0 input ICMP message failed.
Tcp:
    312 active connections openings
    2 failed connection attempts
    114 connection resets received
Udp:
    9883 packets received
    4 packets to unknown port received.
.....

Отдельная статистика по TCP:

netstat -st

Отдельная статистика по UDP:

netstat -su
к содержанию ↑

Узнать PID и имя ПО, которое проявляет сетевую активность

Для того, что бы узнать какой именно процесс у нас использует сетевое соединения или проявляет аномальную сетевую активность можно использовать команду netstat -pt:

# netstat -pt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        1      0 root.wellweb:47212 192.168.1.1:www        CLOSE_WAIT  2109/firefox
tcp        0      0 root.wellweb:52750 lax:www ESTABLISHED 2109/firefox

Отображение таблицы IP роутов

# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.0     *               255.255.255.0   U         0 0          0 eth2
link-local      *               255.255.0.0     U         0 0          0 eth2
default         192.168.1.1     0.0.0.0         UG        0 0          0 eth2

Узнать какой порт использует определенный процесс

# netstat -ap | grep ssh
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        1      0 dev-db:ssh           192.182.1.1:39213        CLOSE_WAIT  -
tcp        1      0 dev-db:ssh           192.182.1.1:57643        CLOSE_WAIT  -

Если нужно наоборот, узнать процесс по порту, то команда будет выглядеть так:

# netstat -an | grep ':80'

Расширенная информация о сетевом интерфейсе

Для этого используем команду:

# netstat -ie
Kernel Interface table
eth0      Link encap:Ethernet  HWaddr 00:10:42:11:11:11
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:800
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Memory:f6ad0000-f6b10000

Также мы использовали следующие флаги:

  • t — выводит список портов TCP.
  • u — выводит список портов UDP.
  • l — выводит только слушающие (Listen) сокеты.
  • n — показывает номер порта.
  • p — показывает имя процесса или программы.
к содержанию ↑

Несколько примеров для определения атаки типа DoS или DDoS

Следующая команда позволит узнать, сколько подключений активно на каждом IP-адресе:

netstat -naltp | grep ESTABLISHED | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort -n | uniq -c

Определяем большое количество запросов с одного IP-адреса:

netstat -na | grep :80 | sort

Определяем точное количество запросов, полученных на одно соединение:

netstat -np | grep SYN_RECV | wc -l

При проведении DoS-атаки число, полученное в результате работы данной команды, должно быть довольно большим. В любом случае оно может зависеть от конкретной системы. То есть на одном сервере оно может быть одним, на другом — иным.

к содержанию ↑

2. Используя команду ss

Утилита ss — это современная альтернатива для команды netstat. В отличие от netstat, которая берет информацию из каталога /proc, утилита ss напрямую связывается со специальной подсистемой ядра Linux, поэтому работает быстрее и её данные более точные, если вы хотите выполнить просмотр открытых портов это не имеет большого значения.

Утилита ss позволяет просматривать информацию об используемых сокетах в системе. Эта команда обладает схожим функционалом к netstat, но есть и уникальные возможности. Например можно фильтровать вывод по установленным соединениям с определенным портом.

Список процессов, использующие соединения в данный момент

ss -p   

Список сокетов в режиме прослушивания

ss -l

Пример фильтра — список всех соединений к порту 80

ss -o state established '( dport = :www or sport = :www )'
к содержанию ↑

Список всех открытых портов при помощи команды ss

Тут все аналогично, кроме того, что теперь используем команду ss вместо netstat

$ sudo ss -tulpn

ss

 

3. Используя команду lsof

Утилита lsof умеет отображать процессы, которые работают с определенным файлом или сокетом.

Утилита lsof позволяет посмотреть все открытые в системе соединения, в том числе и сетевые, для этого нужно использовать опцию -i, а чтобы отображались именно порты, а не названия сетевых служб следует использовать опцию -P

Список всех сетевых соединений

lsof -i

Список процессов, работающих с портом 80

lsof -i :80
к содержанию ↑

4. Используя команду netcat

Утилита netcat позволяет передавать/принимать данные через TCP/UDP соединения.

Шаблон вызова утилиты

nc host port

Откроем прием (ключ -l) данных на порте 1234 с подробным выводом информации (ключ -v) и продолжением работы после разрыва соединения (ключ -k), по-умолчанию nc разрывает соединение после первого дисконекта.

nc -lvk 1234

Подключаемся к открытому порту и отправим import antigravity 😉

nc 127.0.0.1 1234
import antigravity

Пример более полезного использования nc — передача файла. На принимающей стороне

nc -l 1234 > file

На отправляющей стороне

nc localhost 1234 < file

Или можно отдавать файл любому подключившемуся. На передающей стороне

nc -l 1234 < file

На принимающей стороне

nc localhost 1234 > file

Пример открытия shell’а на определенном порте (источник). На стороне, где нужно открыть шел

mkfifo /tmp/pipe;
sh /tmp/pipe | nc -l 1234 > /tmp/pipe 

Еще один полезный пример с netcat — запуск процесса, с возможностью отслеживания его работы через сеть

watch w | nc localhost 1234
к содержанию ↑

4. Используя команду NMAP

Nmap — мощный сетевой сканер,  разработанный для сканирования и пентестинга удаленных узлов, но ничего не мешает направить его на локальный компьютер:

nmap localhost  Starting Nmap 6.47 ( http://nmap.org ) at 2015-08-02 17:27 EEST  Nmap scan report for localhost (127.0.0.1)  Host is up (0.00036s latency).  Other addresses for localhost (not scanned): 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1  rDNS record for 127.0.0.1: comm-app.local  Not shown: 995 closed ports PORT STATE SERVICE  22/tcp open ssh 139/tcp open netbios-ssn  445/tcp open microsoft-ds  3493/tcp open nut  8080/tcp open http-proxy  Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

Если вы хотите посмотреть какие порты на компьютере доступны снаружи, здесь тоже пригодится Nmap. Если компьютер — общедоступный сервер, то результат скорее всего не будет отличатся от локального сканирования, но на домашнем компьютере все немного по другому. Первый вариант — используется роутер и в сеть будут видны только порты роутера, еще одним порогом защиты может стать NAT сервер провайдера. Технология NAT позволяет нескольким пользователям использовать один внешний IP адрес. И так для просмотра открытых внешних портов сначала узнаем внешний ip адрес, для надежности воспользуемся онлайн сервисом:

 wget -O - -q icanhazip.com
178.93.149.50

Дальше запускаем сканирование:

 nmap 178.93.149.50

В результате мы можем получить открытый порт 80 веб сервера, или даже 21 — файлового сервера, которых мы не устанавливали, эти порты открыты роутером, 80 — для веб-интерфейса, а 21 для может использоваться для обновления прошивки. А еще можно вообще не получить результатов, это будет означать что все порты закрыты, или на сервере установлена система защиты от вторжений IDS.

Для сканирования открытых/прослушиваемых портов на вашей системе Linux, запустите следующую команду (она может занять долгое время для завершения):

sudonmap -n -Pn -sS -sU -p- localhost
к содержанию ↑

5. Какие порты открыты для внешнего мира?

Обратите внимание, что сервис может иметь открытый порт, который можно прослушивать только на текущей машине. То есть, порт открыт, но вы не сможете получить к нему доступ из сети.

Это полезно для безопасности, например, веб-сервер должен иметь открытый для остального мира порт 80, но мир не должен знать о (или иметь возможность подключения) порте 3306, который прослушивает сервер MySQL, поддерживающий вебсайт.

В идеале, если вы используете веб-сервер, единственные порты, которые должны быть видны извне это HTTP-порт 80, и возможно, SSH порт 22, поскольку вам понадобится подключаться к веб-серверу для выполнения команд.

Порты для служб, доступных только на локальном компьютере, будут иметь IP адрес 127.0.0.1 в поле локального адреса. В вышеприведенном примере это будет:

tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 21432/mysqld

Как видно, MySQL прослушивает порт 3306 по IP адресу 127.0.0.1. Это означает, что к MySQL серверу могут подключиться только программы на той же машине.

к содержанию ↑

6. Просматриваем открытые порты в Ubuntu

Для выполнения поставленной задачи мы предлагаем использовать стандартную консоль и дополнительные утилиты, позволяющие проводить мониторинг сети. Разобраться в командах смогут даже неопытные пользователи, поскольку мы дадим объяснение каждой. Предлагаем ознакомиться с двумя различными утилитами далее.

7. ВЫВОДЫ

В этой статье мы рассмотрели инструменты, которые вы можете использовать для того чтобы узнать узнать открытые порты linux. Инструментов не так много как для просмотра информации об оперативной памяти или процессоре, но их вполне хватает. А какими программами пользуетесь вы? Напишите в комментариях!

 

Оставьте свой ответ