netstat — проверка открытых портов в Linux
- 1. Используя команду netstat
- Узнать, кто использует данные порты:
- Список всех открытых портов (TCP)
- Список всех открытых портов (UDP)
- Список только прослушиваемых портов (TCP)
- Статистика по всем открытым портам
- Подробное отображение списка с открытыми портами — добавлен PID и имя процессов
- Объединим все ключи в полезную команду для просмотра открытых TCP/UDP портов с именами процессов (может понадобиться root-доступ)
- Список подключенных хостов
- Список всех открытых портов при помощи команды netstat
- Просмотр статистики по протоколам
- Узнать PID и имя ПО, которое проявляет сетевую активность
- Отображение таблицы IP роутов
- Узнать какой порт использует определенный процесс
- Расширенная информация о сетевом интерфейсе
- Несколько примеров для определения атаки типа DoS или DDoS
- 2. Используя команду ss
- Список всех открытых портов при помощи команды ss
- 3. Используя команду lsof
- 4. Используя команду netcat
- 4. Используя команду NMAP
- 5. Какие порты открыты для внешнего мира?
- 6. Просматриваем открытые порты в Ubuntu
- 7. ВЫВОДЫ
Проверка открытых портов на 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 с соответствующими флагами и передает вывод функции 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
Тут мы можем увидеть какие порты находятся в состоянии прослушивания (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
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, запустите следующую команду (она может занять долгое время для завершения):
к содержанию ↑sudo
nmap -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. Инструментов не так много как для просмотра информации об оперативной памяти или процессоре, но их вполне хватает. А какими программами пользуетесь вы? Напишите в комментариях!