IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Protocol ICMP

El protocol ICMP (Internet Control Message Procol), és un dels protocols core d'Internet (Internet Protocol Suite).

Es transporta mtijançant el protocol IP, és a dir, es troba al nivell 4 del model OSI i el nivell 3 del model TCP/IP.

Aquest protocol, es utilitzat per a enviar missatges d'error de comunicació entre nodes com per exemple que un node no esta accessible o un servei no està disponible.

El numero del protocol es el 1.

A diferència de TCP i UDP, aquest protocol no s'utilitza per enviar dades entre sistemes.

Algunes aplicacions com ping o traceroute depenen moltisim d'aquest protocol.

El protocol ICMP té dos versions:

  • ICMPv4: ICMP per al protocol IP versió 4
  • ICMPv6: ICMP per al protocol IP versió 6

Cada paquet ICMP, portarà un tipus, codi i missatge:

  • ICMP Type: Indica el tipus de missatge.
  • ICMP Code: Indica el subtipus de paquet ICMP.
  • ICMP Message: Eś el paquet sencer, incloent capçalera i dades.


Capçalera ICMP

Com hem dit anteriorment, el protocol ICMP corre sobre el protocol IP. Tots els paquets ICMP tenen una capçalera de mida de 8 bytes (64 bits) i una mida de les dades (payload) variable.

Els 4 primers Bytes de la capçalera (header) han de ser consistents:

Ea icmp1.png

  • 1r Byte: Indica el ICMP Type
  • 2n Byte: Indica el ICMP Code
  • 3r i 4t Bytes: són el checksum tel missatge icmp sencer (ICMP message). El algorisme s'especifica al RFC 1071.

Tipus de Missatges

Echo Reply i Echo Request

Aquest tipus de missatge, són missatges de control que ens informen de la comunicació entre les màquines, podem fer la comprovació amb un ping.

Fem un ping a Google.

~$ ping 8.8.8.8

Amb el Wireshark, capturarem aquest paquets i veurem el Replay i el Request.

Primer veiem el reply, observem com té el tipus 0.

Ea icmp2.png

Seguidament, veurem el request, com podem comprovar té el tipus 8.

Ea icmp3.png

Destination Unreachable

Fem un ping a l'adreça IP 8.8.8.7

~$ ping 8.8.8.7
PING 8.8.8.7 (8.8.8.7) 56(84) bytes of data.

Si ho capturem amb el Wireshark, veurem com només fem el request, no obtenim resposta ja que algun firewall s'ha degut menjar el paquet.

Veiem que el codi continua sent el 8.

Ea icmp4.png

Ara, farem un ping a una IP de l'aula 203.

~$ ping 192.168.203.45
PING 192.168.203.45 (192.168.203.45) 56(84) bytes of data.
From 192.168.203.1 icmp_seq=1 Destination Host Unreachable
From 192.168.203.1 icmp_seq=2 Destination Host Unreachable

Veiem que aquest si que ens contesta el router i ens diu que aquesta adreça IP no està disponible.

Si ho capturem amb el Wireshark, veiem com fa el request, amb el tipus 8.

Ea icmp5.png

Observem com al reply, ens canvia el tipus i el codi a 3 i 1 respectivament.

Ea icmp6.png


icmp-net-unreachable

~$ sudo iptables -A INPUT -i eno1 -s 192.168.202.156 -j REJECT --reject-with icmp-net-unreachable

icmp-host-unreachable

sudo iptables -A INPUT -i eno1 -s 192.168.202.156 -j REJECT --reject-with icmp-host-unreachable

icmp-port-unreachable

~$ sudo iptables -A INPUT -i eno1 -s 192.168.202.156 -j REJECT --reject-with icmp-port-unreachable

icmp-proto-unreachable

~$ sudo iptables -A INPUT -i eno1 -s 192.168.202.156 -j REJECT --reject-with icmp-proto-unreachable

icmp-net-prohibited

~$ sudo iptables -A INPUT -i eno1 -s 192.168.202.156 -j REJECT --reject-with icmp-net-prohibited

icmp-host-prohibited

~$ sudo iptables -A INPUT -i eno1 -s 192.168.202.156 -j REJECT --reject-with icmp-host-prohibited

icmp-admin-prohibited

~$ sudo iptables -A INPUT -i eno1 -s 192.168.202.156 -j REJECT --reject-with icmp-admin-prohibited

Ping com a traceroute

Si volem que el ping actui com a traceroute, podem utilitzar l'opció -nR

~$ ping -nR www.iesebre.com
PING www.iesebre.com (192.168.50.80) 56(124) bytes of data.
64 bytes from 192.168.50.80: icmp_seq=1 ttl=63 time=0.691 ms
RR: 	192.168.202.239
192.168.50.1
192.168.50.80
192.168.50.80
192.168.202.1
192.168.202.239
64 bytes from 192.168.50.80: icmp_seq=2 ttl=63 time=6.55 ms	(same route)
64 bytes from 192.168.50.80: icmp_seq=3 ttl=63 time=0.733 ms	(same route)
64 bytes from 192.168.50.80: icmp_seq=4 ttl=63 time=0.546 ms	(same route)
64 bytes from 192.168.50.80: icmp_seq=5 ttl=63 time=0.538 ms	(same route)

Si volem que ho faci salt a salt, utilitzem l'opció -t

~$ ping -t 1 www.iesebre.com
PING www.iesebre.com (192.168.50.80) 56(84) bytes of data.
From 192.168.202.1 icmp_seq=1 Time to live exceeded
From 192.168.202.1 icmp_seq=2 Time to live exceeded
From 192.168.202.1 icmp_seq=3 Time to live exceeded

Capturem el paquet amb el Wireshark:

Ea ping1.png

Broadcast i Multicast

La majoria de màquines no contesten a Broadcast, per activar-ho, posem a 0 el fitxer /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

~# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

Observem com al fer el ping, la resta de màquines si que contesten.

~# ping -b 192.168.202.255
WARNING: pinging broadcast address
PING 192.168.202.255 (192.168.202.255) 56(84) bytes of data.
64 bytes from 192.168.202.239: icmp_seq=1 ttl=64 time=0.027 ms
64 bytes from 192.168.202.100: icmp_seq=1 ttl=64 time=0.296 ms (DUP!)
64 bytes from 192.168.202.247: icmp_seq=1 ttl=64 time=0.457 ms (DUP!)
64 bytes from 192.168.202.238: icmp_seq=1 ttl=64 time=94.4 ms (DUP!)
64 bytes from 192.168.202.167: icmp_seq=1 ttl=64 time=997 ms (DUP!)

Si el fitxer /proc/sys/net/ipv4/icmp_echo_ignore_all el fiquem a 1, ignorarà tots els ICMP.

~# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

Amb l'opció -f, fem un flooding.

~# ping -f localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
.