Описание. По данному выводу команды tcpdump(1) кандидат BSDA должен уметь дать ответ на основные вопросы связанные со связью по сети. Для этого кандидат должен знать обычные номера портов для распространённых TCP и UDP сервисов, разницу между TCP/IP сервером и клиентом и о «тройном рукопожатии».
Практика. tcpdump(1)
В Приложение B, Некоторые сведения о стеке протоколов TCP/IP рассказано многое о
функционировании протоколов стека TCP/IP. В частности о
процедуре открытия соединения TCP (процедуре «тройного
рукопожатия») рассказано в Раздел B.1.4.3.2, «Открытие соединения TCP, тройное рукопожатие». О
том какие номера портов каким протоколам соответствуют можно
справиться в файле /etc/services
.
Утилита tcpdump(1) отностится к числу так называемых «снифферов» — программ предназначенных для перехвата сетевого трафика. Одним словом, tcpdump(1) предназначен для подслушивания. С одной стороны, это одно из самых мощных средств диагностики и администратор без tcpdump(1) будет лишён глаз и ушей, с другой стороны, сама возможность применения этой программы потенциально опасна.
tcpdump(1) не единственный сниффер, которым может пользоваться администратор. Кроме tcpdump(1). есть ещё замечательная программа wireshark(1) (более известная как ethereal) — сниффер с графическим интерфейсом, который может обрабатывать дампы сделаные программой tcpdump(1) и другие. Этот сниффер будет описан в Раздел 6.11.2, «Графический сниффер Wireshark/Ethereal/tEhereal». Описание работы tcpdump и ethereal можно также найти в работах Николая Малых: [url://Malyh-tcpdump-2005], [url://Malyh-ethereal-2005]
tcpdump(1) работает при помощи интерфейса bpf(4) (Berkeley Packet Filter). Если поддержку этого устройства отключить, сниффинг в BSD окажется невозможен.
Замечание | |
---|---|
Права на запуск программы tcpdump(1)
определяются правами доступа к устройсву
bpf(4) (/dev/bpf0 ). Эти
права можно регулировать через devfs(8). Если
вы предоставляете, например, группе operator права на чтение из
этого устройства, то это значит, что все члены этой группы
смогут перехватывать любой трафик, в том числе трафик
суперпользователя.
|
Если программа tcpdump(1) вызвана для
прослушивания некоторого интерфейса, она переводит его в
«promiscuous mode» — «неразборчивый
режим». В этом режиме интерфейс ловит вообще все пакеты,
которые до него добрались, а не только пакеты адресованные
непосредственно ему. Таким образом, если сеть собрана не на
коммураторах (switch'ах), а на репитерах (hub'ах), то
tcpdump(1) позволит перехватить трафик между
посторонними машинами, т.е. подслушать разговор двух сторонних
машин. Сказанное не означает, что перехват трафика невозможен в
сети собранной на коммутаторах (подробно об этом мы говорим в
Раздел B.1.2, «Канальный уровень OSI»). Впрочем, интерфейс можно и не
переводить в promiscous mode, если передать программе аргумент
-p
.
tcpdump(1) — утилита с интерфейсом командной строки. Несмотря на повсеместную распространённость (существуют даже порты под Windows) эта утилита не входит в стандарт POSIX и может отсутствовать или присутствовать, но не работать по причине указанной в предыдущих абзацах. Если вы являетесь сторонником графического интерфейса, вы можете найти и альтернативные программы в системе портов, например ethereal(1). Однако все они будут работать через bpf(4) (или не будут работать, если вы его исключите из ядра). Эти программы могут предоставлять больше удобств, но вряд ли окажутся более функциональными.
Итак, опции tcpdump(1) можно разделить на несколько типов:
Опции | Описание |
---|---|
-i interface | Какой интерфейс должен прослушиваться программой. |
-w file |
В норме отчёт программы tcpdump(1)
выводится на терминал в режиме реального времени,
однако можно попросить при помощи опции
-w записывать всю информацию в файл в
бинарном виде, т.е. сделать dump того, что происходит
на сетевом интерфейсе. В последствии эту информацию
можно заново проанализировать при помощи опции
-r .
|
-r file |
Эта опция применяется вместо -i и
служит для того, чтобы прочитать данные из файла. Файл
в бинарном формате можно создать заранее при помощи
опции -w . Кроме того, есть и другие
программы, которые создают файлы в формате бинарного
файла tcpdump(1), например в этом
формате сохраняет журнальный файл брандмауэр
pf(4).
|
-D |
Перечислить доступные интерфейсы (которые можно
прослушивать при помощи опции -i ).
|
Интерфейс pflog принадлежит пакетному
фильтру pf(4). (Это брандмауэр
OpenBSD, который так же доступен в
FreeBSD, см. Приложение C, Пакетный фильтр OpenBSD — pf(4)) Данный брандмауэр позволяет
читать журнальный файл в режиме реального времени, для
этого можно воспользоваться программой
tcpdump(1) нацелив её на интерфейс
pflog0 . Сам журнальный файл ведётся в
бинарном формате так, чтобы его можно было прочитать при
помощи tcpdump(1) с опцией
-r
|
Опции | Описание | |||||
---|---|---|---|---|---|---|
-q | Вывод информации в краткой форме. Одно из «неудобств» программы tcpdump(1) состоит в том, что она очень информативна. Из-за этого информация о перехватываемых сообщениях не влезает в строку в терминале. Данная опция призвана разрешить эту проблему. | |||||
|
Эти опции включают вывод содержимого пакета. Опция
-A — в формате ASCII,
-x — в шестнадцатеричном
виде и -X одновременно и в ASCII и в
шестнадцатеричном виде. К сожалению, я ещё ни разу не
видел чтобы опция -A работала. На
протестированных мною версиях она была эквивалентна
опции -x . Двухбуквенные опции делают
то же, что и их однобуквенные аналоги, но не
отбрасывают заголовки канального уровня. Для просмотра
содержимого пакетов может быть так же полезна опция
-s (см. далее).
| |||||
|
Verbouse — подробный вывод информации о
заголовке пакета. Чем больше букв v
тем подробнее вывод.
| |||||
| Разный формат вывода даты: 1) не выводит информации о времени, 2) время выводится в секундах от начала UNIX эры, 3) выводится информация о том, сколько прошло микросекунд после предыдущей строки, 4) обычный формат (час:мин:сек.микросек), но спереди добавлена текущая дата (год-месяц-число). | |||||
|
-f использует числовые IP адреса
вместо символьных. -n ещё строже: не
только адреса, но и номера протоколов выводятся в
числовом виде. Опцию -f разработчики
рекомендуют для борьбы с багами в NIS серверах SUN.
Считается, что они могут виснуть при попытке разрешить
нелокальный адрес. Опция -N
заставляет вместо полного доменного имени писать
только имя хоста. Т.е. вместо www.ru просто www.
| |||||
-e | Выводится информация о заголовках канального уровня (MAC-адреса). |
Для примера мы запустим ping(1) и будем при
помощи программы tcpdump(1) ловить пары
ICMP пакетов. Для этого нам понадобится опция
-c
обрывающая пинг после получения заданного
количества пакетов и мы используем условие icmp
, которое заставит
tcpdump(1) отчитываться только о пакетах
принадлежащих протоколу ICMP.
#
tcpdump -i rl0 -c2 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on rl0, link-type EN10MB (Ethernet), capture size 96 bytes 15:51:48.309703 IP 192.168.25.158 > mccme.ru: ICMP echo request, id 64479, seq 63, length 64 15:51:48.310409 IP mccme.ru > 192.168.25.158: ICMP echo reply, id 64479, seq 63, length 64 2 packets captured 30 packets received by filter 0 packets dropped by kernel#
tcpdump -i rl0 -c2 -t icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on rl0, link-type EN10MB (Ethernet), capture size 96 bytes IP 192.168.25.158 > mccme.ru: ICMP echo request, id 64479, seq 135, length 64 IP mccme.ru > 192.168.25.158: ICMP echo reply, id 64479, seq 135, length 64 2 packets captured 10 packets received by filter 0 packets dropped by kernel#
tcpdump -i rl0 -c2 -t -vv icmp tcpdump: listening on rl0, link-type EN10MB (Ethernet), capture size 96 bytes IP (tos 0x0, ttl 64, id 13694, offset 0, flags [none], proto: ICMP (1), length: 84) 192.168.25.158 > mccme.ru: ICMP echo request, id 64479, seq 217, length 64 IP (tos 0x0, ttl 63, id 40953, offset 0, flags [none], proto: ICMP (1), length: 84) mccme.ru > 192.168.25.158: ICMP echo reply, id 64479, seq 217, length 64 2 packets captured 8 packets received by filter 0 packets dropped by kernel#
tcpdump -i rl0 -c2 -t -e -vv icmp tcpdump: listening on rl0, link-type EN10MB (Ethernet), capture size 96 bytes 00:50:22:b0:7f:39 (oui Unknown) > 00:10:e0:00:e9:cd (oui Unknown), ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 19710, offset 0, flags [none], proto: ICMP (1), length: 84) 192.168.25.158 > mccme.ru: ICMP echo request, id 64479, seq 5499, length 64 00:10:e0:00:e9:cd (oui Unknown) > 00:50:22:b0:7f:39 (oui Unknown), ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 63, id 46235, offset 0, flags [none], proto: ICMP (1), length: 84) mccme.ru > 192.168.25.158: ICMP echo reply, id 64479, seq 5499, length 64 2 packets captured 13 packets received by filter 0 packets dropped by kernel#
tcpdump -i rl0 -c2 -t -X -vv icmp tcpdump: listening on rl0, link-type EN10MB (Ethernet), capture size 96 bytes IP (tos 0x0, ttl 64, id 17657, offset 0, flags [none], proto: ICMP (1), length: 84) 192.168.25.158 > mccme.ru: ICMP echo request, id 64479, seq 3514, length 64 0x0000: 4500 0054 44f9 0000 4001 b0ed c0a8 199e E..TD...@....... 0x0010: 3e75 6c07 0800 a34d fbdf 0dba 447e e252 >ul....M....D~.R 0x0020: 000d 3937 0809 0a0b 0c0d 0e0f 1011 1213 ..97............ 0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"# 0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123 0x0050: 3435 45 IP (tos 0x0, ttl 63, id 44250, offset 0, flags [none], proto: ICMP (1), length: 84) mccme.ru > 192.168.25.158: ICMP echo reply, id 64479, seq 3514, length 64 0x0000: 4500 0054 acda 0000 3f01 4a0c 3e75 6c07 E..T....?.J.>ul. 0x0010: c0a8 199e 0000 ab4d fbdf 0dba 447e e252 .......M....D~.R 0x0020: 000d 3937 0809 0a0b 0c0d 0e0f 1011 1213 ..97............ 0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"# 0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123 0x0050: 3435 45 2 packets captured 7 packets received by filter 0 packets dropped by kernel
Опции | Описание |
---|---|
-l | Сделать буферизацию построчной. Это полезно, если вы перенаправляете вывод tcpdump(1) в pipe, например направляете его на вход команде tee(1) или awk(1). (См Раздел 7.1, «Перенаправление вывода и использование tee(1)»). |
-c count |
Выйти из программы после получения
count пакетов.
|
-C size |
Если выбрана опция -w файл не должен
превысить размера size . Если объём
оказывается больше, то запись производится в другой
файл, имя которого определяется путём дописывания
номера к имени файла. size задаётся в
миллионах байт.
|
-W num |
Используется одновременно с -C .
Ограничивает количество файлов числом
num .
|
-F file | Условие (см следующий раздел) читать не из командной строки, а из файла. |
-s size |
Захватывать size байт от каждого
пакета. По умолчанию перехватываются только первые 96 байт,
это существенно уменьшает размер файла, котрый
записывает программа. В большинстве случаев первых 96
байт достаточно для прояснения ситуации, однако, если
вы хотите именно перехватить трафик целиком, т.е.
заниматься сниффингом, и хотите использовать опции
-x или -X , вам стоит
выставить size равным MTU.
|
-p | Отключить promiscous mode |
-Z user |
После запуска сделать владельцем процесса пользователя
user . В качестве группы будет
назначена основная группа, в которую входит
user .
|
Условия определяют то, какие пакеты будут перехвачены. Если не указано никаких условий, будут перехвачены все пакеты, если условия указаны, то только те пакеты, для которых это условие истинно.
Условие состоит из некоторого количества примитивов. Примитив состоит из идентификатора (числа или имени) перед которым идёт оператор одного из трёх типов:
host
, net
, port
, portrange
. Например, возможны
следующие примитивы: host
somehost
, net 128.3
,
port 20
, portrange 6000-6008
src
,
dst
, src or
dst
, src and dst
.
Например: src somehost
, dst net 128.3
, src or dst port ssh
. Если
направление не указано, подразумевается src or dst
.
ether
,
fddi
,
tr
,
wlan
,
ip
,
ip6
,
arp
,
rarp
,
decnet
,
lat
,
sca
,
moprc
,
mopdl
,
iso
,
esis
,
isis
,
icmp
,
icmp6
,
tcp
и
udp
.
Например: ether src somehost
,
arp net 128.3
, tcp port 21
, udp portrange 7000-7009
. Некоторые
из этих протоколов являются синонимами, см. страницу
man(1). Если протокол не указан
подразумеваются все пригодные протоколы. Например: src somehost
эквивалентно (ip or arp or rarp) src somehost
(За исключением того, что синтаксис последнего выражения
негоден.) port 53
означает
(tcp or udp) port 53
.
Кроме того, есть примитивы, за которыми не следует шаблона:
gateway
,
broadcast
,
less
,
greater
.
Можно строить сложные условия объединяя примитивы при помощи
следующих операторов:
and
,
or
,
not
.
Допустимые примитивы:
ip host xxx
эквивалентно ether proto \ip and host xxx
.
Замечание: «ip» — ключевое слово,
поэтому мы должны защитить его обратным слешем (а в
shell'е двумя бекслешами).
/etc/ethers
). Эквивалентная
конструкция ether host xx1 and not host xxx2, где xxx1 это
аппаратный адрес хоста xxx, а xxx2 — IP адрес
xxx.
/etc/services
.
icmp
,
icmp6
,
igmp
,
igrp
,
pim
,
ah
,
esp
,
vrrp
,
udp
,
tcp
.
Замечание: идентификаторы tcp
,
udp
и icmp
являются ключевыми словами и
должны защищаться обратным слешем (а в shell'е двумя
бекслешами).
ip6
protochain 6
соответствует пакет IPv6 с
заголовком TCP. Пакет может содержать, например,
аутентификационный заголовок, маршрутизационный заголовок
или дополнительный hop-by-hop заголовок.
ether
можно опустить. Данный примитив эквивалентен ether[0] & 1 != 0
.
Истина, если пакет принадлежит канальному протоколу xxx.
Протокол может быть передан по номеру или символьно.
Допустимы следующие имена:
ip
,
ip6
,
arp
,
rarp
,
atalk
,
aarp
,
decnet
,
sca
,
lat
,
mopdl
,
moprc
,
iso
,
stp
,
ipx
,
netbeui
.
Замечание: некоторые из этих идентификаторов —
ключевые слова и должны быть экранированы обратным слешем
(а в shell'е двумя бекслешами).
В случае FDDI надо писать fddi
proto arp
, Token ring — tr proto arp
, беспроводные сети
IEEE 802.11 — wlan proto
arp
. Впрочем, fddi, wlan, tr и ether ведут себя
как синонимы.
ether proto p
,
где p — один из перечисленных протоколов.
vlan 100
&& vlan 200
соответствуеют пакеты vlan
200 упакованные в пакеты vlan 100. Условию vlan && vlan 300 &&
ip
соответствуют пакеты IPv4 упакованные в vlan
300, которые упакованы в vlan верхнего уровня.
ip proto p
or ip6 proto p
, где p — один из
перечисленных протоколов.
clnp
,
esis
,
isis
.
iso proto
p
, где p — один из перечисленных
протоколов.
Программа tcpdump(1), как отмечалось выше,
может использоваться пакетным фильтром (PF)
OpenBSD для обработки журнальных файлов
(при помощи опции -r
), а так же для чтения
журнала в режиме реального времени при помощи опции
-i
через устройство pflog (см. Раздел C.2.3.1, «Журналирование в пакетном фильтре»). Пакетный фильтр
OpenBSD работает не только в
OpenBSD, но и в FreeBSD.
В последней системе он сперва появился как порт, а затем был
добавлен в ядро начиная с версии
FreeBSD 5.2.1. Теперь он портируется в
ядро FreeBSD при каждом релизе.
Пакетный фильтр помещает в пакеты, которые он направляет в журнал специфическую информацию, о том, какое правило отправило пакет в журнал, какие действия предприняты с этим пакетом и проч. Для работы с этой информацией tcpdump(1) имеет специальные примитивы. Перечисленные ниже примитивы пригодны только для работы с журналом PF.
ifname
match
,
bad-offset
,
fragment
,
short
,
normalize
,
memory
.
pass
и
block
.
Дополнительный примитив — арифметический:
Истина, если выполнено данное отношение, где relop может
быть:
>
,
<
,
>=
,
<=
,
=
,
!=
,
а expr — арифметическое выражение
составленное из целых чисел (стандартный синтаксис языка
C) и бинарных операторов:
+
,
-
,
*
,
/
,
&
,
|
,
<<
,
>>
,
а так же оператора длины и специальных операторов
доступа к данным пакета. Замечание: все сравнения
беззнаковые, т.е. 0x80000000 и 0xffffffff больше нуля.
Для доступа к данным пакета используйте следующий
синтаксис: proto [ expr : size ]
,
proto
может быть:
ether
,
fddi
,
tr
,
wlan
,
ppp
,
slip
,
link
,
ip
,
arp
,
rarp
,
tcp
,
udp
,
icmp
,
ip6
,
radio
и определяет уровень протокола, для операции взятия
индекса. (ether, fddi, wlan, tr, ppp, slip и link
ссылаются на канальный уровень, radio ссылается на radio
header добавляемый в некоторые пакеты 802.11).
Замечание: tcp, udp и другие протоколы верхнего уровня
применимы пока только к IPv4, но не к IPv6, что должно
быть исправлено в будущем.
expr — означает смещение в байтах для протокола данного уровня. size необязательная величина, означает количество захватываемых байт. По умолчанию size равен единице, можно подставить два три или четыре. Оператор len возвращает длину пакета в байтах.
Для понимания приведённых ниже примеров объясним, что делает бинарный оператор &. & — это оператор бинарного сложения. Пусть надо сложить бинарно числа 11 и 13. Для этого мы запишем их в бинарном виде, и сложим побитово. При этом сумма есть результат логической операции, в которой 0 это ложь, а 1 — истина. Т.е. 0+0=0, 0+1=1+0=0, 1+1=1.
13= | 1101 | |
11= | 1011 | |
1001 | =9 |
Таким образом, 11&13=9.
Примеры: выражение ether[0] & 1
!= 0
захватывает весь мультикастный трафик (для
него есть так же примитив multicast, см выше).
Пояснение:
здесь проверяется на чётность первый байт заголовка
канального уровня. При этом заголовок канального уровня
начинается с 6 байт канального адреса назначения. Таким
образом, данное условие выясняет равен ли единице
восьмой бит 48-битного MAC адреса.
Выражение ip[0] & 0xf !=
5
захватывает все пакеты IPv4 с опциями.
Пояснение:
здесь берётся первый байт пакета IPv4 и складывается с
числом 0xf (в десятичной системе 15, в двоичной 1111).
Если в результате сложения получится число 5 (101), то
значит первый байт был xxxx1010 т.е. вторая половина
первого байта была равна 5. А как мы видели в листинге
выше, вторая
половина первого байта отвечает за длину IPv4 заголовка
в 32-х разрядных словах. Если длина заголовка 5
32-битных слов, то значит никаких дополнительных опций в
нём нет, так как это наименьшая возможная длина
заголовка IP. А если результат операции не равен 5, то
значит он больше пяти и в нём есть какие-то
дополнительные опции.
Выражение ip[6:2] & 0x1fff =
0
соответствует нефрагментированным пакетам
IPv4, либо нулевому фрагменту фрагментированного пакета.
Пояснение:
здесь берётся два байта пакета IPv4: седьмой и восьмой
(отсчёт идёт с нуля, таким образом, ip[6]
это седьмой байт) и
складываются с числом 0x1fff (1111111111111), таким
образом из них «вырезаются» последние 13 бит,
отвечающие за номер фрагмента.
Некоторые «смещения» предопределены и имеют
названия. например:
icmptype
,
icmpcode
,
tcpflags
.
Так же предопределены и значения:
icmp-echoreply
,
icmp-unreach
,
icmp-sourcequench
,
icmp-redirect
,
icmp-echo
,
icmp-routeradvert
,
icmp-routersolicit
,
icmp-timxceed
,
icmp-paramprob
,
icmp-tstamp
,
icmp-tstampreply
,
icmp-ireq
,
icmp-ireqreply
,
icmp-maskreq
,
icmp-maskreqreply
,
а так же для флагов TCP:
tcp-fin
,
tcp-syn
,
tcp-rst
,
tcp-push
,
tcp-ack
,
tcp-urg
.
Примитивы могут объединяться при помощи следующих операторов:
Кроме того, для указания приоритета можно использовать круглые скобки.
Если идентификатор отсутствует, подразумевается последний
использованный. Так not host vs and
ace
эквивалентно not host vs and
host ace
.
Все пакеты относящиеся к трафику с машиной sundown:
#
tcpdump host sundown
Трафик между машиной helios и машинами hot или ace:
#
tcpdump host helios and \( hot or ace \)
Все пакеты IP идущие между ace и любым хостом кроме helios:
#
tcpdump ip host ace and not helios
Весь ftp трафик идущий через шлюз snup:
#
tcpdump 'gateway snup and (port ftp or ftp-data)'
Весь трафик, который не направлен в нашу локальную сеть и не выходит из неё, (т.е. транзитный трафик).
#
tcpdump ip and not net localnet
Начальные и конечные пакеты TCP (т.е. пакеты с флагами SYN и FIN) соединений вызванных не нашими машинами:
#
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'
Все IPv4 пакеты протокола HTTP направленные на 80 порт или с 80-го порта. Причём только пакеты содержащие данные, не захватывая пакеты SYN, FIN или пакеты в которых есть только флаг ACK. (Такое выражение поможет перехватить веб трафик).
#
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
Пояснение:
Бинарные операторы <<
и >>
— это операторы
сдвига.
Пример в двоичной системе | То же в десятичной системе |
---|---|
1010>>1=0101 | 10>>1=5 |
1010>>2=0010 | 10>>2=2 |
1011<<3=1011000 | 11<<3=88 |
ip[2:2] это третий и четвёртый байт заголовка IP, т.е. длина всего пакета в байтах.
Далее, выражение ip[0]&0xf берёт первый байт заголовка IP и вырезает из него последние 4 бита (т.к. 0xf=00001111), в этих битах содержится длина заголовка IP. Полученную величину сдвигают влево на два бита, так, как длина заголовка IP задаётся в 32-битных словах, а не в байтах. Таким образом длина заголовка IP переведена в байты.
Наконец, tcp[12] берёт 13-й байт заголовка TCP. Первые его 4 бита соответствуют длине заголовка. Их вырезают выражением tcp[12]&0xf0 (т.к. 0xf0=1111000). Полученное выражение сдвигают вправо на два бита и получается длина заголовка TCP в байтах.
Из длины пакета вычитают длину заголовка IP и длину заголовка TCP, таким образом в этом правиле осуществляется проверка на то, является ли пакет пустым. А по флагам никаких проверок то и нет!
Следующее выражение соответствует пакетам длиннее 576 байт посылаемым через шлюз snup:
#
tcpdump 'gateway snup and ip[2:2] > 576'
Следующий пример: выражение соответствует пакетам посылаемым на широковещательный или мультикастный IP, но не рассылаемым через широковещательный или мультикастный Ethernet адрес:
#
tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
Здесь выражение ether[0]&1 вычисляет равен ли нулю восьмой бит MAC адреса назначения (что означает, что адрес не широковещательный и не мультикастный). А выражение ip[16] оперирует с первым байтом адреса назначения.
Следующий пример: выражение соответствует пакетам ICMP если это не «пинги», т.е. не echo-request и не echo-reply:
#
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'#
tcpdump 'icmp[0] != 8 and icmp[0] != 0'
Приведённые команды эквивалентны.
Описание работы wireshark(1) выходит за рамки данного труда, однако не упомянуть о них в связи с tcpdump(1) невозможно. wireshark — графический анализатор протоколов. С его помощью удобно разбирать сделанные при помощи tcpdump(1) и других анализаторов файлы, кроме того она сама позволяет прослушивать сеть и делать dump'ы в формате программы tcpdump(1).
У программы wireshark(1) несколько имён:
Пока данный раздел не написан я просто приведу скриншот
программы wireshark(1), в которой открыт файл
pflog
— журнальный файл
пакетного фильтра OpenBSD. (См. Приложение C, Пакетный фильтр OpenBSD — pf(4)). Дополнительную информацию об
wireshark вы можете найти в работе Николая
Малых: [url://Malyh-ethereal-2005].
Существует не мало разнообразных анализаторов, которые выводят
разнообразную статистику из файлов в формате libpcap (формат
программы tcpdump(1)). Для примера приведу
программу tcpdstat. Программа устанавливается
из порта net/tcpdstat
.
Вот пример отчёта, который генерирует данная программа:
#
tcpdump -i rl1 -w dump tcpdump: listening on rl1, link-type EN10MB (Ethernet), capture size 96 bytes ^C1458 packets captured 1461 packets received by filter 0 packets dropped by kernel$
tcpdstat dump DumpFile: dump FileSize: 0.14MB Id: 200705030906 StartTime: Thu May 3 09:06:47 2007 EndTime: Thu May 3 09:16:03 2007 TotalTime: 555.58 seconds TotalCapSize: 0.12MB CapLen: 96 bytes # of packets: 1458 (364.58KB) AvgRate: 16.17Kbps stddev:52.23K ### IP flow (unique src/dst pair) Information ### # of flows: 72 (avg. 20.25 pkts/flow) Top 10 big flow size (bytes/total in %): 38.8% 20.5% 19.1% 5.7% 4.5% 2.1% 1.6% 0.8% 0.4% 0.4% ### IP address Information ### # of IPv4 addresses: 38 Top 10 bandwidth usage (bytes/total in %): 100.0% 41.1% 24.9% 20.6% 4.6% 2.4% 0.6% 0.6% 0.4% 0.4% ### Packet Size Distribution (including MAC headers) ### <<<< [ 32- 63]: 143 [ 64- 127]: 681 [ 128- 255]: 149 [ 256- 511]: 344 [ 512- 1023]: 41 [ 1024- 2047]: 100 >>>> ### Protocol Breakdown ### <<<< protocol packets bytes bytes/pkt ------------------------------------------------------------------------ [0] total 1458 (100.00%) 373331 (100.00%) 256.06 [1] ip 1430 ( 98.08%) 371651 ( 99.55%) 259.90 [2] tcp 742 ( 50.89%) 252248 ( 67.57%) 339.96 [3] http(s) 133 ( 9.12%) 151371 ( 40.55%) 1138.13 [3] http(c) 123 ( 8.44%) 11761 ( 3.15%) 95.62 [3] ssh 486 ( 33.33%) 89116 ( 23.87%) 183.37 [2] udp 140 ( 9.60%) 19795 ( 5.30%) 141.39 [3] dns 140 ( 9.60%) 19795 ( 5.30%) 141.39 [2] icmp 306 ( 20.99%) 23212 ( 6.22%) 75.86 [2] other 242 ( 16.60%) 76396 ( 20.46%) 315.69 >>>>
Другая удобная утилита предназначенная для анализа сетевого
трафика и дампов в формате libpcap — ngrep
. Эта программа (устанавливается из
порта net/ngrep
) позволяет искать пакеты,
содержимое которых соответствует заданному шаблону:
#
ngrep -d rl0 -i password port 23
interface: rl0 (172.19.0.0/255.255.255.0)
filter: (ip) and ( port 23 )
match: password
############################################
T 192.168.0.1:23 -> 172.19.0.33:38250 [AP]
Password:
##################exit
62 received, 0 dropped
В приведённом примере прослушивался интерфейс rl0
. При этом в пакетах разыскивался
шаблон password
без учёта регистра
(опция -i
). Выражение port 23
это фильтр (синтаксис такой же
как у tcpdump(1)). Пакеты в которых указанный
шаблон не найден обозначаются в отчёте решётками. Для пакетов в
которых шаблон найден выводится информация о пакете и найденная
строка.
Шаблоны являются регулярными выражениями и пишутся в формате egrep(1). (см. Раздел 7.14, «Применение регулярных выражений»)