Modificando cabeceras de layer 2 y 3
Fecha: 27 de abril del 2020 (durante la cuarentena)
Escenario
Para este laboratorio pensaba en cuantos parámetros se pueden modificar, tantos como sean posibles,
en las cabeceras de una trama-paquete que viaja entre dos equipos.
La comunicación original y que tomamos como referencia para determinar cuales parámetros podemos
cambiar es entre una PC con IP 192.168.1.10 y otra PC con IP 192.168.1.100 con un cable cruzado.
1.- Generamos tráfico:
Generamos tráfico ICMP (echo request) con una carga de 1400 bytes (por default en Windows es 32 bytes)
para tener mas opciones a la hora de “jugar” con las cabeceras.
C:\>ping 192.168.1.100 -l 1400
Haciendo ping a 192.168.1.100 con 1400 bytes de datos:
Respuesta desde 192.168.1.100: bytes=1400 tiempo=1ms TTL=128
Respuesta desde 192.168.1.100: bytes=1400 tiempo=1ms TTL=128
Respuesta desde 192.168.1.100: bytes=1400 tiempo=1ms TTL=128
Respuesta desde 192.168.1.100: bytes=1400 tiempo=1ms TTL=128
2.- Visualizamos la captura en el extremo:
Trama
enviada: |
Trama
recibida: |
Ethernet II, Src: e8:6a:64:dc:e2:f5,
Dst: 00:1b:38:7e:f1:71 |
Ethernet II, Src: e8:6a:64:dc:e2:f5,
Dst: 00:1b:38:7e:f1:71 |
Destination Address: 00:1b:38:7e:f1:71 |
Destination
Adress: 00:1b:38:7e:f1:71 |
Source Address: e8:6a:64:dc:e2:f5 |
Source Address: e8:6a:64:dc:e2:f5 |
Type:
IPv4 (0x0800) |
Type: IPv4 (0x0800) |
Internet Protocol Version 4, Src: 192.168.1.10,
Dst: 192.168.1.100 |
Internet Protocol Version 4, Src:
192.168.1.10, Dst: 192.168.1.100 |
0100 .... = Version: 4 |
0100 .... = Version: 4 |
.... 0101 = Header Length: 20 bytes (5) |
.... 0101 = Header Length: 20 bytes (5) |
Differentiated Services Field: 0x00
(DSCP: CS0, ECN: Not-ECT) |
Differentiated Services Field: 0x00
(DSCP: CS0, ECN: Not-ECT) |
0000
00.. = Differentiated Services Codepoint: Default
(0) |
0000 00.. = Differentiated Services Codepoint: Default (0) |
.... ..00 = Explicit Congestion
Notification: Not ECN-Capable Transport (0) |
.... ..00 = Explicit Congestion
Notification: Not ECN-Capable Transport (0) |
Total
Length: 1428 |
Total Length: 1428 |
Identification: 0x51de (20958) |
Identification: 0x51de (20958) |
Flags: 0x0000 |
Flags: 0x0000 |
0... .... .... .... = Reserved bit: Not set |
0... .... .... .... = Reserved bit: Not set |
.0.. .... .... .... = Don't fragment: Not set |
.0.. .... .... .... = Don't fragment: Not set |
..0. .... .... .... = More fragments: Not set |
..0. .... .... .... = More fragments: Not set |
...0 0000 0000 0000 = Fragment offset: 0 |
...0 0000 0000 0000 = Fragment offset: 0 |
Time to live: 128 |
Time to live: 128 |
Protocol: ICMP (1) |
Protocol: ICMP (1) |
Header checksum: 0x5fcc [validation
disabled] |
Header checksum: 0x5fcc [validation
disabled] |
Source:
192.168.1.10 |
Source: 192.168.1.10 |
Destination: 192.168.1.100 |
Destination: 192.168.1.100 |
Internet Control Message Protocol |
Internet Control Message Protocol |
Type: 8 (Echo (ping) request) |
Type: 8 (Echo (ping) request) |
Code: 0 |
Code: 0 |
Checksum: 0x86c1 [correct] |
Checksum: 0x86c1 [correct] |
[Checksum Status: Good] |
[Checksum Status: Good] |
Identifier (BE): 1 (0x0001) |
Identifier (BE): 1 (0x0001) |
Identifier (LE): 256 (0x0100) |
Identifier (LE): 256 (0x0100) |
Sequence number (BE): 3279 (0x0ccf) |
Sequence number (BE): 3279 (0x0ccf) |
Sequence number (LE): 53004 (0xcf0c) |
Sequence number (LE): 53004 (0xcf0c) |
Data (1400 bytes) |
Data (1400 bytes) |
3.- Modificando las cabeceras:
Para modifcar todos los valores posibles en las cabeceras podemos utilizar un router que separe origen y destino en dos subredes
sin alterar el ping original, esto permitirá modificar primeramente ambas direcciones MAC en la cabecera de layer 2.
Las direcciones IP origen y destino mediante NAT y PAT, agregado de etiquetas QoS, modificación del TTL (tenemos un salto), y al
agregar fragmentación generamos valores offset (ID de fragmento) y diferente checksum, todo esto en la cabecera de layer 3.
La cabecera ICMP no se modifica, tal vez en una cabecera TCP había mas para “jugar”, necesitaríamos un firewall para hacerlo,
y por la cuarentena no tengo acceso a uno.
C:\>ping 192.168.1.100 -l 1400
Haciendo ping a 192.168.1.100 con 1400 bytes de datos:
Respuesta desde 192.168.1.100: bytes=1400 tiempo=3ms TTL=127
Respuesta desde 192.168.1.100: bytes=1400 tiempo=3ms TTL=127
Respuesta desde 192.168.1.100: bytes=1400 tiempo=3ms TTL=127
Respuesta desde 192.168.1.100: bytes=1400 tiempo=3ms TTL=127
En la PC 192.168.1.10 la máscara /24 no se modifica, o sea que no utiliza default gateway sino que “busca” la IP destino en la misma red.
La PC 192.168.1.10 con MAC E8:6A:64:DC:E2:F5 envía el ping a
192.168.1.100 MAC 00:17:95:C0:AC:A2, que es la dirección MAC
del router
que
escucha mediante NAT en la IP 192.168.1.100.
Cuando
recibe el paquete le traduce la dirección destino a IP 192.168.1.110 y resuelve
por ARP que es la dirección MAC 00:1B:38:7E:F1:71.
Una
vez que el paquete se procesa en el router y se reenvía por la interface Fa0/1,
se le realiza un PAT a la dirección origen 192.168.1.10
que
pasa a ser 192.168.1.97, y se transmite con la dirección MAC 00:17:95:C0:AC:A3.
Dentro
de las configuraciones en la interface de salida Fa0/1, la trama de 1442 bytes
se fragmenta en 30 paquetes de 82 bytes, y en todos
se
agregan el número de offset, que es el indicador de número de fragmento
(expresado en bytes), y a todos los paquetes se le agrega el
valor
hexadecimal B8 (EF o Expedited Forwarding en lenguaje humano), que es una etiqueta
de calidad de servicio (QoS), algo así como un
cartel
VIP que nos da prioridad de paso, y aunque aquí no se utilice, nos sirve para
modificar algunos bits mas la cabecera.
Con
tantos cambios en la cabecera de layer 3 el checksum también cambiará (ver punto 6).
4.- Visualizamos la captura en el extremo:
Trama
enviada: |
Trama
recibida: |
Ethernet II,
Src: e8:6a:64:dc:e2:f5, Dst: 00:17:95:c0:ac:a2 |
Ethernet II, Src: 00:17:95:c0:ac:a3, Dst: 00:1b:38:7e:f1:71 |
Destination Address: 00:17:95:c0:ac:a2 |
Destination Address: 00:1b:38:7e:f1:71 |
Source Address: e8:6a:64:dc:e2:f5 |
Source Address: 00:17:95:c0:ac:a3 |
Type:
IPv4 (0x0800) |
Type: IPv4 (0x0800) |
Internet Protocol Version 4, Src:
192.168.1.10, Dst: 192.168.1.100 |
Internet Protocol Version 4, Src: 192.168.1.97, Dst: 192.168.1.110 |
0100 .... = Version: 4 |
0100 .... = Version: 4 |
.... 0101 = Header Length: 20 bytes (5) |
.... 0101 = Header Length: 20 bytes (5) |
Differentiated Services Field: 0x00
(DSCP: CS0, ECN: Not-ECT) |
Differentiated
Services Field: 0xb8 (DSCP: EF PHB, ECN: Not-ECT) |
0000
00 . . = Differentiated Services Codepoint: Default
(0) |
1011
10 . . =
Differentiated Services Codepoint: Expedited Forwarding (46) |
. . . . . . 00 = Explicit Congestion
Notification: Not ECN-Capable Transport (0) |
. .
. . . . 00 = Explicit Congestion
Notification: Not ECN-Capable Transport (0) |
Total Length: 1428 |
Total Length: 36 |
Identification: 0x51ea (20970) |
Identification: 0x51ea (20970) |
Flags: 0x0000 |
Flags: 0x00ae |
0 . . . . . . . . . . . . . . . = Reserved bit: Not set |
0 . . . . . . . . . . . . . .
. = Reserved bit: Not set |
. 0 . . . . . . . . . . . . . . = Don't fragment: Not set |
. 0 . . . . . . . . . . . . .
. = Don't fragment: Not set |
. . 0 . . . . . . . . . . . . . = More fragments: Not set |
. . 0 . . . . . . . . . . . . .
= More fragments: Not set |
. . .0 0000 00000000 = Fragment offset: 0 |
. . . 00000 10101110 = Fragment offset: 174 |
Time to live: 128 |
Time to live: 127 |
Protocol: ICMP (1) |
Protocol: ICMP (1) |
Header checksum: 0x5fc0 [validation
disabled] |
Header checksum: 0x6469 [validation disabled] |
Source:
192.168.1.10 |
Source: 192.168.1.97 |
Destination: 192.168.1.100 |
Destination: 192.168.1.110 |
Internet Control Message Protocol |
Internet Control Message Protocol |
Type: 8 (Echo (ping) request) |
Type: 8 (Echo (ping) request) |
Code: 0 |
Code: 0 |
Checksum: 0x86b5 [correct] |
Checksum: 0x86b5 [correct] |
[Checksum Status: Good] |
[Checksum Status: Good] |
Identifier (BE): 1 (0x0001) |
Identifier (BE): 1 (0x0001) |
Identifier (LE): 256 (0x0100) |
Identifier (LE): 256 (0x0100) |
Sequence number (BE): 3291 (0x0cdb) |
Sequence number (BE): 3291
(0x0cdb) |
Sequence number (LE): 56076 (0xdb0c) |
Sequence number (LE): 56076
(0xdb0c) |
Data (1400 bytes) |
Data (1400 bytes) |
Bytes Bytes
bytes bits
enviados recibidos modificados modificados (0 -> 1 o 1 -> 0)
4500 45b8 1 4
0594 0024 2 6
51ea 51ea
0000 00ae 1 5
8001 7f01 2 9
5fc0 6469 2 9
c0a8 c0a8
010a 0161 1 5
c0a8 c0a8
0164 016e 1 3
10
(de 20) 41 (de 160)
5.- Verificación:
5.1.- Verificación del NAT/PAT:
Podemos ver que la IP origen 192.168.1.10 se traduce a 192.168.1.97 y la IP destino 192.168.1.100 se traduce como 192.168.1.110.
Cisco1841#sh
ip nat translations
Pro
Inside global Inside
local Outside local Outside global
--- --- --- 192.168.1.100 192.168.1.110
icmp 192.168.1.97:1 192.168.1.10:1 192.168.1.100:1 192.168.1.110:1
|____ origen ___| |___ destino ___|
Cisco1841#
5.2.- Verificación del marcado de los paquetes con DSCP:
Cisco1841#sh
policy-map interface fa0/1
FastEthernet0/1
Service-policy output: DSCP
Class-map: QoS (match-all)
2913 packets, 289429 bytes
5
minute offered rate 0 bps, drop rate 0 bps
Match: any
QoS
Set
dscp ef
Packets marked 2425
Class-map: class-default (match-any)
0
packets, 0 bytes
5
minute offered rate 0 bps, drop rate 0 bps
Match: any
Cisco1841#
6.- Verificación del checksum “a pata”:
Podemos hacer la verficación manual del checksum de la cabecera sumando los dígitos hexadecimales
de a 16 bits y realizando una resta a FFFF que son los 16 bits en 1 del campo checksum, nos da el valor.
Dirección en la trama
| Valor hexadecimal
| |
0000 00 1b 38 7e f1 71 00 17 95 c0 ac a3 08 00 45 b8
0010 00 24 51 ea 00 ae 7f 01 64 69
c0 a8 01 61 c0 a8
0020 01 6e 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72
6.1.- Sumamos los valores de cada campo (de 16 bits) en hexa:
45b8 (versión + header length-DSCP)
0024 (total length)
51ea (id de paquete + fragmentos)
00ae (fragment offset (identificador de fragmentos))
7f01 (TTL + protcolo)
6469 (no se suma porque es el checksum mismo)
c0a8 (IP origen)
0161
c0a8 (IP destino)
016e
=
29b94 (nos da un número de mas de 16 bits, ese número se suma nuevamente)
9b94
+
2
=
9b96
6.2.- Realizamos la resta:
ffff
-
9b96
=
6469 (checksum, ver en la
captura)
7.- Configuración del router:
Cisco1841#sh runn (sólo lo mas relevante)
Building configuration...
Current configuration : 1029 bytes
!
version 12.4
!
hostname Cisco1841
!
!
class-map match-all QoS (matchea tráfico que nos interese etiquetar, en este caso todo)
match any
!
policy-map DSCP (aplica etiquetas (cambios de flags) a una clase de tráfico definida)
class QoS
set dscp ef
!
!
interface FastEthernet0/0
ip address 192.168.1.1 255.255.255.240 (vemos que es /28 para mantener los rangos 192.168.1.x)
ip nat inside
!
interface FastEthernet0/1
ip address 192.168.1.97 255.255.255.240 (vemos que es /28 para mantener los rangos 192.168.1.x)
ip mtu 68 (obliga la fragmentación de los paquetes)
ip nat outside
service-policy output DSCP (aplica la policy al tráfico de salida)
!
ip nat inside source list 10 interface
FastEthernet0/1 overload (traduce 192.168.1.10 en
192.168.1.97)
ip nat outside source static 192.168.1.110
192.168.1.100 (traduce 192.168.1.100 en 192.168.1.110)
!
access-list 10 permit 192.168.1.0 0.0.0.15 (tráfico interesante para aplicar PAT)
!
end
Cisco1841#
(2020) What
is the checksum of my mind ?
Rosario, Argentina