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)

El ICMP (Internet Control Message Protocol) és un dels protocols core d'Internet, per al seu funcionament utilitza directament el protocol IP dins de l'arquitectura TCP/IP. La seva funció és informar de l'estat i situacions d'error en el funcionament de la capa de xarxa

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

Hi ha 2 versions d'aquest protocol:

  • ICMPv4: ICMP per al protocol IPv4.
  • ICMPv6: ICMP per al protocol IPv6.

Protocol ICMP

El protocol ICMP forma part de la Suite IP tal com es va definir al document RFC 792. Els missatges ICMP són normalment generats en resposta a errors en els datagrames IP (segons l'especificació RFC 1122) o per a diagnòstic i encaminament.

La versió d'ICMP per a IPv4 és coneguda com a ICMPv4. IPv6 també té el seu protocol equivalent.

Els missatges ICMP són construïts al nivell de capa de xarxa, generalment d'un datagrama que ha generat una resposta ICMP. El protocol IP encapsula aquest missatge ICMP, afegint-li la mateixa capçalera IP i transmet el datagrama resultant de la forma habitual.

Com a exemple, cada màquina que reenvia un paquet IP (com un encaminador) decrementa en una unitat un camp de la capçalera IP anomenat temps de vida (TTL, Time To Live). Si aquest paquet és reenviat per moltes màquines, el valor TTL pot arribar a 0. Aleshores, es torna un missatge ICMP "Temps de vida excedit en trànsit".

Conceptes

  • ICMP Type: Indica el tipus de missatge.
  • ICMP Code: Indica el subtipus de paquet ICMP.
  • ICMP Message: És el paquet sencer, incloent la capçalera i les dades.

Capçalera ICMP

ICMP és un protocol que corre sobre el protocol IP i no utilitza ni TCP ni UDP. Tots els paquets ICMP tenen una capçalera de mida de 8 bytes i una mida de les dades variable.

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

Bits 0–7 8–15 16–23 24–31
0 Type Code Checksum
32 Rest of Header

Tipus de missatges

Echo Reply i Echo Request

Aquest missatge ens informat de la comunicació entre dos màquines, per comprovar-ho podem utilitzar la comanda: $ ping. A continuació mostro un exemple pràctic.

EXEMPLE PRÀCTIC

En primer lloc mostro la @IP que té la nostra maquina per poder identificar-la després a les captures del Wireshark.

$ ifconfig
eth0      Link encap:Ethernet  direcciónHW ec:b1:d7:56:49:65  
          Direc. inet:192.168.202.167  Difus.:192.168.202.255  Másc:255.255.255.0
          Dirección inet6: fe80::eeb1:d7ff:fe56:4965/64 Alcance:Enlace
          ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST  MTU:1500  Métrica:1
          Paquetes RX:279530 errores:0 perdidos:0 overruns:0 frame:0
          Paquetes TX:146488 errores:0 perdidos:0 overruns:0 carrier:0
          colisiones:0 long.colaTX:1000 
          Bytes RX:330132359 (330.1 MB)  TX bytes:23604698 (23.6 MB)
          Interrupción:20 Memoria:f7c00000-f7c20000 

Fem un ping a Google (8.8.8.8).

$ ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=12.0 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=11.8 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=12.0 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=11.9 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 11.888/11.965/12.038/0.123 ms

Seguidament, amb el Wireshark, capturarem aquests paquets i observem el Replay i el Request.

En el Reply podem observar té el codi 0.

Jc-reprec-1.png

Seguidament, en el Request podem observar té el codi 1.

Jc-reprec-2.png

Destination unreacheable

El primer que farem serà un ping a l'@IP 8.8.8.7

$ ping -c 1 8.8.8.7
PING 8.8.8.7 (8.8.8.7) 56(84) bytes of data.

--- 8.8.8.7 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

Ho capturem amb el Wireshark i veiem com només fem el Request, no obtenim resposta ja que segurament algun firewall s'ha degut menjar el paquet. El codi segueix sent 8.

Jc-icmphunr1.png

A continuació, fem un ping a una @IP de l'aula 203.

$ ping -c 1 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

--- 192.168.203.45 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

En aquest cas, si que ens contesta el router, pero ens diu que aquesta l'@IP no està disponible (Destination Host Unreachable).

Al Wireshark, veiem com ara sí que fa el Request, de tipus (type) 8.

Jc-hstunrechable-1.png

Si observem, podem veure com al Reply canvia el tipus (type) i el codi (code) a 3 i 1, respectivament.

Jc-hstunrechable-2.png

icmp-net-unreachable

Regla amb IPTABLEs:

$ iptables -A INPUT -i eth0 -s 192.168.202.167 -j REJECT --reject-with icmp-net-unreachable

Execució de la comanda ping de la màquina amb l'@IP 192.168.202.167 a la màquina amb l'@IP 192.168.202.242:

$ ping -c 2 192.168.202.242
PING 192.168.202.242 (192.168.202.242) 56(84) bytes of data.
From 192.168.202.242 icmp_seq=1 Destination Net Unreachable
From 192.168.202.242 icmp_seq=2 Destination Net Unreachable

--- 192.168.202.242 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 999ms

Observem al Wireshark que així sigui:

Net unreachable.png

icmp-host-unreachable

Regla amb IPTABLEs:

$ iptables -A INPUT -i eth0 -s 192.168.202.167 -j REJECT --reject-with icmp-host-unreachable

Execució de la comanda ping de la màquina amb l'@IP 192.168.202.167 a la màquina amb l'@IP 192.168.202.242:

$ ping -c 2 192.168.202.242
PING 192.168.202.242 (192.168.202.242) 56(84) bytes of data.
From 192.168.202.242 icmp_seq=1 Destination Host Unreachable
From 192.168.202.242 icmp_seq=2 Destination Host Unreachable

--- 192.168.202.242 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 999ms

Observem al Wireshark que així sigui:

Host unreachable.png

icmp-port-unreachable

Regla amb IPTABLEs:

$ iptables -A INPUT -i eth0 -s 192.168.202.167 -j REJECT --reject-with icmp-port-unreachable

Execució de la comanda ping de la màquina amb l'@IP 192.168.202.167 a la màquina amb l'@IP 192.168.202.242:

$ ping -c 2 192.168.202.242
PING 192.168.202.242 (192.168.202.242) 56(84) bytes of data.
From 192.168.202.242 icmp_seq=1 Destination Port Unreachable
From 192.168.202.242 icmp_seq=2 Destination Port Unreachable

--- 192.168.202.242 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 999ms

Observem al Wireshark que així sigui:

Port unreachable.png

icmp-proto-unreachable

Regla amb IPTABLEs:

$ iptables -A INPUT -i eth0 -s 192.168.202.167 -j REJECT --reject-with icmp-proto-unreachable

Execució de la comanda ping de la màquina amb l'@IP 192.168.202.167 a la màquina amb l'@IP 192.168.202.242:

$ ping -c 2 192.168.202.242
PING 192.168.202.242 (192.168.202.242) 56(84) bytes of data.
From 192.168.202.242 icmp_seq=1 Destination Protocol Unreachable
From 192.168.202.242 icmp_seq=2 Destination Protocol Unreachable

--- 192.168.202.242 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 999ms

Observem al Wireshark que així sigui:

Proto unreachable.png

icmp-net-prohibited

Regla amb IPTABLEs:

$ iptables -A INPUT -i eth0 -s 192.168.202.167 -j REJECT --reject-with icmp-net-prohibited

Execució de la comanda ping de la màquina amb l'@IP 192.168.202.167 a la màquina amb l'@IP 192.168.202.242:

$ ping -c 2 192.168.202.242
PING 192.168.202.242 (192.168.202.242) 56(84) bytes of data.
From 192.168.202.242 icmp_seq=1 Destination Net Prohibited
From 192.168.202.242 icmp_seq=2 Destination Net Prohibited

--- 192.168.202.242 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 999ms

Observem al Wireshark que així sigui:

Net prohibited.png

icmp-host-prohibited

Regla amb IPTABLEs:

$ iptables -A INPUT -i eth0 -s 192.168.202.167 -j REJECT --reject-with icmp-host-prohibited

Execució de la comanda ping de la màquina amb l'@IP 192.168.202.167 a la màquina amb l'@IP 192.168.202.242:

$ ping -c 2 192.168.202.242
PING 192.168.202.242 (192.168.202.242) 56(84) bytes of data.
From 192.168.202.242 icmp_seq=1 Destination Host Prohibited
From 192.168.202.242 icmp_seq=2 Destination Host Prohibited

--- 192.168.202.242 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 999ms

Observem al Wireshark que així sigui:

Host prohibited.png

icmp-admin-prohibited

Regla amb IPTABLEs:

$ iptables -A INPUT -i eth0 -s 192.168.202.167 -j REJECT --reject-with icmp-admin-prohibited

Execució de la comanda ping de la màquina amb l'@IP 192.168.202.167 a la màquina amb l'@IP 192.168.202.242:

$ ping -c 2 192.168.202.242
PING 192.168.202.242 (192.168.202.242) 56(84) bytes of data.
From 192.168.202.242 icmp_seq=1 Packet filtered
From 192.168.202.242 icmp_seq=2 Packet filtered

--- 192.168.202.242 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 999ms

Observem al Wireshark que així sigui:

Admin prohibited.png

Ping com traceroute

Amb l'opció -nR podem simular la comanda traceroute amb ping.

$ ping -nR -c 3 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.498 ms
RR: 	192.168.50.80
	192.168.50.80
	192.168.50.80
	192.168.50.80
	192.168.50.80
	192.168.50.80

64 bytes from 192.168.50.80: icmp_seq=2 ttl=63 time=0.698 ms	(same route)
64 bytes from 192.168.50.80: icmp_seq=3 ttl=63 time=0.592 ms	(same route)

--- www.iesebre.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.498/0.596/0.698/0.081 ms

També es pot fer salt a salt canviant el TTL, ho fem de la següent forma:

$ ping -t 1 -c 2 www.google.es
PING www.google.es (216.58.214.163) 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

--- www.google.es ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1001ms

Amb l'opció -t x (x val el número de salt que volem que faci el ping) podem veure a quin router es queda el ping, ja que se li acaben els salts que li hem indicat.

En l'anterior ping podem veure com, al sol permetre un salt, el ping es queda al gateway del centre.

Jc-ttlpng1.png

Si, per exemple, li posem -t 4 el ping es pararà al cinqué salt.

$ ping -t 5 -c 2 www.google.es
PING www.google.es (216.58.214.163) 56(84) bytes of data.
From 72.14.219.70 icmp_seq=1 Time to live exceeded
From 72.14.219.70 icmp_seq=2 Time to live exceeded

--- www.google.es ping statistics ---

2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1001ms

Si comparem la @IP on es para amb el cinqué router pel que passem amb la comanda traceroute, es la mateixa (72.14.219.70).

$ traceroute www.google.es
traceroute to www.google.es (216.58.214.163), 30 hops max, 60 byte packets
1  192.168.202.1 (192.168.202.1)  0.134 ms  0.132 ms  0.190 ms
2  185-13-76-129-ipv4.ebretic.com (185.13.76.129)  3.059 ms  3.052 ms  3.005 ms
3  212.74.67.117 (212.74.67.117)  5.446 ms  5.445 ms  5.439 ms
4  xe0-0-2-pr3.MAD.router.colt.net (212.74.86.149)  11.937 ms  11.932 ms  11.908 ms
5  72.14.219.70 (72.14.219.70)  11.922 ms  11.909 ms  11.903 ms
6  216.239.50.28 (216.239.50.28)  12.145 ms  12.108 ms  12.097 ms
7  216.239.40.219 (216.239.40.219)  12.093 ms  11.998 ms  12.268 ms
8  mad01s26-in-f3.1e100.net (216.58.214.163)  12.137 ms  11.893 ms  11.905 ms

Vegeu també

Enllaços externs