Protokół ICMP (Internet Control Message Protocol) jest protokołem warstwy sieci, wykorzystywanym do diagnostyki połączeń sieciowych dlatego przede wszystkim jest używany przez urządzenia sieciowe (routery). Głównym zadaniem protokołu ICMP jest zgłaszanie błędów w transmisji. Jeśli w trakcie komunikacji pomiędzy hostami występuje jakiś problem, urządzenie sieciowe, na którym błąd wystąpił, generuje odpowiedni komunikat ICMP i wysyła go do nadawcy, żeby poinformować go o problemie. Na przykład, jeśli przesyłany pakiet jest za duży i router nie może go przesłać dalej, wygeneruje on odpowiedni komunikat ICMP i wyśle go do nadawcy pakietu.
Ponadto ICMP może być używany do diagnostyki. Aplikacje takie jak PING i traceroute bazując na pakietach Echo-request i Echo-replay oraz ewentualnych błędach zgłaszanych poprzez protokół ICMP pozwalają na zbadanie aktualnych ścieżek routingu, opóźnień w sieci oraz dostępności hostów w sieci.
Jak działa ICMP?
W przeciwieństwie do protokołu IP ICMP nie jest powiązany z żadnym z protokołów warstwy transportowej takim jak TCP albo UDP. Oznacza to, że ICMP jest protokołem bezpołączeniowym. Protokół TCP przed wysłaniem danych ustanawia połączenie za pomocą TCP handshake, żeby upewnić się, że oba urządzenia są gotowe do wymiany danych. Protokół ICMP nie otwiera połączenia w ten sposób. Jego działanie jest bardziej zbliżone do protokołu UDP, a więc komunikaty i dane wysyłane są już w pierwszym pakiecie transmisji, a my musimy założyć, że dotrą do adresata.
Inną ważną cechą ICMP jest to, że do wysyłania danych nie są używane porty źródłowe ani docelowe. Warto o tym pamiętać, bo wielokrotnie od osób konfigurujących na firewallu reguły dla ICMP słyszałem pytania, jakie porty powinni wybrać? W przypadku reguł firewall nie wskazujemy wtedy portów a co najwyżej typy komunikatów, o których napiszę w dalszej części.
Budowa pakietu ICMP

