Практикум по дисциплине Иммитационное моделирование систем обнаружения вторжений
.pdf
где «FirstScriptExample» - имя компонента для которого будет вестись логирование.
Далее необходимо объявить главную функцию с помощью выражения
int
main (int argc, char *argv[])
{
и добавить в данную функцию весь код, который будет отвечать за моделирование.
Следующая функция устанавливает временную шкалу, при которой одна секунда представлена одной наносекундой:
Time::SetResolution (Time::NS);
Чтобы добавить логирование для компонентов Echo клиента и сервера следует воспользоваться следующим кодом:
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
Перейдём непосредственно к созданию топологии в режиме точка-точка. Прежде всего нам необходимо создать узлы, которые будут осуществлять взаимодействие:
NodeContainer nodes; nodes.Create (2);
Далее с помощью помощника мы будем создавать связь между узлами в режиме точка-точка. Для начала следует задать параметры сети, такие как скорость передачи данных (5 Мбит в секунду) и задержку (2 мс):
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
Для завершения настройки устройств и каналов нам необходимо создать и сконфигурировать все сетевые карты, участвующие в передаче. Для этого воспользуемся помощником:
NetDeviceContainer devices;
devices = pointToPoint.Install (nodes);
На данный момент у нас есть узлы и настроенные устройства, но нет стека протоколов (TCP, UDP, IP и т. д.). Следующее две строки кода позаботятся о его создании:
11
InternetStackHelper stack; stack.Install (nodes);
Далее свяжем наши устройства с IP адресами. Для этого необходимо установить базовый IP-адрес и маску:
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
По умолчанию адреса будут выделяться по мере возрастания, то есть первый адрес будет 10.1.1.1, второй 10.1.1.2 и т.д.
Следующей строкой присвоим IP адреса нашим устройствам:
Ipv4InterfaceContainer interfaces = address.Assign (devices);
Для тестирования созданной топологии воспользуемся вспомогательными классами UdpEchoServerApplication и UdpEchoClientApplication (на уровне приложений), которые имитируют клиент серверное взаимодействие.
Займёмся настройкой серверного приложения. Первым делом установим необходимый порт:
UdpEchoServerHelper echoServer (9);
далее поставим в соответствие наше приложение первому узлу:
ApplicationContainer serverApps = echoServer.Install (nodes.Get (1));
и зададим интервал генерации трафика:
serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0));
Произведём настройку клиентского приложения:
UdpEchoClientHelper echoClient (interfaces.GetAddress (1), 9); echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
в данном случае выбирает второй сетевой интерфейс (индексация с 0) и присваивается порт 9, а также устанавливаются такие атрибуты, как максимальное количество пакетов, которые могут быть приняты во время моделирования, интервал ожидания между пакетами и максимальный размер пакета, который может быть принят.
После чего мы запускаем наше приложение в интервале от двух до десяти секунд:
12
ApplicationContainer clientApps = echoClient.Install (nodes.Get (0)); clientApps.Start (Seconds (2.0));
clientApps.Stop (Seconds (10.0));
На данном этапе все настройки завершены, и мы можем запустить моделирование. Для этого воспользуемся следующим кодом:
Simulator::Run ();
После этого NS-3 начнёт просматривать все запланированные события и инициировать их выполнение.
Когда процесс модерирования будет завершён, необходимо выполнить очистку всех объектов из памяти с помощью функции:
Simulator::Destroy ();
После чего завершите главную функцию возвратом кода 0, который сообщает об успешном выполнении функции:
return 0;
}
Топология типа «шина»
Рассмотрим работу скрипта second.cc [2], который представляет собой имитацию работы сети по топологии типа «шина», которая выглядит следующим образом:
//10.1.1.0
// n0 |
-------------- n1 |
n2 |
n3 |
n4 |
// |
точка - точка | |
| |
| |
| |
// |
================ |
|||
// |
|
LAN 10.1.2.0 |
|
|
|
|
|
|
|
Вышеуказанный скрипт начинается со следующих строк:
bool verbose = true; uint32_t nCsma = 3;
CommandLine cmd;
cmd.AddValue ("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
cmd.AddValue ("verbose", "Tell echo applications to log if true", verbose);
cmd.Parse (argc, argv);
if (verbose)
13
{
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
}
nCsma = nCsma == 0 ? 1 : nCsma;
Это особый механизм NS-3, который позволяет передавать пользовательские значения из командной строки во время запуска. В код было добавлено две переменных: nCsma и verbose. Чтобы задать собственные значения этим переменным, передайте необходимые параметры следующим образом:
./waf --run "second --nCsma=4"
Параметр nCsma отвечает за количество узлов, а параметр verbose позволяет включить логирование (в команде выше логирование не используется).
Последующие строки кода вам уже знакомы и в пояснении не нужнаются:
NodeContainer p2pNodes; p2pNodes.Create (2);
NodeContainer csmaNodes; csmaNodes.Add (p2pNodes.Get (1)); csmaNodes.Create (nCsma);
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
NetDeviceContainer p2pDevices;
p2pDevices = pointToPoint.Install (p2pNodes);
Для моделирования сетевых устройств и каналов NS-3 использует технологию CSMA (Carrier Sense Multiple Access - множественный доступ с прослушиванием несущей). Стоит отметить, что NS-3 CSMA сетевые устройства лишь частично соответствуют стандарту Ethernet, так как Ethernet
использует CSMA/CD (Carrier Sense Multiple Access with Collision Detection -
множественный доступ с прослушиванием несущей и обнаружением коллизий) – схему, в которой устройства получают отсрочку передачи во время борьбы за общую среду передачи.
Для работы с CSMA может быть использован CsmaHelper, который работает по тому же принципу, что и PointToPointHelper. Однако, обратите внимание на то, что CsmaHelper устанавливает атрибуты не для отдельных устройств, а для всего канала. Это обусловлено тем, что CSMA не позволяет использовать устройства, работающие по разным стандартам, например, 10BASE-T и
100Base-T.
14
CsmaHelper csma;
csma.SetChannelAttribute ("DataRate", StringValue ("100Mbps")); csma.SetChannelAttribute ("Delay", TimeValue (NanoSeconds (6560)));
NetDeviceContainer csmaDevices; csmaDevices = csma.Install (csmaNodes);
Все последующие строки кода вам также знакомы из первого скрипта:
InternetStackHelper stack; stack.Install (p2pNodes.Get (0)); stack.Install (csmaNodes);
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer p2pInterfaces; p2pInterfaces = address.Assign (p2pDevices);
address.SetBase ("10.1.2.0", "255.255.255.0"); Ipv4InterfaceContainer csmaInterfaces; csmaInterfaces = address.Assign (csmaDevices);
UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));
serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0));
UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
ApplicationContainer clientApps = echoClient.Install (p2pNodes.Get (0));
clientApps.Start (Seconds (2.0)); clientApps.Stop (Seconds (10.0));
Так как мы создали целую сеть, то нам необходима маршрутизация. Для упрощения этой задачи NS-3 поддерживает так называемую глобальную маршрутизацию, в которой каждый узел работает по протоколу OSPF (Open Shortest Path First) [3], который отслеживает состояние канала и находит кратчайший путь используя алгоритм Дейкстры.
Данный режим устанавливается всего одной строкой кода:
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
На следующем шаге мы включим режим сбора трафика в pcap файл:
15
pointToPoint.EnablePcapAll ("second"); csma.EnablePcap ("second", csmaDevices.Get (1), true);
Существует два режима сбора трафика. Первый режим создаёт трассировочный файл для каждого узла в сети, второй же использует «неразборчивый» (promiscuous) режим для сбора трафика. Это означает, что всего один узел в сети будет собирать весь трафик со всех узлов. В данном примере узлы в режиме «точка-точка» будут производить сбор трафика в отдельные файлы, а CSMA узел с индексом 1 работает в «неразборчивом» режиме.
Как и скрипт из первого примера, второй скрипт заканчивается запуском симулятора и уничтожением всех созданных объектов после симуляции:
Simulator::Run (); Simulator::Destroy (); return 0;
}
После того как вы запустите данный скрипт, вы должны увидеть три файла в папке верхнего уровня: second-0-0.pcap, second-1-0.pcap и second-2-0.pcap.
Имена файлов имеют следующий формат: <имя>-<узел>-<устройство>.pcap
Задание на практикум
1.Создайте топологию типа «точка-точка», изобразите её графическое представление
2.Установите echo server на одном из узлов на 14-ом порте.
3.Установите echo client на другом узле.
4.Передайте 8 сетевых пакетов между узлами.
5.Создайте топологию типа «шина», состоящую из 7 узлов. Изобразите её графическое представление
6.Установите echo server на одном из узлов на 14-ом порте.
7.Установить echo client на любых двух других узлах.
8.Передайте по 8 сетевых пакетов между каждым узлом и сервером.
9.Произведите запись сетевого трафика в pcap файл.
Содержание отчёта по практикуму
1.Титульный лист
2.Цель практикума и краткие теоретические сведения
3.Выполнение практикума в соответствии с заданием
4.Ответы на контрольные вопросы
16
Контрольные вопросы
1.Какое графическое представление имеет топология типа «точкаточка»? В чём заключаются достоинства и недостатки топологии типа «точка-точка»?
2.Что представляет собой топология типа «шина»? Расскажите о достоинствах и недостатках данной топологии.
3.Что такое CSMA?
4.Для чего необходимо производить вызов функции Simulator::Destroy?
5.Какие варианты сбора трафика существуют в NS-3?
Литература
1.first.cc File Reference // Интернет ресурс https://www.nsnam.org/doxygen/first_8cc_source.html (дата обращения: 05.11.2016)
2.second.cc File Reference // Интернет ресурс https://www.nsnam.org/doxygen/second_8cc_source.html (дата обращения: 05.11.2016)
3.J. Moy. OSPF Version 2, 1998 г. // Интернет ресурс http://www.ietf.org/rfc/rfc2328.txt (дата обращения: 05.11.2016)
Практикум №3
“Построение беспроводной топологии и топологии типа «звезда» в NS-3”
Цель практикума
Получить навыки построения беспроводной топологии и топологии типа «звезда» в сетевом симуляторе NS-3.
Краткие теоретические сведения
Беспроводная топология
Скрипт third.cc [1] представляет собой имитацию беспроводной топологии следующего вида:
// |
* |
* |
* |
* |
|
|
|
|
// |
| |
| |
| |
| |
10.1.1.0 |
|
|
|
// n5 |
n6 |
n7 |
n0 |
-------------- n1 |
n2 |
n3 |
n4 |
|
// |
|
|
|
|
точка-точка | |
| |
| |
| |
// |
|
|
|
|
================ |
|||
// |
|
|
|
|
|
LAN 10.1.2.0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
|
|
|
Первая часть скрипта, которая относится к построению данной части сети
//10.1.1.0
// n0 |
-------------- n1 |
n2 |
n3 |
n4 |
// |
точка -точка | |
| |
| |
| |
// |
================ |
|||
// |
|
LAN 10.1.2.0 |
|
|
не имеет существенных различий с уже рассмотренными топологиями и поэтому будет опущена.
Начнём наше рассмотрение с создания беспроводной части сети. Первым делом создадим необходимое количество узлов:
NodeContainer wifiStaNodes; wifiStaNodes.Create (nWifi);
NodeContainer wifiApNode = p2pNodes.Get (0);
Следующий фрагмент кода обеспечивает моделирование wi-fi устройств и канала связи между ними. Во-первых, нам необходимо настроить PHY уровень и канал связи:
YansWifiChannelHelper channel = YansWifiChannelHelper::Default (); YansWifiPhyHelper phy = YansWifiPhyHelper::Default (); phy.SetChannel (channel.Create ());
После того как уровень PHY настроен, перейдём к настройке уровня MAC. В данном примере используется non-QoS MAC, поэтому настройка выглядит следующим образом:
WifiHelper wifi = WifiHelper::Default (); wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
NqosWifiMacHelper mac = NqosWifiMacHelper::Default ();
Метод SetRemoteStationManager устанавливает тип алгоритма управления скоростью. В данном случае используется алгоритм AARF [2, 3].
Продолжим конфигурирование MAC. Следующие строки кода позволяют установить SSID:
Ssid ssid = Ssid ("ns-3-ssid"); mac.SetType ("ns3::StaWifiMac", "Ssid", SsidValue (ssid),
"ActiveProbing", BooleanValue (false));
Данный код создаёт сервис 802.11, устанавливает его тип равным «ns3 :: StaWifiMac» [4], SSID равным «ns-3-ssid» [5] и значение атрибута ActiveProbing (активировать зондирование) с типом «false».
18
Когда настройка PHY и MAC уровней завершены, мы можем создать сетевые wi-fi устройства с помощью уже знакомого нам кода:
NetDeviceContainer apDevices;
apDevices = wifi.Install (phy, mac, wifiApNode);
Чтобы добиться более реального поведения беспроводных устройств, необходимо добавить им какое-то перемещение в пространстве (за исключением точки доступа, которая должна оставаться неподвижной). Для этой цели воспользуемся классом MobilityHelper:
MobilityHelper mobility;
mobility.SetPositionAllocator ("ns3::GridPositionAllocator", "MinX", DoubleValue (0.0),
"MinY", DoubleValue (0.0),
"DeltaX", DoubleValue (5.0),
"DeltaY", DoubleValue (10.0),
"GridWidth", UintegerValue (3), "LayoutType", StringValue ("RowFirst"));
Данный код создаёт сетку в двумерном пространстве и задаёт начальное положение для узлов.
Далее воспользуемся классом RandomWalk2dMobilityModel, который задаёт случайное движение мобильных устройств со случайной скоростью в пределах установленной области:
mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel", "Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));
С помощью MobilityHelper мы устанавливаем созданную модель мобильности на наших беспроводных узлах:
mobility.Install (wifiStaNodes);
Чтобы наша точка доступа оставалась в постоянном положении, необходимо воспользоваться следующей конфигурацией:
mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (wifiApNode);
После того как все узлы, каналы и сетевые устройства настроены, пришло время настройки сетевых протоколов:
InternetStackHelper stack; stack.Install (csmaNodes); stack.Install (wifiApNode); stack.Install (wifiStaNodes);
19
и IP-адресов сетевых устройств:
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer p2pInterfaces; p2pInterfaces = address.Assign (p2pDevices);
address.SetBase ("10.1.2.0", "255.255.255.0"); Ipv4InterfaceContainer csmaInterfaces; csmaInterfaces = address.Assign (csmaDevices);
address.SetBase ("10.1.3.0", "255.255.255.0"); address.Assign (staDevices);
address.Assign (apDevices);
Следующая часть кода устанавливает echoServer на крайнем правом узле:
UdpEchoServerHelper echoServer (9);
ApplicationContainer serverApps = echoServer.Install (csmaNodes.Get (nCsma));
serverApps.Start (Seconds (1.0)); serverApps.Stop (Seconds (10.0));
и echoClient на последнем беспроводном узле:
UdpEchoClientHelper echoClient (csmaInterfaces.GetAddress (nCsma), 9);
echoClient.SetAttribute ("MaxPackets", UintegerValue (1)); echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
ApplicationContainer clientApps = echoClient.Install (wifiStaNodes.Get (nWifi - 1));
clientApps.Start (Seconds (2.0)); clientApps.Stop (Seconds (10.0));
Как и прежде нам необходимо настроить маршрутизацию в нашей сети:
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
В созданной нами сети есть одна особенность, которая отсутствовала в предыдущих примерах: имитация никогда не будет остановлена и будет выполняться бесконечно. Причиной такого поведения является созданная нами беспроводная точка доступа, которая будет генерировать маяки для беспроводных клиентов в бесконечном цикле. Чтобы избежать такого поведения, необходимо явным образом сообщить NS-3 об окончании имитации через заданный промежуток времени:
Simulator::Stop (Seconds (10.0));
20
