пʼятниця, 26 листопада 2010 р.

Ищем процессы, прослушивающие порты в Linux

Как я найду запущенные процессы, связанные с каждым открытым портом? Как я узнаю, какой процесс открыл 111-й tcp порт или 7000-й udp порт?


Для поиска процессов связанных с номерами портов вы можете использовать следующие программы:

  1. netstat - консольный инструмент отображающий сетевые соединения, таблицы маршрутизации и много статистических данных сетевых интерфейсов.

  2. fuser - утилита, идентифицирующая процессы, которые используют указанные файлы или сокеты.

  3. lsof - утилита, служащая для вывода информации о том, какие файлы используются теми или иными процессами в Linux / UNIX.
  4. Файловая система /proc/$pid/ - В Linux /proc включает в себя каталог для каждого запущенного процесса (включая процессы ядра) в /proc/PID, содержащий информацию о этих процессах, в частности включает имя процесса, открывшего порт.
Все последующие команды нужно запускать от root.

Пример netstat

Введите следующую команду:
# netstat -tulpn

Примерный вывод:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1138/mysqld
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      850/portmap
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1607/apache2
tcp        0      0 0.0.0.0:55091           0.0.0.0:*               LISTEN      910/rpc.statd
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1467/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      992/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1565/cupsd
tcp        0      0 0.0.0.0:7000            0.0.0.0:*               LISTEN      3813/transmission
tcp6       0      0 :::22                   :::*                    LISTEN      992/sshd
tcp6       0      0 ::1:631                 :::*                    LISTEN      1565/cupsd
tcp6       0      0 :::7000                 :::*                    LISTEN      3813/transmission
udp        0      0 0.0.0.0:111             0.0.0.0:*                           850/portmap
udp        0      0 0.0.0.0:662             0.0.0.0:*                           910/rpc.statd
udp        0      0 192.168.122.1:53        0.0.0.0:*                           1467/dnsmasq
udp        0      0 0.0.0.0:67              0.0.0.0:*                           1467/dnsmasq
udp        0      0 0.0.0.0:68              0.0.0.0:*                           3697/dhclient
udp        0      0 0.0.0.0:7000            0.0.0.0:*                           3813/transmission
udp        0      0 0.0.0.0:54746           0.0.0.0:*                           910/rpc.statd  

TCP port 3306 открыт процессом mysqld имеющий PID # 1138. Вы можете проверить это используя /proc, введя:
# ls -l /proc/1138/exe

Примерный вывод:
lrwxrwxrwx 1 root root 0 2010-10-29 10:20 /proc/1138/exe -> /usr/sbin/mysqld

Для фильтрации выводимой информации вы можете использовать команду grep:
# netstat -tulpn | grep :80

Пример вывода:
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1607/apache2

Команда fuser

Чтобы найти PID процессов открывших 7000-й tcp порт, введите:
# fuser 7000/tcp


Пример вывода:
7000/tcp:             3813


Наконец, найдём имя процесса ассоциированного с PID # 3813, введя:
# ls -l /proc/3813/exe


Пример вывода:
lrwxrwxrwx 1 vivek vivek 0 2010-10-29 11:00 /proc/3813/exe -> /usr/bin/transmission


/usr/bin/transmission это bittorrent-клиент, введите:
# man transmission

или
# whatis transmission


Пример вывода:
transmission (1)     - a bittorrent client

Задача: найти текущий рабочий каталог процесса
Найти текущий рабочий каталог процесса bittorrent или pid 3813 можно введя:
# ls -l /proc/3813/cwd


Пример вывода:
lrwxrwxrwx 1 vivek vivek 0 2010-10-29 12:04 /proc/3813/cwd -> /home/vivek


Или используя команду pwdx, ввести:
# pwdx 3813


Пример вывода:
3813: /home/vivek

Задача: узнать владельца процесса:

Чтобы узнать владельца процесса с PID 3813 используйте следующую команду:
# ps aux | grep 3813


Или
# [URL=http://www.cyberciti.biz/tips/grepping-ps-output-without-getting-grep.html]ps aux | grep '[3]813'[/URL]

Пример вывода:
vivek     3813  1.9  0.3 188372 26628 ?        Sl   10:58   2:27 transmission


Или попытайтесь с ps следующей командой:
# ps -eo pid,user,group,args,etime,lstart | grep '[3]813'


Пример вывода:
3813 vivek    vivek    transmission                   02:44:05 Fri Oct 29 10:58:40 2010

Другая опция это /proc/$PID/environ, введите:
# cat /proc/3813/environ


Или
# grep --color -w -a USER /proc/3813/environ


Пример вывода (не забудьте опцию --colour):

Примеры с командой lsof

Введите команду следующим образом:
lsof -i :portNumber
lsof -i tcp:portNumber
lsof -i udp:portNumber
lsof -i :80
lsof -i :80 | [COLOR=purple]grep[/COLOR] LISTEN


Пример выводов:
apache2   1607     root    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   1616 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   1617 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   1618 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   1619 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   1620 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)


Теперь получите больше информации о pid # 1607 или 1616 и так далее:
# ps aux | grep '[1]616'


Пример вывода:
www-data 1616 0.0 0.0 35816 3880 ? S 10:20 0:00 /usr/sbin/apache2 -k start

Я рекомендую следующую команду для получения информации о pid # 1616:
# ps -eo pid,user,group,args,etime,lstart | grep '[1]616'


Пример вывода:
1616 www-data www-data /usr/sbin/apache2 -k start     03:16:22 Fri Oct 29 10:20:17 2010

Где

  • 1616 : PID

  • www-date : Имя пользователя (владелец - EUID)

  • www-date : Название группы (группа - EGID)

  • /usr/sbin/apache2 -k start : Название команды и её аргументы

  • 03:16:22 : Время прошедшее с момента запуска процесса в форме [[dd-]hh:]mm:ss.

  • Fri Oct 29 10:20:17 2010 : Время запуска команды.
Помощь: Я обнаружил порт, который вообще не распознаю

Для обслуживания сервисами нумерации портов и протоколов используются файл /etc/services. Попытаемся сопоставить номера портов:
$ grep port /etc/services
$ grep 443 /etc/services

Пример вывода:
https  443/tcp    # http protocol over TLS/SSL
https  443/udp

Проверка на руткиты

Я строго рекомендую узнать вам, какие процессы действительно запущены, особенно на серверах с доступом по высокоскоростному интернету. Вы можете искать rootkit, который является программой, разработанной, чтобы взять на себя фундаментальное управление компьютерной системы Вы можете искать руткиты, которые разработаны, чтобы взять фундаментальный контроль (полномочия "root" в Linux / UNIX, в Windows полномочия "Администратора") над компьютерной системой, без авторизации владельцем системы и законными менеджерами. Смотрите как обнаружить и проверять наличие руткитов в Linux.
Следите за своими графиками пропускной способности сети

Как правило заражённые руткитами сервера используются для отправки большого количества спама или вредоносного программного обеспечения (malware), или DoS атак на другие компьютеры.
Смотрите также:

Смотрите следующие страницы руководств для более подробной информации:
$ man ps
$ man grep
$ man lsof
$ man netstat
$ man fuser

копипаста годной статьи http://my.opera.com/avm-xandry/blog/2010/11/12/linux

Немає коментарів:

Дописати коментар

Не обязательно регистрироваться, вы наверняка уже зарегистрированы в одном из сервисов, который предоставляет OpenId, предлагаю воспользоваться им. Подробнее: http://openid.net/what/