Брандмауэры и специальное программное обеспечение 8 Часть 4

Вид материалаРеферат

Содержание


Утилита netstat
Отображаемая информация
ССЫЛКА Метадемон inetd обсуждается в следующей главе 11.
Подобный материал:
1   ...   37   38   39   40   41   42   43   44   ...   101

Утилита netstat


Утилита netstat является наилучшим инструментом анализа состояния сети на любом сетевом узле. Если вы запустите утилиту netstat без каких-либо аргументов, она отобразит на экране состояние всех сетевых соединений вашей системы. По умолчанию все IP-адреса и номера портов будут заменены символьными именами узлов и служб. Для этого будут использованы стандартные процедуры разрешения имен и файл /etc/services.

Отображаемая информация

В данном разделе мы рассмотрим пример вывода утилиты netstat, чтобы вы смогли понять, что означают те или иные отображаемые netstat сведения.

Первая строка, отображаемая утилитой netstat, всегда напоминает вам о том, сведения какого характера отображаются в данный момент этой утилитой. В приведенном далее примере в первой строке указывается: Active Internet connections (w/o servers). To есть в переводе на русский: активные соединения с Интернетом (без серверов). Эта строка может меняться в зависимости от аргументов, передаваемых утилите. Термином servers (серверы) в данном случае обозначаются программы, открывшие порт и ожидающие поступления запросов на соединение. Говорят, что такие программы «слушают в очереди ожидания» (wait queue listening), однако при этом они еще не обмениваются данными с клиентом. Таким образом, в данном случае отображается информация только о существующих соединениях.

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 pppl5.chi.pty.com:2034 209.207.224.222:www ESTABLISHED

tcp 0 0 pppl5.chi.pty.com:2033 209.207.224.222:www ESTABLISHED

tcp 0 0 pppl5.chi.pty.com:2032 209.207.224.222:www ESTABLISHED

tcp 0 0 ppp!5.chi.pty.com:2031 209.207.224.222:www ESTABLISHED

tcp 1 1 pppl5.chi.pty.com:2030 209.207.224.245:www CLOSING

tcp 0 0 pppl5.chi.pty.com:2026 mail03.dfw.mindspr:pop3 TIME_WAIT

Active UNIX domain sockets (w/o servers)

Proto RefCnt Flags Type State I-Node Path

unix 1 [ ] STREAM CONNECTED 26740 00000013f

unix 1 [ ] STREAM CONNECTED 652 000000004

unix 1 [N] STREAM CONNECTED 27587 000000162

unix 1 [ ] STREAM CONNECTED 26744 000000140

unix 1 [ ] STREAM CONNECTED 642 000000003

unix 1 [ ] STREAM CONNECTED 28666 /tmp/.Xll-unix/XO

unix 1 [ ] STREAM CONNECTED 27588 /tmp/.Xll-unix/XO

unix 1 [ ] STREAM CONNECTED 27527 /tmp/.Xll-unix/XO

unix 0 [ ] STREAM 27523

unix 1 [ ] STREAM CONNECTED 26760 /tmp/.Xll-unix/XO

unix 1 [ ] STREAM CONNECTED 26754 /tmp/.Xll-unix/XO

unix 1 [ ] STREAM CONNECTED 653 /dev/log

unix 1 [ ] STREAM CONNECTED 643 /dev/log

unix 1 [ ] STREAM CONNECTED 597 /dev/log

Вторая строка — это заголовки для первого раздела вывода netstat. Заголовок Proto обозначает protocol — протокол. Чаще всего в этой колонке фигурирует либо tcp, либо udp, однако, как было отмечено в файле /etc/services, в этой колонке могут быть также raw и другие протоколы. Третья и четвертая колонки обладают заголовками Revc-Q и Send-Q, что означает Receive Queue (очередь на прием) и Send Queue (очередь на передачу) соответственно. В этих колонках показывается соответственно количество пакетов, принятых из сети, но не скопированных пользовательской программой, подключенной к сокету, и количество байтов, прием которых не подтвержден удаленной системой. После того как сокет TCP закрывается, как правило, удаленный сетевой узел не подтверждает приема одного пакета. Это происходит потому, что соединение разрывается и завершающий АСК не может быть подтвержден.

