Dormestmass: Админ — это состояние души

lsof для сетевого администратора

В работе администратора довольно часто возникает необходимость просмотра открытых сетевых портов в системе, сетевых соединений, определения процессов, которые работают с этими портами/соединениями и т.д. и т.п. Как правило, для выполнения этих операций используются команды netstat и sockstat (в BSD системах).

Но вот буквально сегодня для себя узнал, что чудная утилита lsof, которую я часто использую для просмотра открытих файлов, позволяет также проводить эти операции, причем не безуспешно.
Для работы с сетевыми сокетами у данной команды служит ключ -i.

aaa# lsof -i
COMMAND    PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
syslogd    266 root    5u  IPv4 0xc1115924      0t0  UDP *:syslog
sshd       409 root    3u  IPv4 0xc1187de0      0t0  TCP *:ssh (LISTEN)
sendmail   415 root    3u  IPv4 0xc1187c24      0t0  TCP localhost:smtp (LISTEN)
ntpd       449 _ntp    4u  IPv4 0xc1115ec4      0t0  UDP host.domain.com:58832->anoter.host.domain.com:ntp
ntpd       449 _ntp    6u  IPv4 0xc1115654      0t0  UDP localhost:ntp
tac_plus   464 root    0u  IPv4 0xc1187a68      0t0  TCP *:tacacs (LISTEN)
inetd      484 root    4u  IPv4 0xc11152d0      0t0  UDP *:tftp
sshd     25925 root    4u  IPv4 0xc1187000      0t0  TCP host.domain.com:ssh->myworkstation.domain.com:2832 (ESTABLISHED)
tac_plus 47739 root    2u  IPv4 0xc12c4a68      0t0  TCP host.domain.com:tacacs->somerouter.domain.com:11980 (ESTABLISHED)

Как видно из листинга, команда вывела всех открытых сокетов в системе, а так же процессы, которые работают с ними.

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

[46][протокол][@имя_хоста|адрес_хоста][:имя_сервиса|порт]

4 или 6 — это версия протокола IP, соответственно IPv4 или IPv6;
протокол— поскольку с сетевыми портами работают лишь протоколы TCP и UDP, то данный параметр может принимать только такие значения;
имя_хоста, адрес_хоста, имя_сервиса, порт — с этими параметрами ясно из их названия.

Комбинируя данные параметры, можно без труда добиться нужных результатов.

Для примера, выборка процессов, которые работают с 49 TCP портом:

aaa# lsof -i TCP:49
COMMAND  PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
tac_plus 464 root    0u  IPv4 0xc1187a68      0t0  TCP *:tacacs (LISTEN)

Сетевые процессы, связанные с хостом desktop.domain.com:

server ~ # lsof -i@desktop.domain.com
COMMAND   PID USER   FD   TYPE    DEVICE SIZE NODE NAME
ircd     1422 ircd  194u  IPv4 226402187       TCP server.domain.com:ircd->desktop.domain.com:camp (ESTABLISHED)
sshd    16770 root    3u  IPv6 227791970       TCP server.domain.com:ssh->desktop.domain.com:svn (ESTABLISHED)
sshd    17012  srn    3u  IPv6 227791970       TCP server.domain.com:ssh->desktop.domain.com:svn (ESTABLISHED)

Для построения списка открытых портов системы можно передать вывод команды lsof на egrep:

aaa# lsof -i | egrep 'COMMAND|LISTEN|UDP'
COMMAND    PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
syslogd    266 root    5u  IPv4 0xc1115924      0t0  UDP *:syslog
sshd       409 root    3u  IPv4 0xc1187de0      0t0  TCP *:ssh (LISTEN)
sendmail   415 root    3u  IPv4 0xc1187c24      0t0  TCP localhost:smtp (LISTEN)
ntpd       449 _ntp    4u  IPv4 0xc1115ec4      0t0  UDP host.domain.com:58832->anoter.host.domain.com:ntp
ntpd       449 _ntp    6u  IPv4 0xc1115654      0t0  UDP localhost:ntp
tac_plus   464 root    0u  IPv4 0xc1187a68      0t0  TCP *:tacacs (LISTEN)
inetd      484 root    4u  IPv4 0xc11152d0      0t0  UDP *:tftp

Поскольку для протокола UDP отсутствует такое понятие, как «слушать порт (LISTEN)», то в выборку могут попасть не только открытые порты, а и некие соединения по данному протоколу.

Есть ещё пара ключей, которые могут быть безусловно полезны при работе с данной командой.

Во-первых, это ключ -n, который заставляет lsof не резолвить сетевые имена хостов, что делает вывод соединений быстрее (а на машинах с большим количеством соединений — значительно быстрее).

Во-вторых, ключ -t, который заставляет lsof вывести лишь список PID задействованных процессов. Данный список можно передать команде kill.

kill -s HUP `lsof -i:3128`

Более подробно об остальных возможностях команды lsof можно узнать из man.

Популярность: 4%

P.S.

сериал Аватар Легенда об Аанге онлайн смотреть все сезоны
Дать объявление бесплатно без регистрации - работа водителем в Днепропетровске

Вы можете следить за обсуждением с помощью RSS 2.0 ленты.