---
description: >-
  Данная утилита является полезным инструментом для перехвата и сбора пакетов,
  поступающих на сервер, а также исходящих от него.
---

# Работа с TCPDump

## Установка TCPDump

Для Ubuntu/Debian:

```
apt install tcpdump
```

Для **Red Hat** / **CentOS**:

```
sudo yum install tcpdump
```

## Аргументы для команды

{% hint style="info" %}
**-c** — завершает сбор пакетов после достижения установленного количества.

**-C** — позволяет установить максимальный размер файла дампа, после достижения которого будет создан новый файл.

**-e** — выводит информацию об уровне соединения для каждого обработанного пакета.

**-F** — вывод пакетов из заданного файла, а не интерфейса.

**-f** — отображает доменное имя для каждого IP-адреса.

**-G** — создает новый файл дампа через указанное время.

**-H** — создает ограничение, ввиду которого **TCPDump** будет обрабатывать только заголовки **802.11s**.

**-i** — имя интерфейса, с которого будут собираться пакеты. Для использования всех интерфейсов сервера укажите значение **any**.

**-I** — включает режим мониторинга для указанного интерфейса (для обнаружения всех проходящих пакетов).

**-E** — используется для расшифровки трафика **IPSEC** (необходимо указать ключ для расшифровки).

**-K** — отключает проверку контрольных сумм пакетов.

**-L** — вывод поддерживаемых протоколов подключения для указанного интерфейса.

**-n** — пропуск доменных имен в дампе.

**-nn** — вывод адресов вместе с их портами.

**-q** — минимализация выводимой информации о пакетах.

**-tttt** — отображает для каждого пакета временные метки в стандартном формате.

**-v, -vv, -vvv**  — более подробный вывод информации о пакетах.

**-Z** — пользователь системы, от имени которого будет создаваться файл дампа.

**-w** — имя файла, в который будет сохранен дамп (по умолчанию без этого аргумента дамп выводится в реальном времени без записи в файл).
{% endhint %}

## Использование

Чтобы не засорять наш дамп лишними пакетами, следует выбрать конкретный интерфейс, с которого мы хотим собрать информацию, а не все. Посмотреть список всех интерфейсов можно при помощи данной команды:

```
tcpdump -D
```

![](https://1206415929-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LXbCSSBR0J1rX84BjWO%2Fuploads%2FAGekMcjMSgDktv1qyE0q%2Fimage.png?alt=media\&token=e6a66a86-48d5-46bd-87f0-02f64bee6c7b)

{% hint style="info" %}
На наших **виртуальных серверах** (**VDS**) основным сетевым интерфейсом является **ens3**.
{% endhint %}

Для вывода логов нашего сетевого интерфейса в реальном времени используем команду:

```
tcpdump -i ens3
```

{% hint style="warning" %}
Не забывайте, что для **TCPDump** требуются права суперпользователя, поэтому данные команды следует выполнять от имени **root**, либо с использованием **sudo**.
{% endhint %}

После использования команды мы увидим множество бегущих строк, для остановки дампа используйте сочетание клавиш `Ctrl + C`

{% hint style="info" %}
Собранные пакеты данных имеют примерно такой вид:

`22:31:56.330185 IP fsn.spacecore.network.65383 > fsn.spacecore.network.ssh: Flags [P.], seq 7841:7905, ack 10730080, win 6145, length 64`



Но при использовании разных протоколов внутренности пакета могут отличаться.
{% endhint %}

Попробуем увидеть более подробную информацию о пакетах, используя аргумент `-v`

```
tcpdump -i ens3 -v
```

{% hint style="info" %}
Теперь наши пакеты имеют более массивную структуру типа:

`22:36:42.254306 IP (tos 0x0, ttl 122, id 61139, offset 0, flags [DF], proto TCP (6), length 104) fsn.spacecore.network.65383 > fsn.spacecore.network.ssh: Flags [P.], cksum 0x2699 (correct), seq 321:385, ack 1027616, win 6141, length 64`



В данном случае видна более подробная информация о протоколе IP-адреса(-ов):

P (tos 0x0, ttl 122, id 61139, offset 0, flags \[DF], proto TCP (6)
{% endhint %}

## Аргументы фильтрации

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

{% hint style="info" %}
**host** — имя хоста.

**ip** — IP-адрес.

**port** — порт.

**proto** — протокол.

**net** — адрес конкретной сети или подсети.

**src** — источник.

**dst** — получатель.



Доступные протоколы: **tcp**, **udp**, **icmp**, **arp**, **rarp**, **decnet** и т.д

Также эти аргументы можно комбинировать друг с другом.
{% endhint %}

Например, мы можем посмотреть все пакеты, которые исходят от нашего сервера к конечному адресу:

```
tcpdump dst 192.168.1.1
```

Или наоборот, все пакеты, которые исходят к нашему серверу из подсети-источника (можно также использовать конкретный **IP-адрес**, как в примере выше):

```
tcpdump src net 192.168.1.1/24
```

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

```
tcpdump less 48 // пакеты меньше 48 бит
tcpdump greater 128 // пакеты больше 128 бит
```

Допустим у Вас есть несколько серверов **Garry's Mod** на разных портах, и Вы хотите проверить, ведется ли на них **DDoS-атака** на текущий момент. Для этого нам подойдет команда:

```
tcpdump -nnv udp src portrange 27015-27025 -w garrysmod.dump
```

{% hint style="warning" %}
Обратите внимание на указываемый диапазон портов.



Благодаря аргументу **-w** дамп будет собран в файл **garrysmod.dump**
{% endhint %}

## Расширенные операторы

Помимо всего прочего, в **TCPDump** доступны операторы для создания различных комбинаций аргументов.

{% hint style="info" %}
**AND** или **&&** (оператор «**И**»)\


**OR** или **||** (оператор «**ИЛИ**»)\


**EXCEPT или !** (оператор «**КРОМЕ**»)
{% endhint %}

Допустим, мы хотим вывести весь трафик запросов **MySQL**, который отправляет 192.168.1.1 по порту 3306 (на любые адреса).

```
tcpdump -nnv src 192.168.1.1 and tcp dst port 3306
```

## Завершение

Спасибо за прочтение! Мы подробно ознакомились с совершенно полезным инструментом **TCPDump**, который является неотъемлемой частью работы сетевых инженеров, а также обязательно пригодится рядовым пользователям.



Для чтения пакетов на **Windows** Вы можете использовать программу [WireShark](https://www.wireshark.org/).