В следующих двух колонках указывается локальный (Local) и удаленный (Foreign) IP-адреса, между которыми устанавливается соединение. Адреса указываются в форме адрес:порт. В рассматриваемом выше примере узел pppl5.chi.pty.com:2034 (полное доменное имя иногда обрезается, чтобы уместиться в отведенном для этого пространстве) соединен с узлом 209.207.224.222:www, то есть через порт 80. Протокол TCP подключает сервер к клиенту таким образом, что данные посылаются по одному порту (в данном случае с номером 80) и принимаются по другому порту (в данном случае с номером 2034). Порт возврата данных не задан жестко. Это может быть любой незанятый порт с номером выше 1024.

В процессе первого соединения клиент сообщает серверу номер выбранного порта и ожидает поступления на этот порт пакета SYN-ACK, принятого от сервера. Если сервер не может использовать этот порт, потому что он занят, клиенту передается сообщение ICMP Туре 3 Code 3 Port Unreachable (порт недоступен). При этом клиент случайным образом выбирает другой порт. Когда клиент через выбранный им порт наконец принимает от сервера пакет SYN, он возвращает серверу АСК. На этом соединение считается установленным и начинается передача данных.

В приведенном ранее примере вывода netstat видно, что с удаленным узлом установлено несколько соединений. При этом соединение через клиентский порт 2030 было установлено самым первым. Судя по всему, на загруженной с сайта web-страничке располагалось несколько рекламных баннеров, в связи с чем браузер был вынужден открыть несколько дополнительных соединений, чтобы загрузить необходимые картинки. Каждое соединение устанавливается в результате выполнения ранее рассмотренной последовательности процедур, в результате которой открывается очередной коммуникационный порт. Когда соединение разрывается, осуществляется похожая последовательность процедур. В последней колонке одной из записей указывается метка CLOSING (соединение закрывается), однако вместо этого в данной колонке может содержаться также метка LAST_ACK (последнее подтверждение). Когда клиент посылает сообщение LAST_ACK, а сервер принимает его, сервер разрывает соединение. Так как соединение больше не существует, ответ на это сообщение передать невозможно.

В последней колонке, в которой указывается состояние соединения, может быть одна из следующих меток:

ESTABLISHED

SYN_SENT

SYN_RECV

FIN_WAIT1

FIN_WAIT2

TIME_WAIT

CLOSED

CLOSE_wAIT

LAST_ACK

LISTEN

CLOSING

UNKNOWN

Какие-то из этих меток могут использоваться только на стороне сервера, другие — только на стороне клиента, однако некоторые метки могут применяться как на сервере, так и на клиенте.

Если к команде netstat добавить ключ -е, к выводу команды добавится еще одна колонка User (пользователь). В этой колонке будет указываться идентификатор UID пользователя, от имени которого запущен процесс, создавший данное соединение.

В начале следующего раздела, отображаемого на экране утилитой netstat, стоит строка Active UNIX domain sockets (w/o servers), что означает активные доменные сокеты Unix (без серверов). После этого идет строка заголовков колонок. Обратите внимание, что данный раздел вывода утилиты netstat существенно сокращен. Заголовки колонок выглядят следующим образом: Proto (протокол), RefCnt (счетчик ссылок), Flags (флаги), Туре (тип), State (состояние), I-Node (дескриптор inode) и Path (путь).

Рассмотрим смысл каждой из колонок.

- Proto — обозначает protocol, то есть «протокол». Для сокетов в стиле Unix единственным допустимым значением в данной колонке может быть unix.

- RefCnt — счетчик ссылок. Здесь указывается количество подсоединенных процессов. Обычно это значение должно быть равно 1, однако может быть равно и 0.

