Мониторинг сети с помощью tcpdump
Довольно часто встает проблема, когда ему нужно узнать как работает сеть. Или просто для учебных-исследовательских целей узнать как взаимодействуют между собой объекты сети. Для этих целей в UNIX-мире написано целая куча инструментов. В данном материале будет рассматриваться TCPDUMP
посмотреть трафик на интерфейсе:
tcpdump -i fxp1
посмотреть трафик одного хоста:
tcpdump host 1.2.3.4
посмотреть трафик на порте:
tcpdump src port 80
посмотреть IP трафик на хост:
tcpdump ip host 1.2.3.4
посмотреть ARP трафик на хост:
tcpdump arp host 1.2.3.4
посмотреть RARP трафик на хост:
tcpdump rarp host 1.2.3.4
посмотреть трафик, кроме хоста unixserver:
tcpdump not host unixserver
посмотреть трафик на server1 и server2
tcpdump host server1 or host server2
посмотреть содержимое пакетов на интерфейсе tun0 на хост ya.ru
tcpdump -X -i tun0 host ya.ru
подсмотреть номера и пароли к icq
tcpdump -X -i fxp1 port aol
посмотреть содержимое пакетов на интерфейсе tun0 на хост ya.ru, при этом прочитать из каждого пакета по 1500 байт и не преобразовывать IP в имя хоста
tcpdump -X -s 1500 -n -i tun0 host ya.ru
Довольно часто встает проблема, когда ему нужно узнать как работает сеть. Или просто для учебных-исследовательских целей узнать как взаимодействуют между собой объекты сети. Для этих целей в UNIX-мире написано целая куча инструментов. В данном материале будет рассматриваться TCPDUMP
посмотреть трафик на интерфейсе:
tcpdump -i fxp1
посмотреть трафик одного хоста:
tcpdump host 1.2.3.4
посмотреть трафик на порте:
tcpdump src port 80
посмотреть IP трафик на хост:
tcpdump ip host 1.2.3.4
посмотреть ARP трафик на хост:
tcpdump arp host 1.2.3.4
посмотреть RARP трафик на хост:
tcpdump rarp host 1.2.3.4
посмотреть трафик, кроме хоста unixserver:
tcpdump not host unixserver
посмотреть трафик на server1 и server2
tcpdump host server1 or host server2
посмотреть содержимое пакетов на интерфейсе tun0 на хост ya.ru
tcpdump -X -i tun0 host ya.ru
подсмотреть номера и пароли к icq
tcpdump -X -i fxp1 port aol
посмотреть содержимое пакетов на интерфейсе tun0 на хост ya.ru, при этом прочитать из каждого пакета по 1500 байт и не преобразовывать IP в имя хоста
tcpdump -X -s 1500 -n -i tun0 host ya.ru
Одной из самых распространенных программ для перехвата и анализа
сетевого трафика является tcpdump [1]. Приведем примеры ее применения.
1. Опции захвата трафика.
В простейшем случае достаточно указать интерфейс для анализа трафика:
Можно отключить преобразования IP адресов в доменные имена:
Ограничение числа перехватываемых пакетов:
Запись в файл:
Чтение из файла:
Отметим, что для воспроизведения записанного файла в сеть можно использовать отдельную утилиту tcpreplay (не входящую в комплект tcpdump):
Вывод данных канального уровня (например, mac адреса и прочее):
Вывод дополнительной информации (например, TTL, опции IP):
Увеличение размера захватываемых пакетов (больше 68 байт по умолчанию):
2. Опции фильтрации трафика.
Можно осуществлять фильтрацию на канальном уровне. Для выделения Ethernet фреймов используются следующие конструкции:
Примеры:
Просмотр фреймов 802.1Q можно осуществить следующими способами (на интерфейсе с виланами):
Примеры:
Фильтрация по IP протоколу:
Примеры:
Фильтрация по IP адресам:
Примеры:
Фильтрация по размеру пакетов:
Существуют расширенные возможности по фильтрации пакетов TCP с флагами. Заголовок TCP пакета состоит из 20 октетов. Поле битов управления (флагов) TCP содержится в октете номер 13. Соответственно под флаги отводятся следующие битовые позиции в 13 байте (по возрастанию степени 2): FIN (1), SYN(2), RST(4), PSH(8), ACK(16), URG(32), ECE(64), CWR(128).
Таким образом, например, для пакетов только с флагом SYN октет номер 13 заголовка TCP должен содержать значение 2. И соответствующий фильтр будет выглядеть так:
Для перехвата пакетов только с флагами SYN и ACK (значения битовых позиций 2 и 16) можно использовать следующую конструкцию:
Кроме того, можно использовать опцию tcpflags.
Пакеты с любым флагом:
Пакеты, включающие SYN:
Для того, чтобы анализировать передаваемые данные по протоколу TCP, можно использовать tcpflow:
3. Полезные рецепты.
Получение рейтинга наиболее активных участников сетевого взаимодействия (top talkers):
Выявление аномалий TCP путем вычисления отношения числа исходящих пакетов с SYN флагом к числу входящих с SYN+ACK:
Защита от DDoS с помощью утилиты tcpdump
tcpdump — это мощнейшая утилита UNIX, позволяющая перехватывать и анализировать сетевой трафик, проходящий через сетевые интерфейсы. Об установке читайте в документации утилиты или на сайте разработчика, в FreeBSD она есть в портах, в Debian Linux в репозиториях.
Приведу пример как можно использовать tcpdump. Например, на сервере отключены логи, идет легкая ddos атака, происходит что-то не ладное, вы хотите быстро посмотреть масштабность или убедиться, что это DDoS-атака, а не DoS или может это вообще никак не связано с внешним миром? Давайте посмотрим:
Глазами все не уследить, при атаке на веб-сервер вывод tcpdump-a сумасшедшей скоростью будет двигаться вдоль окна вывода терминала Поэтому, мы сначала запишем вывод tcpdump-a в файл. пакетов 200-300 хватит.
-n преобразуем имена хостов в IP адреса
-w записываем анализ трафика в файл
-c количество захваченных пакетов
Приступим к анализу полученных данных через tcpdump, отпарсим лог следующей командой:
Если список очень длинный можно ограничить его указав нужное количество выводимых строк
Вывод парсинга можно перенаправить в файл, а затем простым bash-скриптом, заблокировать все IP со списка.
Also of note with the '&&' operator—those of you who are familiar with programming will know this—but it could be repeated. The '&&' will return both conditions in the statement, and not one or the other as is sometimes thought. And yes, you need both of the ampersands.
1. Опции захвата трафика.
В простейшем случае достаточно указать интерфейс для анализа трафика:
tcpdump –i INTERFACE
Можно отключить преобразования IP адресов в доменные имена:
tcpdump -n
Ограничение числа перехватываемых пакетов:
tcpdump –c PACKET_COUNT
Запись в файл:
tcpdump -w FILE_NAME
Чтение из файла:
tcpdump -r FILE_NAME
Отметим, что для воспроизведения записанного файла в сеть можно использовать отдельную утилиту tcpreplay (не входящую в комплект tcpdump):
tcpreplay FILE_NAME
Вывод данных канального уровня (например, mac адреса и прочее):
tcpdump -e
Вывод дополнительной информации (например, TTL, опции IP):
tcpdump -v
Увеличение размера захватываемых пакетов (больше 68 байт по умолчанию):
tcpdump -s SNAP_LEN
2. Опции фильтрации трафика.
Можно осуществлять фильтрацию на канальном уровне. Для выделения Ethernet фреймов используются следующие конструкции:
tcpdump ether { src | dst | host } MAC_ADDRESS
tcpdump ether { broadcast | multicast }
Примеры:
# tcpdump -n -i vlan0 ether src 0:2:b3:d8:d8:2c
# tcpdump -n -e -i vlan0 ether broadcast
Просмотр фреймов 802.1Q можно осуществить следующими способами (на интерфейсе с виланами):
tcpdump –i INTERFACE vlan
Примеры:
# tcpdump -n -e -i fxp0 vlan
# tcpdump -n -e -i fxp0 vlan 100
# tcpdump -n -e -i fxp0 ether proto 0x8100
Фильтрация по IP протоколу:
tcpdump { arp | rarp | ip | tcp | udp | icmp | wlan | multicast | broadcast }
Примеры:
# tcpdump -n -i fxp0 ip
# tcpdump -n -i fxp0 tcp
# tcpdump -n -i fxp0 udp
Фильтрация по IP адресам:
tcpdump { src | dst } { net | host | port }
Примеры:
# tcpdump -n -i fxp0 src 195.12.66.1
# tcpdump -n -i fxp0 dst 195.12.66.65
# tcpdump -n -i fxp0 host 195.12.66.1
# tcpdump -n -i fxp0 port 25
# tcpdump -n -i fxp0 dst 195.12.66.1 and port 53
Фильтрация по размеру пакетов:
tcpdump { less | greater } PACKET_SIZE
Существуют расширенные возможности по фильтрации пакетов TCP с флагами. Заголовок TCP пакета состоит из 20 октетов. Поле битов управления (флагов) TCP содержится в октете номер 13. Соответственно под флаги отводятся следующие битовые позиции в 13 байте (по возрастанию степени 2): FIN (1), SYN(2), RST(4), PSH(8), ACK(16), URG(32), ECE(64), CWR(128).
Таким образом, например, для пакетов только с флагом SYN октет номер 13 заголовка TCP должен содержать значение 2. И соответствующий фильтр будет выглядеть так:
# tcpdump -n -i em0 'tcp[13] == 2'
Для перехвата пакетов только с флагами SYN и ACK (значения битовых позиций 2 и 16) можно использовать следующую конструкцию:
# tcpdump -n -i em0 'tcp[13] == 18'
Кроме того, можно использовать опцию tcpflags.
Пакеты с любым флагом:
# tcpdump -n -i em0 'tcp[tcpflags] != 0'
Пакеты, включающие SYN:
# tcpdump -n -i em0 'tcp[tcpflags] & tcp-syn != 0'
Для того, чтобы анализировать передаваемые данные по протоколу TCP, можно использовать tcpflow:
# tcpflow -c -i ep0 host 195.12.69.199 and port 80
3. Полезные рецепты.
Получение рейтинга наиболее активных участников сетевого взаимодействия (top talkers):
# tcpdump -tn -c 10000 -i fxp0 tcp or udp | awk -F "." '{print
$1"."$2"."$3"."$4}' | \ sort | uniq -c | sort -nr | awk '$1 > 100'
Выявление аномалий TCP путем вычисления отношения числа исходящих пакетов с SYN флагом к числу входящих с SYN+ACK:
SYN_ONLY_FROM_ISP=`tcpdump -n -l -r $1 'src net 192.168.0.0/24'
and \ 'dst net not 192.168.0.0/24' and 'tcp[13] == 2' | wc | awk
'{print $1}'`
SYN_ACK_TO_ISP=`tcpdump -n -l -r $1 'src net not
192.168.0.0/24' and \ 'dst net 192.168.0.0/24' and 'tcp[13] == 18' | wc |
awk '{print $1}'`
RATIO=$(echo "scale=3; $SYN_ACK_TO_ISP/$SYN_ONLY_FROM_ISP" | bc)
Защита от DDoS с помощью утилиты tcpdump
tcpdump — это мощнейшая утилита UNIX, позволяющая перехватывать и анализировать сетевой трафик, проходящий через сетевые интерфейсы. Об установке читайте в документации утилиты или на сайте разработчика, в FreeBSD она есть в портах, в Debian Linux в репозиториях.
Приведу пример как можно использовать tcpdump. Например, на сервере отключены логи, идет легкая ddos атака, происходит что-то не ладное, вы хотите быстро посмотреть масштабность или убедиться, что это DDoS-атака, а не DoS или может это вообще никак не связано с внешним миром? Давайте посмотрим:
tcpdump -v -i eth0 dst port 80После выше набранной команды вы сможете наблюдать список подключений к 80-у порту, чем больше повторных подключений с одинаковых хостов тем вероятнее мы столкнулись с DoS или DDoS атакой. Как вы уже наверное догадались, изменив порт можно проверить есть ли атака на FTP, SSH или другие сервисы которые крутятся на сервере. Добавив ключ -n имена хостов преобразуются в IP адреса.
Глазами все не уследить, при атаке на веб-сервер вывод tcpdump-a сумасшедшей скоростью будет двигаться вдоль окна вывода терминала Поэтому, мы сначала запишем вывод tcpdump-a в файл. пакетов 200-300 хватит.
tcpdump -v -n -w attack.log dst port 80 -c 250-v самый простой уровень логирования, без изысканности.
-n преобразуем имена хостов в IP адреса
-w записываем анализ трафика в файл
-c количество захваченных пакетов
Приступим к анализу полученных данных через tcpdump, отпарсим лог следующей командой:
tcpdump -nr attack.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rnРезультат будет — 2 столбца, в первом количество подключений, во втором IP. Чем больше подключений для одного IP тем вероятнее что это бот.
Если список очень длинный можно ограничить его указав нужное количество выводимых строк
tcpdump -nr attack.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn | head -20Что бы получить только IP адреса, без первого столбца, нужно убрать ключ -c после uniq
Вывод парсинга можно перенаправить в файл, а затем простым bash-скриптом, заблокировать все IP со списка.
#!/bin/bash BLOCKDB="ips.txt" IPS=$(grep -Ev "^#" $BLOCKDB) for i in $IPS do iptables -A INPUT -s $i -j DROPОчень похожие трюки иногда проделывают с помощью утилиты netstat.
ip.addr ==x.x.x.x
Sets a filter for any packet with x.x.x.x, as either the source or destination IP address. This is useful if you want to look for specific machines or networks. A good example would be some odd happenings in your server logs, now you want to check outgoing traffic and see if it matches. This is a great filter for that.ip.addr ==x.x.x.x && ip.addr ==x.x.x.x
Sets a conversation filter between the two IP addresses. This is useful to watch communication between two specific hosts or networks. Sometimes you only need specific data, so there is no need to bother sifting through the others.Also of note with the '&&' operator—those of you who are familiar with programming will know this—but it could be repeated. The '&&' will return both conditions in the statement, and not one or the other as is sometimes thought. And yes, you need both of the ampersands.