Poniżej znajduje się 10 zadań laboratoryjnych z zakresu skryptowania w MikroTik RouterOS. Każde zadanie jest zaprojektowane tak, aby zajmowało około 25-30 minut realizacji. Zadania obejmują tematy poznane na wykładzie, od podstaw tworzenia skryptów i zmiennych, przez instrukcje warunkowe i pętle, aż po zaawansowane przetwarzanie konfiguracji i automatyzację zadań z wykorzystaniem harmonogramu.
Napisz skrypt, który sprawdzi status wszystkich interfejsów sieciowych na routerze MikroTik i wygeneruje czytelny raport o ich stanie. Skrypt ma nauczyć Cię podstawowych konstrukcji programistycznych w RouterOS: deklarowania zmiennych, pętli foreach oraz instrukcji warunkowych if.
Jesteś administratorem sieci w firmie X. Codziennie rano musisz sprawdzać czy wszystkie interfejsy na routerze działają poprawnie. Masz do czynienia z routerem MikroTik CCR1009-7G-1C-1S+ obsługującym łącze internetowe 1Gbps oraz sieć lokalna dla 500 użytkowników. Twoim obowiązkiem jest codzienny obchód po urządzeniach sieciowych - skrypt znacznie ułatwi tę pracę. Napisz skrypt, który automatycznie przeskanuje wszystkie interfejsy sieciowe (ethernet, wlan, bridge), sprawdzi ich status (running/disabled), typ oraz adres IP jeśli jest przypisany. Skrypt powinien zapisać wynik do logów systemowych routera z informacją o każdym interfejsie. Na końcu skrypt powinien wyświetlić podsumowanie: ilu interfejsów jest aktywnych, ilu wyłączonych.
:local licznikAktywne 0 i :local licznikNieaktywne 0:foreach do iteracji po wszystkich interfejsach: :foreach iface in=[/interface find] do={ ... }:local nazwa [/interface get $iface name]:local status [/interface get $iface running]:local typ [/interface get $iface type]:if do sprawdzenia statusu i zwiększ odpowiedni licznik[/ip address find interface=$nazwa]:log info "Interfejs: $nazwa, Typ: $typ, Status: $status":put/log print)Stwórz skrypt, który automatycznie tworzy backup konfiguracji routera i zapisuje go do pliku z datą w nazwie. Celem zadania jest nauka operacji na plikach, pracy z datą systemową oraz automatyzacji często powtarzanych czynności administracyjnych w celach bezpieczeństwa.
Pracujesz jako administrator sieci w średniej wielkości firmie IT obsługującej 200 stacji roboczych. Twoja firma stosuje politykę bezpieczeństwa wymagającą codziennego tworzenia backupów konfiguracji wszystkich routerów przed wprowadzaniem jakichkolwiek zmian. Router MikroTik CCR1036-12G-2S+ obsługuje główne łącze internetowe oraz rozległą sieć korporacyjną z wieloma VLANami. Musisz codziennie tworzyć backup konfiguracji routera MikroTik przed wprowadzaniem zmian, aby w razie problemów móc szybko przywrócić działanie sieci. Napisz skrypt, który automatycznie wyeksportuje całą konfigurację routera do pliku z datą w nazwie (np. backup-2024-01-15.rsc). Skrypt powinien sprawdzić czy katalog na backup istnieje, a jeśli nie - utworzyć go. Przed utworzeniem nowego backupu skrypt powinien usunąć stare backupy starsze niż 7 dni, aby nie zapełniać pamięci routera. Skrypt powinien zapisać informację o utworzonym backupie do logów z informacją o rozmiarze pliku.
:local data [/system clock get date]:local backupDir "/backup":if ([:len [/file find where name=$backupDir]] = 0) do={...}:local fileName ("backup-" . $data . ".rsc")/export do eksportu konfiguracji: /export file=$backupDir/$fileName:local rozmiar [/file get [/file find name=$fileName] size]/file find where name~"backup-":foreach do przetwarzania starych backupów/file remove:log info "Utworzono backup: $fileName, rozmiar: $rozmiar"Napisz skrypt do automatycznego czyszczenia starych logów systemowych routera. Zadanie uczy pracy z logami systemowymi, filtrowania rekordów oraz zarządzania pamięcią routera poprzez regularne usuwanie przestarzałych danych zgodnie z polityką firmy.
Twoja firma ma politykę przechowywania logów tylko przez 7 dni ze względu na wymagania RODO oraz ograniczenia miejsca na dysku. Router MikroTik hAP ac lite obsługujący małe biuro z 50 pracownikami zaczyna mieć problem z pamięcią z powodu nagromadzonych logów systemowych - wolne miejsce na dysku spadło do krytycznego poziomu 15%. Twoim zadaniem jest napisanie skryptu, który automatycznie usunie logi starsze niż określona liczba dni (domyślnie 7). Skrypt powinien najpierw wyświetlić informację o aktualnej liczbie logów i dacie najstarszego logu. Następnie powinien usunąć stare logi i wyświetlić komunikat o wynikach operacji. Uruchom skrypt i sprawdź czy logi zostały usunięte.
:local data [/system clock get date]:local dniPrzechowywania 7:local ileLogow [:len [/log find]]:local najstarszy [/log find limit=1 order-by=time asc]:local czasNajstarszego [/log get $najstarszy time]/log find do znalezienia starych logów. Możesz określić czas graniczny porównując z czasem każdego logu, np. używając funkcji [:resolve] do konwersji dat lub porównując timestamy/log remove do usunięcia starych logów:log info "Usunięto X starych logów"Napisz skrypt, który wyświetli listę wszystkich użytkowników routera wraz z ich uprawnieniami i grupami. Zadanie uczy pracy z systemem użytkowników RouterOS, filtrowania i grupowania danych oraz przygotowuje do przeprowadzania audytów bezpieczeństwa w firmie.
Audyt bezpieczeństwa przeprowadzany przez zewnętrzną firmę wymaga od Ciebie sprawdzenia wszystkich kont użytkowników na routerze MikroTik RouterBOARD 2011UiAS-2HnD obsługującym sieć firmową. Musisz przygotować raport zawierający wszystkich użytkowników systemu, ich grupy (full, read, policy, ftp, api), informację o tym czy konto jest włączone (disabled) oraz datę ostatniego logowania. Skrypt powinien też pokazać liczbę użytkowników w każdej grupie i podsumowanie: ilu użytkowników jest aktywnych a ilu wyłączonych. Pamiętaj o przestrzeganiu zasady - hasła nigdy nie powinny być wyświetlane w logach!
/user print do pobrania listy użytkowników:foreach user in=[/user find] do={...}:local nazwa [/user get $user name]:local grupa [/user get $user group]:local status [/user get $user disabled]:if do zliczania aktywnych i wyłączonychStwórz skrypt, który monitoruje dostępność kluczowych hostów w sieci i zapisuje alert do logów gdy host przestanie odpowiadać. Zadanie uczy pracy z poleceniem ping, zmiennymi globalnymi do zapamiętywania stanu oraz reagowaniem na zdarzenia w sieci poprzez logowanie alertów.
Jako administrator sieci w firmie usługowej musisz monitorować dostępność kluczowych serwerów w infrastrukturze: bramy internetowej (router ISP), serwera DNS (8.8.8.8), serwera plików w biurze oraz wewnętrznego serwera ERP. Twoja firma korzysta z systemu monitoringu, który wymaga natychmiastowej reakcji na awarie. Napisz skrypt, który sprawdzi dostępność tych hostów (używając polecenia /ping), a gdy host nie odpowie po 4 próbach, zapisze alert do logów z informacją o niedostępnym hoście i czasie zdarzenia. Skrypt powinien też zapobiegawczo sprawdzić czy wcześniej dany host był dostępny (używając zmiennej globalnej do zapamiętania poprzedniego stanu), aby nie generować duplikujących się alertów.
:local hosty {"8.8.8.8", "1.1.1.1", "192.168.1.1"}:global poprzedniStan:foreach do iteracji po hostach/ping z liczbą prób i timeout:local odebrane [:len $wynik]:log warning dla alertówNapisz skrypt, który wyświetli i przeanalizuje reguły firewalla na routerze MikroTik. Zadanie uczy pracy z firewallem, filtrowania wyników oraz formatowania danych wyjściowych w czytelnym raporcie do analizy bezpieczeństwa.
Twoja firma wdrożyła nowe zasady bezpieczeństwa wynikające z normy ISO 27001 i musisz przeanalizować aktualne reguły firewalla na routerze MikroTik CCR1016-12G obsługującym dużą sieć korporacyjną z wieloma oddziałami. Router ma ponad 50 reguł firewall configure. Napisz skrypt, który wyświetli wszystkie reguły firewalla pogrupowane według łańcuchów (input, forward, output), dla każdej reguły pokaże: numer, łańcuch, źródłowy i docelowy adres IP, port, akcję (accept, drop, reject) i komentarz. Skrypt powinien też zliczyć reguły w każdym łańcuchu i wyświetlić podsumowanie. Na końcu skrypt powinien znaleźć i wyświetlić reguły z komentarzem zawierającym słowo "OLD" jako przestarzałe.
/ip firewall filter print do pobrania reguł:foreach regula in=[/ip firewall filter find] do={...}[/ip firewall filter get $regula nazwa parametru]:if do sprawdzenia łańcucha i zwiększania licznika[/ip firewall filter find comment~"OLD"]Napisz skrypt, który automatycznie skonfiguruje serwer DHCP dla określonej podsieci. Zadanie uczy pracy z argumentami skryptu, walidacji danych wejściowych oraz programowego tworzenia obiektów sieciowych w RouterOS.
Twoja firma tworzy nowy oddział biurowy na 30 stanowisk i potrzebujesz szybko skonfigurować nowy serwer DHCP dla nowej podsieci 192.168.50.0/24. Ręczna konfiguracja każdego serwera DHCP jest czasochłonna i podatna na błędy - musisz pamiętać o puli adresów, sieci, serwerze i interfejsie. Napisz skrypt, który przyjmie jako argumenty: adres podsieci, maskę, bramę domyślną, zakres adresów IP do przydzielania (pula), adresy DNS i czas dzierżawy. Skrypt powinien najpierw sprawdzić czy DHCP server już istnieje dla tej sieci, a jeśli nie - utworzyć nową konfigurację. Skrypt powinien wyświetlać komunikaty postępu i wynik operacji.
:if ($argc < 6) do={...}:local siec $1, :local maska $2 itd.[/ip dhcp-server find interface=$siec]/ip pool add name=dhcp-$siec ranges=$pula/ip dhcp-server network add address=$siec gateway=$brama dns-server=$dns/ip dhcp-server add name=server-$siec interface=$interfejs pool-name=dhcp-$sieclease-time=disabled=noStwórz skrypt z harmonogramem, który automatycznie generuje codzienny raport o stanie routera. Zadanie uczy pracy z schedulerem, zbierania danych o systemie oraz tworzenia automatycznych zadań cyklicznych.
Twoja firma potrzebuje codziennego raportu o stanie routera wysyłanego e-mailem każdego dnia o 8:00 rano do działu IT. Dyrektor IT oczekuje raportu zawierającego zużycie CPU, pamięć RAM, wolne miejsce na dysku, liczbę aktywnych połączeń, status interfejsów i uptime routera. Napisz skrypt, który zbiera te informacje, formatuje je w czytelny raport tekstowy i zapisuje do pliku. Następnie utwórz zadanie w schedulerze, które uruchomi ten skrypt codziennie o 8:00 rano. Skrypt powinien zawierać komentarze dokumentujące jego działanie dla przyszłych administratorów.
/system script z odpowiednim kodem źródłowym/system resource get:local cpuLoad [/system resource get cpu-load]:local totalRam [/system resource get total-memory] i użycie:local uptime [/system resource get uptime][:len [/interface find running]]:put z parametrem file/system scheduler add name=daily-reportinterval=1d (raz dziennie)start-time=08:00:00on-event=nazwa-skryptuNapisz skrypt, który automatycznie blokuje adresy IP próbujące atakować router (np. wielokrotne błędne logowania). Zadanie uczy analizy logów w poszukiwaniu wzorców ataków, dynamicznego dodawania reguł firewalla oraz programowej ochrony przed atakami.
Router w Twojej firmie jest atakowany przez boty próbujące zalogować się przez SSH z setek różnych adresów IP. Dziennie notujecie setki nieudanych prób logowania co powoduje obciążenie routera i potencjalne zagrożenie bezpieczeństwa. Napisz skrypt, który analizuje logi i wyszukuje adresy IP z wielokrotnymi (więcej niż 3) nieudanymi próbami logowania w ciągu ostatnich 10 minut. Skrypt powinien dodać te adresy IP do listy adresów (address list) w firewallu i zablokować je. Skrypt powinien też sprawdzić czy dany adres już jest zablokowany, aby nie dodawać duplikatów. Dodaj komentarze dokumentujące działanie skryptu.
:local progProgowy 3:local czasAnalizy "10m"/log find topic~"system.warning" message~"login failed":foreach do przetwarzania logów[:pick] i [:find])[/ip firewall address-list find list=atakujacy address=$ip]/ip firewall address-list add list=atakujacy address=$ip comment="zablokowany automatycznie"Napisz skrypt, który resetuje (rozłącza) aktywne połączenia dla określonego klienta na podstawie jego adresu IP. Zadanie uczy pracy z connection tracking, znajdowania i usuwania połączeń oraz walidacji argumentów wejściowych.
Klient z firmy partnerskiej zgłasza problemy z połączeniem VPN do Twojej sieci i prosi o jego zresetowanie. Sesja VPN wydaje się "zawieszona" mimo że połączenie sieciowe działa - typowy problem z "zombie connection". Napisz skrypt, który przyjmie jako argument adres IP klienta i zakończy wszystkie aktywne połączenia TCP/UDP dla tego adresu. Skrypt powinien najpierw sprawdzić czy takie połączenie istnieje, a następnie je zakończyć używając polecenia /ip firewall connection remove. Skrypt powinien wyświetlić informację o liczbie zamkniętych połączeń i zapisać wynik do logów. Dodaj obsługę błędów dla przypadku gdy podany adres IP jest nieprawidłowy.
:local adresIP $1:if ([:typeof $adresIP] = "nil") do={...}[/ip firewall connection find src-address~$adresIP][/ip firewall connection find dst-address~$adresIP]:local ilePolaczen [:len $polaczenia]/ip firewall connection remove