Урок 2. Методы работы с трафиком. Проблемы сети. Диагностика #2

Open
alexander wants to merge 1 commits from lesson_02 into master
3 changed files with 136 additions and 0 deletions

46
lesson_02/README.md Normal file
View File

@ -0,0 +1,46 @@
# simple sniffer
Для запуска:
```sh
./lesson_2 <IP-address>
```
Результат:
```sh
./lesson_2 192.168.0.103
Информация о сетевом интерфейсе:
Интерфейс: wlp3s0
Описание:
MAC адрес: 64:6e:69:d4:ea:f5
Шлюз: 192.168.0.254
DNS сервер: 192.168.0.254
Тип слоя: Ethernet; Общие данные: 90 [байт]; Данные слоя: 14 [байт]; Полезная нагрузка слоя: 76 [байт]
Тип слоя: IPv4; Общие данные: 76 [байт]; Данные слоя: 20 [байт]; Полезная нагрузка слоя: 56 [байт]
Тип слоя: TCP; Общие данные: 56 [байт]; Данные слоя: 32 [байт]; Полезная нагрузка слоя: 24 [байт]
Тип слоя: Unknown; Общие данные: 24 [байт]; Данные слоя: 24 [байт]; Полезная нагрузка слоя: 0 [байт]
IP-адрес источника: 192.168.0.103
IP-адрес назначения: 184.104.202.139
IP ID: 12940
TTL: 64
Тип слоя: Ethernet; Общие данные: 66 [байт]; Данные слоя: 14 [байт]; Полезная нагрузка слоя: 52 [байт]
Тип слоя: IPv4; Общие данные: 52 [байт]; Данные слоя: 20 [байт]; Полезная нагрузка слоя: 32 [байт]
Тип слоя: TCP; Общие данные: 32 [байт]; Данные слоя: 32 [байт]; Полезная нагрузка слоя: 0 [байт]
IP-адрес источника: 192.168.0.103
IP-адрес назначения: 184.104.202.139
IP ID: 12941
TTL: 64
Тип слоя: Ethernet; Общие данные: 54 [байт]; Данные слоя: 14 [байт]; Полезная нагрузка слоя: 40 [байт]
Тип слоя: IPv4; Общие данные: 40 [байт]; Данные слоя: 20 [байт]; Полезная нагрузка слоя: 20 [байт]
Тип слоя: TCP; Общие данные: 20 [байт]; Данные слоя: 20 [байт]; Полезная нагрузка слоя: 0 [байт]
IP-адрес источника: 184.104.202.139
IP-адрес назначения: 192.168.0.103
IP ID: 0
TTL: 57
...
```

90
lesson_02/main.cpp Normal file
View File

@ -0,0 +1,90 @@
#include <iostream>
#include <iomanip>
#include <PcapLiveDeviceList.h>
#include <unistd.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <IPv4Layer.h>
std::string getProtocolTypeAsString(pcpp::ProtocolType protocolType)
{
switch (protocolType)
{
case pcpp::Ethernet:
return "Ethernet";
case pcpp::IPv4:
return "IPv4";
case pcpp::TCP:
return "TCP";
case pcpp::HTTPRequest:
case pcpp::HTTPResponse:
return "HTTP";
default:
return "Unknown";
}
}
static bool onPacketArrivesBlockingMode(pcpp::RawPacket *packet, pcpp::PcapLiveDevice *dev, void *cookie)
{
pcpp::Packet parsedPacket(packet);
for (pcpp::Layer *curLayer = parsedPacket.getFirstLayer(); curLayer != NULL; curLayer = curLayer->getNextLayer())
{
std::cout << "Тип слоя: " << getProtocolTypeAsString(curLayer->getProtocol()).c_str()
<< "; Общие данные: " << (int) curLayer->getDataLen()
<< " [байт]; Данные слоя: " << (int) curLayer->getHeaderLen()
<< " [байт]; Полезная нагрузка слоя: " << (int) curLayer->getLayerPayloadSize()
<< " [байт]" << std::endl;
}
pcpp::IPv4Layer *ipLayer = parsedPacket.getLayerOfType<pcpp::IPv4Layer>();
if (ipLayer == nullptr)
{
std::cerr << "Что-то пошло не так, не удалось найти уровень IPv4" << std::endl;
exit(4);
}
std::cout << "\tIP-адрес источника: " << ipLayer->getSrcIPv4Address().toString() << std::endl
<< "\tIP-адрес назначения: " << ipLayer->getDstIPv4Address().toString() << std::endl
<< "\tIP ID: " << ntohs(ipLayer->getIPv4Header()->ipId) << std::endl
<< "\tTTL: " << static_cast<int>(ipLayer->getIPv4Header()->timeToLive) << std::endl << std::endl;
return false;
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
std::cerr << "Необходимо указать IP адрес в качестве аргумента" << std::endl;
exit(1);
}
std::string interfaceIPAddr = argv[1];
pcpp::PcapLiveDevice *dev = pcpp::PcapLiveDeviceList::getInstance().getPcapLiveDeviceByIp(interfaceIPAddr.c_str());
if (dev == nullptr)
{
std::cerr << "Не удается найти интерфейс с IPv4-адресом " << interfaceIPAddr.c_str() << std::endl;
exit(2);
}
std::cout << "Информация о сетевом интерфейсе: " << std::endl
<< "\tИнтерфейс: " << dev->getName() << std::endl
<< "\tОписание: " << dev->getDesc() << std::endl
<< "\tMAC адрес: " << dev->getMacAddress().toString() << std::endl
<< "\tШлюз: " << dev->getDefaultGateway().toString() << std::endl;
if (dev->getDnsServers().size() > 0)
std::cout << "\tDNS сервер: " << dev->getDnsServers().at(0).toString() << std::endl;
std::cout << std::endl;
if (!dev->open())
{
std::cerr << "Не удается открыть устройство" << std::endl;
exit(3);
}
dev->startCaptureBlockingMode(onPacketArrivesBlockingMode, nullptr, 0);
return 0;
}

BIN
lesson_02/test.pcap Normal file

Binary file not shown.