- Flags — набор флагов. Как правило, это поле должно быть пустым, однако если поле RefCnt равно 0 и соответствующие процессы ожидают поступления запросов на соединение, поле флагов может быть равно АСС (то есть SO_ ACCEPTION — принятие), что означает, что сокет готов к приему запроса на соединение. В некоторых ситуациях могут возникать и другие флаги, например W (SO_ WAITDATA - ожидание данных) или N (SO_NOSPACE - нет места).

- Type - тип сокета. Как правило, здесь стоит метка STREAM (сокет с созданием

соединения), однако также допускаются следующие метки: DGRAM (Datagram -сокет без создания соединения), RAW (сокет передачи данных без транспортного протокола), RDM (Reliably Delivered Message — надежно передаваемое сообщение), SEQPACKET {Sequental Packet — последовательно передаваемый пакет), PACKET (пакет простого доступа к интерфейсу) или UNKNOWN (неизвестный тип сокета для будущих усовершенствований).

- State — состояние сокета. Здесь могут использоваться следующие метки: FREE (сокет свободен), LISTENING (ожидание поступления запроса), CONNECTING (соединение устанавливается), CONNECTED (соединение установлено), DISCONNECTING (соединение разрывается) или UNKNOWN (неизвестное состояние). Данное поле может быть также вообще пустым. При нормальном функционировании системы сокет не может находиться в состоянии UNKNOWN.

- I-Node — не представляет интереса. Здесь отображается номер дескриптора I-Node, соответствующий соединению. Однако этот I-Node существует в каталоге /ргос только в случае, если соединение используется, таким образом, поиск данного I-Node не приведет к желаемым результатам.

- Path — здесь отображается процесс, подключенный к данному сокету.

В предыдущем примере не показано ни одного соединения, находящегося в одном из наиболее распространенных состояний: LISTENING (слушание). Это состояние соответствует ожиданию запроса на подключение. Фактически соединения еще нет — серверная программа ожидает поступления от клиентов запросов на подключение. Информация о соединениях в состоянии LISTENING отображается утилитой netstat только в случае, если вы используете ключ -а. При использовании этого ключа первая строка в каждом из двух разделов меняется. Там, где раньше был отображен текст Active Internet connection (w/o servers), то есть без серверов, теперь стоит текст Active Internet connection (including servers), то есть включая серверы. Соответственно для второго раздела сведений, отображаемых утилитой netstat, заголовок меняется на Active UNIX domain sockets (including servers) — активные сокеты доменов Unix (включая серверы). При этом на экране будет показан существенно более длинный список, так как теперь утилита netstat отображает также информацию о серверных программах, которые не соединены ни с одним из клиентов, но ожидают поступления запроса на подключение.

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 1 0 208.143.150.24:2034 209.207.224.222:80 CLOSE_WAIT

tcp 1 0 208.143.150.24:2033 209.207.224.222:80 CLOSE_WAIT

tcp 1 0 208.143.150.24:2032 209.207.224.222:80 CLOSEJJAIT

tcp 1 0 208.143.150.24:2031 209.207.224.222:80 CLOSE_WAIT

tcp 1 1 208.143.150.24:2030 209.207.224.245:80 CLOSING

tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:51966 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:1024 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:901 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:79 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:37 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:19 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:13 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:9 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:7 0.0.0.0:* LISTEN

udp 0 0 0.0.0.0:1025 0.0.0.0:*

udp 0 0 0.0.0.0:177 . 0.0.0.0:*

udp О О 0.0.0.0:37 0.0.0.0:*

udp О О 0.0.0.0:19 0.0.0.0:*

udp О О 0.0.0.0:13 0.0.0.0:*

udp О О 0.0.0.0:9 0.0.0.0:*

udp О О 0.0.0.0:7 0.0.0.0:*

raw О О 0.0.0.0:1 0.0.0.0:* 7

raw 0 0 0.0.0.0:6 0.0.0.0:* 7

Active UNIX domain sockets (servers and established)

Proto RefCnt Flags Type State I-Node Path

unix 0 [ ACC ] STREAM LISTENING 593 /dev/log