Budowa pakietu ICMP jest bardzo prosta. Składa się on z typu i kodu komunikatu ICMP oraz sumy kontrolnej. Pole danych jest opcjonalne i pakiet może nie zawierać żadnych danych, ale może też zawierać bardzo dużo danych jak np. przy ataku Ping of death.
Przykłady komunikatów ICMP
W ramach ICMP możemy rozróżnić dwa typy komunikatów, te do raportowania o błędach i komunikaty diagnostyczne. Wśród komunikatów raportujących o błędach najczęściej spotykane to:
- Destination unreachable (Type 3) – Taki komunikat jest wysyłany, kiedy pakiet nie może trafić do miejsca przeznaczenia. Jeśli nieosiągalny jest host docelowy, taką informację wyśle router z sieci docelowej. Jeśli natomiast nieosiągalny jest port docelowy, czyli usługa, z którą próbujemy się połączyć, nie jest uruchomiona, to taki komunikat wyśle host docelowy. Informacja o tym, który z wielu wariantów komunikatu Destination unreacheble wystąpił, przekazywana jest w polu Code i może mieć następujące wartości:
0 | Destination network unreachable |
1 | Destination host unreachable |
2 | Destination protocol unreachable |
3 | Destination port unreachable |
4 | Fragmentation required, and DF flag set |
5 | Source route failed |
6 | Destination network unknown |
7 | Destination host unknown |
8 | Source host isolated |
9 | Network administratively prohibited |
10 | Host administratively prohibited |
11 | Network unreachable for ToS |
12 | Host unreachable for ToS |
13 | Communication administratively prohibited |
14 | Host Precedence Violation |
15 | Precedence cutoff in effect |
- Time exceeded (Type 11) – Komunikat o przekroczeniu czasu może zostać wygenerowany w dwóch przypadkach. Jednym z nich jest sytuacja, w której wartość pola TTL (Time To Live) w nagłówku IP spadła do zera i pakiet musiał zostać odrzucony. Drugim jest przypadek, w którym urządzenie nie mogło ponownie złożyć pofragmentowanego pakietu w wyznaczonym czasie i pakiet został odrzucony. Informacja o tym, jaki był powód odrzucenia, znajduje się oczywiście w polu Code:
0 | Time to live exceeded in transit |
1 | Fragment reassembly time exceeded |
- Parameter problem (Type 12) – To ogólny komunikat, który jest używany, jeśli nie ma zastosowania żaden bardziej szczegółowy błąd. Wtedy w polu danych będzie znajdował się wskaźnik lokalizujący problem w oryginalnym pakiecie. Ten komunikat będzie również używany w przypadku uszkodzenia lub brakujących danych w nagłówku IP. Jednak w takim przypadku nie będzie wskaźnika problemu. W końcu trudno wskazać dane, których nie ma 😊
0 | Pointer indicates the error |
1 | Missing a required option |
2 | Bad length |
- Redirect (Type 5) – Komunikat przekierowania ICMP pomaga w zwiększeniu wydajności routingu. W przypadku, gdy host routuje pakiety przez bramę domyślną, ale brama domyślna wie, że inny router w sieci lokalnej jest lepszy dla sieci docelowej komunikacji, wówczas brama główna wyśle przekierowanie do hosta źródłowego, informując o użyciu innego router. Takie przekierowanie może dotyczyć całego ruchu do określonej sieci docelowej lub tylko ruchu do określonego hosta. Ważne, żeby pamiętać, że ICMP Redirect pomaga zwiększyć wydajność routingu, ale nie jest używane do tworzenia i modyfikowania tabel routingu.
0 | Redirect datagram for the network (or subnet) |
1 | Redirect datagram for the host |
Do komunikatów diagnostycznych zaliczamy dwa powiązane ze sobą Echo-request (Type 8) oraz Echo-replay (Type 0).
Echo-request to żądanie echa, na które powinna zastać odesłana odpowiedź Echo-replay. Najczęściej używaną aplikacją do generowania Echo-request jest ping dostępny chyba w każdym systemie operacyjnym.

Komputer, który otrzyma żądanie echa, powinien na nie odpowiedzieć, wysyłając w treści takie same dane, jakie odebrał w żądaniu. W przypadku systemów Windows w treści żądania przesyłany jest alfabet, natomiast systemy Linux wysyłają najczęściej puste dane. Otrzymanie odpowiedzi oznacza, że host docelowy działa i pomiędzy hostami routowane są pakiety. Dodatkowo na podstawie czasu odpowiedzi można szacować obciążenie sieci a na podstawie utraconych pakietów poziom jej niezawodności.

Ataki sieciowe wykorzystujące Internet Control Message Protocol
- ICMP flood attack
To atak polegający na zalaniu ofiary olbrzymią ilością pakietów ICMP. Chodzi o to, żeby ilość pakietów lub danych była większa niż przepustowość łącza ofiary. Zazwyczaj wykorzystywany jest komunikat echo-request, na który ofiara ataku powinna odpowiedzieć komunikatem echo-replay zawierającym ten sam payload. Do skutecznego ataku ICMP flood wystarczy dysponować łączami o większej przepustowości niż ofiara ataku.
- Ping of death
Atak Ping of death ma miejsce, kiedy atakujący wysyła pakiet ping większy niż maksymalny dopuszczalny rozmiar pakietu urządzenia docelowego. W wyniku otrzymania takiego pakietu dochodzi do zawierzenia lub restartu systemu docelowego i działających na nim serwisów. Na szczęście ten atak działa tylko na bardzo stare systemy takie jak Windows 95 i NT, a współczesne systemy są na niego odporne.
- Smurf attack
Smurf attack jest atakiem typy DDoS (Distributed Denial-of-Service) i polega na wysyłaniu pakietów ze sfałszowanym adresem źródłowym. Atakujący podszywa się pod adres serwera, który jest celem ataku i wysyła pakiet ICMP na adres broadcastowy sieci. W efekcie tego serwer będący celem ataku otrzyma duże ilości danych i pakietów co może doprowadzić do wysycenia jego łącza. Tak jak w przypadku ataku Ping of death, tak i przy Smyrf attack obecne systemy są na niego odporne i nie powinny zalać ofiary ataku odpowiedziami ICMP.