# tcpdump

- [tcpdump](#tcpdump)
  - [Подробнее](#подробнее)
  - [Сохранить пакеты полностью в дамп для определённого узла](#сохранить-пакеты-полностью-в-дамп-для-определённого-узла)

_возможные сетевые интерфейсы для захвата_  
`sudo tcpdump -D`  

_указать конкретный интерфейс_  
`sudo tcpdump -i eth0`  

_больше информации в выводе_  
`sudo tcpdump -v -i eth0`  

host - _имя хоста;_  
ip - _ip адрес;_  
proto - _протокол;_  
net - _адрес сети или подсети;_  
port - _адрес порта;_  
src - _параметр, касающийся отправителя;_  
dst - _параметр, касающейся получателя;_  

`sudo tcpdump -i eth0 src host 192.168.1.2 and not port 22`  

`sudo tcpdump -v -n -A -e not port 22 and not port 123 and not stp`  

`sudo tcpdump -v -n -A -e -i eth0 src host 192.168.5.1 and tcp`  
v - _более подробный вывод_  
n - _не подменять значения на названия, например - указывать ff:ff:ff:ff:ff:ff вместо Broadcast_  
A - _выводить всё в ASCII_  
e - _выводить данные L2_  

## Подробнее

**Ключи**  
_Наиболее часто используемые ключи при запуске tcpdump приведены таблице_  
ключ        описание  

-a          _Преобразовывает сетевые и широковещательные адреса в доменные имена._  
-e          _Отображает данные канального уровня (MAC-адрес, протокол, длина пакета). Помимо IP-адресов будут отображаться MAC-адреса компьютеров._  
-F          _файл. Использовать фильтр, находящийся в файле. Если вы используете этот параметр, фильтр из командной строки будет игнорироваться._  
-i          _Указывает на то, какой сетевой интерфейс будет использоваться для захвата пакетов. По умолчанию — eth0, для выбора всех интерфейсов — any. Если отсутствует локальная сеть, то можно воспользоваться интерфейсом обратной связи lo._  
-l          _Использовать стандартный потоковый вывод tcpdump (stdout), например для записи в файл:  
`shell# tcpdump -l | tee out.log //отобразит работу tcpdump и сохранит результат в файле out.log`_  
-N          _Не добавляет доменное расширение к именам узлов. Например tcpdump отобразит `net` вместо `net.library.org`_
-n          _Отображает IP-адрес вместо имени хоста._  
-nn         _Отображает номер порта вместо используемого им протокола._  
-p          _Не переводит интерфейс в режим приема всех пакетов (promiscuous mode)._  
-q          _Выводит минимум информации. Обычно это имя протокола, откуда и куда шел пакет, порты и количество переданных данных._  
-r          _Этот параметр позволяет tcpdump прочесть трафик из файла, если он был предварительно сохранен параметром -w._  
-S          _Позволяет не обрабатывать абсолютные порядковые номера (initial sequence number — ISN) в относительные._  
-s          _число. Количество байтов пакета, которые будет обрабатывать tcpdump. При установке большого числа отображаемых байтов информация может не уместиться на экране и её будет трудно изучать. В зависимости от того, какие цели вы преследуете, и следует выбирать значение этого параметра. По умолчанию tcpdump захватывает первые 68 байт (для SunOS минимум 96 байт), однако если вы хотите увидеть содержимое всего пакета, используйте значение в 1514 байт (максимально допустимый размер кадра в сети Ethernet)._  
-t          _Не отображает метку времени в каждой строке._  
-T          _тип. Интерпретация пакетов заданного типа. Поддерживаются типы aodv, cnfp, rpc, rtp, rtcp, snmp, tftp, vat, wb._  
-tt         _Отображает неформатированную метку времени в каждой строке._  
-tttt       _Показывает время вместе с датой._  
-v          _Вывод подробной информации (TTL; ID; общая длина заголовка, а также его параметры; производит проверку контрольных сумм IP и ICMP-заголовков)_  
-vv         _Вывод ещё более полной информации, в основном касается NFS и SMB._  
-vvv        _Вывод максимально подробной информации._  
-w          _файл. Сохраняет данные tcpdump в двоичном формате. Преимущества использования данного способа по сравнению с обычным перенаправлением в файл является высокая скорость записи и возможность чтения подобных данных другими программами, например snort, но этот файл нельзя прочитать человеку. Возможен вывод двоичных данных на консоль, для этого необходимо использовать -w —_  
-x          _Делает распечатку пакета в шестнадцатеричной системе, полезно для более детального анализа пакета. Количество отображаемых данных зависит от параметра -s_  
-xx         _То же, что и предыдущий параметр -x, но включает в себя заголовок канального уровня_  
-X          _Выводит пакет в ASCII- и hex-формате. Полезно в случае анализа инцидента связанного со взломом, так как позволяет просмотреть какая текстовая информация передавалась во время соединения._  
-XX         _То же, что и предыдущий параметр -X, но включает заголовок канального уровня._  
-с          _число. tcpdump завершит работу после получения указанного числа пакетов._  
-U          _Собранные пакеты будут сразу складываться в файл, а иначе копиться в памяти до тех пор, пока она не закончится_  

**Фильтры tcpdump**  
Фильтры разделяются на следующие классификации  

Тип  
host — _адрес узла сети_  
port – _порт на котором нужно ловить пакеты_  
portrange – _диапазон портов_  
net – _сеть_  
_пример_  
```bash
tcpdump net 192.168.0.0/24
```
_захват всего трафика в котором в качестве источника или получателя стоят ip адреса из сети 192.168.0.0/24_  
```bash
tcpdump  port 80
```
_Будет захватываться весь трафик на 80-м порту._  
Направление трафика по отношению к объекту мониторинга  
src – _отправитель_  
dst — _получатель_  
_например команда_  
```bash
src host 172.31.25.200
```
_Захват трафика у которого отправитель ip адрес 172.31.25.200_  

Протокол  
ether – _базовая сетевая технология Ethernet, как правило указывает на то что в фильтре используется аппаратный MAC адрес_  
ip – _протокол IPv4_  
ip6 – _протокол IPv6_  
arp – _протокол ARP_  
tcp – _протокол TCP_  
udp – _протокол UDP_  
_Если протокол не указан, то будет захвачен трафик по всем протоколам_  
_Например команда_  
```bash
udp port 5060
```
_захват трафика по протоколу udp порт 5060_  

Составные фильтры  
_Для того что бы более гибко фильтровать трафик можно использовать логические операции_  
«И» – _and (&&)_  
«ИЛИ» – _or (||)_  
«НЕ» – _not (!) – инверсия значения_  

При этом приоритет этих операций следующий:  
наивысшим приоритетом обладает операция инверсии  
потом логическое «И»  
наименьшим приоритетом обладает операция «ИЛИ».  

Приоритет операций можно менять с помощью круглых скобок.  
`(net 172.16.0.0/24 or host 172.31.0.5) and tcp port 80`   
_захват трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5, как любому хосту по отдельности так и вместе_  
`(net 172.16.0.0/24 || host 172.31.0.5) && not tcp port 80`  
_захват любого трафика кроме трафика протокола TCP и использующего порт 80 принадлежащего сети 172.16.0.0/24 или хосту 172.31.0.5 как любому хосту по отдельности так и вместе_  

**Фильтры tcpdump со смещением, пример**  
Отфильтровать все UDP внутри GRE по смещению  
Отсчет ведется в байтах начиная от внешнего заголовка IP пакета, отсчет идет с 0, т.е. `ip[0]` это поле версии протокола, обычно это `0x45`  
```
sniff(offline="erspan.pcap", filter="ip[71] == 0x11")
```
71 - смещение  
0x11 - 17 в hex, т.е. UDP  
Смещение не обязательно считать от IP заголовка, можно и от других  

**tcpdump linux примеры**  
Запись вывода в файл  
```bash
$ sudo tcpdump -w sshtrace.tcpdump tcp port 22
```
_Файл sshtrace.tcpdump будет по-умолчанию создан в домашнем каталоге текущего пользователя. Для вывода информации из файла  myrouter.tcpdump следует использовать опцию -r:_  
```bash
$ tcpdump -r sshtrace.tcpdump
```
Снять весь трафик с интерфейса eth1
```bash
$ tcpdump –i eth1
```
Снять трафик с диапазона портов на интерфейсе eth1
```bash
$ tcpdump -i eth1 portrange 100-200
```
весь трафик, идущий к 172.16.0.1, который не является ICMP.
```bash
tcpdump dst 172.16.0.1 and not icmp
```
Ловим весь входящий трафик, исключая трафик генерируемый нашей SSH-сессией.
```bash
$ tcpdump -i eth0 -n -nn -ttt 'dst host 172.16.0.10 and not (src host 172.16.0.11 and dst port 22)'
```

***

## Сохранить пакеты полностью в дамп для определённого узла

```shell
tcpdump -i any host 193.232.121.109 -nnXSs 0 -w test.pcap
```