unix 1 [ ] STREAM CONNECTED 26740 00000013f

unix 1 [ ] STREAM CONNECTED 25943 000000137

unix 0 [ ACC ] STREAM LISTENING 3864 /tmp/.axnetipc

unix 0 [ ACC ] STREAM LISTENING 670 /dev/gpmctl

unix 0 [ ACC ] STREAM LISTENING 17104 /tmp/.Xll-unix/XO

unix 1 [ ] STREAM CONNECTED 25957 00000013a

unix 0 [ACC] STREAM LISTENING 1032 /tmp/mysql.sock

unix 1 [ N ] STREAM CONNECTED 27526 000000160

unix 1 [ ] STREAM CONNECTED 26753 000000142

unix 1 [ ] STREAM CONNECTED 652 000000004

unix 1 [ N ] STREAM CONNECTED 27587 000000162

unix 1 [ ] STREAM CONNECTED 26744 000000140

Unix 1 [ ] STREAM CONNECTED 642 000000003

unix 1 [ ] STREAM CONNECTED 28666 /tmp/.Xll-unix/XO

unix 1 [ ] STREAM CONNECTED 27588 /tmp/.Xll-unix/XO

unix 1 [ ] STREAM CONNECTED 27527 /tmp/.Xll-unix/XO

unix 0 [ ] STREAM 27523

unix 1 [ ] STREAM CONNECTED 26760 /tmp/.Xll-unix/XO

unix 1 • [ ] STREAM CONNECTED 653 /dev/log

unix 1 [ ] STREAM CONNECTED 643 /dev/log

unix 1 [ ] STREAM CONNECTED 597 /dev/log

Изучите этот список и сравните вывод утилиты netstat со списком процессов, запущенных в вашей системе. Вы можете обнаружить, что некоторые из процессов, ожидающих поступления запроса на соединение, не обладают соответствующими им демонами, связанными с некоторым портом. Но как программа может ожидать поступления запроса, если она при этом даже не загружена в память? Все очень просто: ожиданием поступления запроса для этой программы на самом деле занимается метадемон inetd, который порождает демонов для подобных портов тогда, когда в этом возникает необходимость. В частности, это относится, например, к порту telnet.


ССЫЛКА

Метадемон inetd обсуждается в следующей главе 11.

Если утилиту netstat запустить с ключом -v, вы получите сведения о протоколах, которые не поддерживаются данной системой. Последние несколько строчек вывода будут выглядеть следующим образом:

netstat: no support for 'AF IPX' on this system.

netstat: no support for 'AF AX25' on this system.

netstat: no support for 'AF NETROM' on this system.

Из этих строк можно сделать вывод, что данная система не поддерживает протоколы IPX, AX25 и NETROM.

Проанализировав сведения, полученные в результате выполнения команды netstat -а, вы сможете быстро понять, какие из портов подготовлены к получению запросов, адресованных вашей системе. Любые порты, для которых нет соответствующей записи в файле /etc/services, будут обладать процессом, ожидающим поступления запроса через этот порт. Этот процесс будет обладать индивидуальной записью в таблице процессов. В файл /etc/services вовсе не обязательно включать записи абсолютно для всех запускаемых на вашем компьютере служб, однако описав все используемые вами службы в файле /etc/services, вы предотвратите возникновение борьбы за порт между несколькими службами. Если некоторый порт уже упомянут в файле /etc/services и в этом файле ему поставлена в соответствие некоторая служба, ни одна другая служба не будет использовать этот порт.

Если вы обнаруживаете некоторый открытый порт и не знаете, зачем он нужен и кто с ним связан, вы должны попробовать выяснить, кем используется этот порт. Это может быть программа из категории «троянский конь» или какое-либо другое скрытое средство удаленного доступа. Все подобные программы, как правило, используют один из произвольных свободно доступных портов.

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

Вы не можете остановить работу абсолютно всех служб — многие из них необходимы или желательны. В последующих главах будет обсуждаться, как именно вы должны организовать безопасное использование открытых портов.