Autenticación protocolo EIGRP

eigrp

Una de las buenas prácticas de seguridad al momento de implementar EIGRP, es autenticar los mensajes provenientes de sus vecinos, con la finalidad de prevenir que un dispositivo que envíe mensajes EIGRP, y que no pertenezca a la administración del encargado de TI, haga vecindad con nuestros equipos.

Para impedir información no autorizada proveniente desde un origen desconocido, EIGRP utiliza una autenticación basada en el algoritmo MD5 (Message Digest 5), y este es configurado por interfaz.

Para la demostración de la configuración de esto, se utilizará la siguiente topología:

eigrp01

Podemos observar que los equipos tienen vecindad en EIGRP:

R1#sh ip eigrp neighbors 
EIGRP-IPv4 Neighbors for AS(10)
H   Address                 Interface              Hold Uptime   SRTT   RTO  Q  Seq
                                                   (sec)         (ms)       Cnt Num
0   10.12.12.2              Fa0/0                    11 00:00:10   68   408  0  3

Lo primero que vamos a hacer para configurar la autenticación, será crear la llave:

R1(config)#key chain KCHAIN
R1(config-keychain)#key 1
R1(config-keychain-key)#key-string C1$c0

Luego de tener esto configurado, es necesario aplicarlo en la interfaz donde queremos que se autentiquen los usuarios:

R1(config-keychain-key)#int f0/0
R1(config-if)#ip authentication mode eigrp 10 md5
R1(config-if)#
*Nov 27 14:46:57.507: %DUAL-5-NBRCHANGE: EIGRP-IPv4 10: Neighbor 10.12.12.2 (FastEthernet0/0) is down: authentication mode changed
R1(config-if)#ip authentication key-chain eigrp 10 KCHAIN

Como podemos ver, al momento de ingresar el modo de autenticación en la interfaz, se pierde la vecindad con R2, y el mensaje log especifica que es debido a un cambio de la autenticación: *Nov 27 14:46:57.507: %DUAL-5-NBRCHANGE: EIGRP-IPv4 10: Neighbor 10.12.12.2 (FastEthernet0/0) is down: authentication mode changed.

Es necesario tener en cuenta, que cuando se configura la autenticación en la interfaz, no se especifica el key-string, es el key chain, debido que se pueden tener varias llaves de autenticación.

Al momento de configurar la autenticación en R2, la vecindad entre estos levanta una vez más:

R2(config)#do sh ip ei ne
EIGRP-IPv4 Neighbors for AS(10)
R2(config)#key chain llaves
R2(config-keychain)#key 1 
R2(config-keychain-key)#key-string C1$c0
R2(config-keychain-key)#int f0/0
R2(config-if)#ip authentication mode eigrp 10 md5 
R2(config-if)#ip authentication key-chain eigrp 10 llaves
R2(config-if)#
*Nov 27 15:00:03.635: %DUAL-5-NBRCHANGE: EIGRP-IPv4 10: Neighbor 10.12.12.1 (FastEthernet0/0) is up: new adjacency
R2(config-if)#do sh ip ei ne
EIGRP-IPv4 Neighbors for AS(10)
H   Address                 Interface              Hold Uptime   SRTT   RTO  Q  Seq
                                                   (sec)         (ms)       Cnt Num
0   10.12.12.1              Fa0/0                    14 00:00:06   40   240  0  9
R2(config-if)#

Consideraciones para configurar la autenticación entre dos vecinos EIGRP:

  • Es necesario que, en ambos lados la llave sea la misma (key id), si es distinta, no levanta la vecindad:
R2(config)#key chain llaves
R2(config-keychain)#key 2
R2(config-keychain-key)#key-string C1$c0
R2(config-keychain-key)#exit
R2(config-keychain)#no key 1
R2(config-keychain)#
*Nov 27 15:12:15.499: %DUAL-5-NBRCHANGE: EIGRP-IPv4 10: Neighbor 10.12.12.1 (FastEthernet0/0) is down: Auth failure

------ ## R1  ## ------

R1#debug eigrp packets 
    (UPDATE, REQUEST, QUERY, REPLY, HELLO, IPXSAP, PROBE, ACK, STUB, SIAQUERY, SIAREPLY)
EIGRP Packet debugging is on
R1#
*Nov 27 15:34:28.115: EIGRP: Sending HELLO on Fa0/0 - paklen 60
*Nov 27 15:34:28.119:   AS 10, Flags 0x0:(NULL), Seq 0/0 interfaceQ 0/0 iidbQ un/rely 0/0
*Nov 27 15:34:28.119:   {type = 2, length = 40}
*Nov 27 15:34:28.119:   {vector = {
*Nov 27 15:34:28.119:             {00020010 00000001 00000000 00000000 00000000 9B793B91 7CE8F536 7A96A35C}
*Nov 27 15:34:28.119:             {A76E32A4}
*Nov 27 15:34:28.119:   }
*Nov 27 15:34:28.119:   {type = 1, length = 12}
*Nov 27 15:34:28.119:   {vector = {
*Nov 27 15:34:28.119:             {01000100 0000000F}
*Nov 27 15:34:28.119:   }
*Nov 27 15:34:28.119:   {type = 4, length = 8}
*Nov 27 15:34:28.119:   {vector = {
R1#
*Nov 27 15:34:28.119:             {0A000200}
*Nov 27 15:34:28.119:   }
R1#
*Nov 27 15:34:31.095: EIGRP: received packet with MD5 authentication, key id = 1
*Nov 27 15:34:31.095: EIGRP: Received HELLO on Fa0/0 - paklen 60 nbr 10.12.12.2
*Nov 27 15:34:31.099:   AS 10, Flags 0x0:(NULL), Seq 0/0 interfaceQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/0
*Nov 27 15:34:31.103:   {type = 2, length = 40}
*Nov 27 15:34:31.103:   {vector = {
*Nov 27 15:34:31.103:             {00020010 00000001 00000000 00000000 00000000 43312463 30000000 00000000}
*Nov 27 15:34:31.107:             {00000000}
*Nov 27 15:34:31.107:   }
*Nov 27 15:34:31.107:   {type = 1, length = 12}
*Nov 27 15:34:31.107:   {vector = {
*Nov 27 15:34:31.107:             {01000100 0000000F}
R1#
*Nov 27 15:34:31.107:   }
*Nov 27 15:34:31.107:   {type = 4, length = 8}
*Nov 27 15:34:31.107:   {vector = {
*Nov 27 15:34:31.107:             {0A000200}
*Nov 27 15:34:31.107:   }
R1#
*Nov 27 15:34:33.119: EIGRP: Sending HELLO on Fa0/0 - paklen 60
*Nov 27 15:34:33.123:   AS 10, Flags 0x0:(NULL), Seq 0/0 interfaceQ 0/0 iidbQ un/rely 0/0
*Nov 27 15:34:33.123:   {type = 2, length = 40}
*Nov 27 15:34:33.127:   {vector = {
*Nov 27 15:34:33.127:             {00020010 00000001 00000000 00000000 00000000 9B793B91 7CE8F536 7A96A35C}
*Nov 27 15:34:33.139:             {A76E32A4}
*Nov 27 15:34:33.139:   }
*Nov 27 15:34:33.139:   {type = 1, length = 12}
*Nov 27 15:34:33.139:   {vector = {
*Nov 27 15:34:33.139:             {01000100 0000000F}
*Nov 27 15:34:33.139:   }
*Nov 27 15:34:33.139:   {type = 4, length = 8}
*Nov 27 15:34:33.139:   {vector = {
*Nov 27 15:34:33.139:             {0A000200}
*Nov 27 15:34:33.139:   }
*Nov 27 15:34:33.179: EIGRP: pkt authentication key id = 2, key not defined
*Nov 27 15:34:33.179: EIGRP: Fa0/0: ignored packet from 10.12.12.2, opcode = 5 (invalid authentication)
*Nov 27 15:34:33.179: EIGRP: Dropping peer, invalid authenticatio
R1#
*Nov 27 15:34:33.179: EIGRP: Sending HELLO on Fa0/0 - paklen 60
*Nov 27 15:34:33.179:   AS 10, Flags 0x0:(NULL), Seq 0/0 interfaceQ 0/0 iidbQ un/rely 0/0
*Nov 27 15:34:33.179:   {type = 2, length = 40}
*Nov 27 15:34:33.179:   {vector = {
*Nov 27 15:34:33.179:             {00020010 00000001 00000000 00000000 00000000 9B793B91 7CE8F536 7A96A35C}
*Nov 27 15:34:33.179:             {A76E32A4}
*Nov 27 15:34:33.183:   }
*Nov 27 15:34:33.183:   {type = 1, length = 12}
*Nov 27 15:34:33.183:   {vector = {
*Nov 27 15:34:33.183:             {FFFFFFFF FFFF000F}
*Nov 27 15:34:33.183:   }
*Nov 27 15:34:33.183:   {type = 4, length = 8}
*Nov 27 15:34:33.183:   {vector = {
*Nov 27 15:34:33.183:             {0A000200}
*Nov 27 15:34:33.183:   }
*Nov 27 15:34:33.187: %DUAL-5-NBRCHANGE: EIGRP-IPv4 10: Neighbor 10.12.12.2 (FastEthernet0/0) is down: Auth failure
*Nov 27 15:34:33.187: EIGRP: Lost Peer: Total 1 (4/0/0/0/0)
R1#

Key id R1:

eigrp02

Key id R2:

eigrp03

El valor del key-string deben hacer match. El nombre del key chain puede ser diferente en ambos extremos. El key-string es guardado en texto plano:

R1#sh key chain 
Key-chain KCHAIN:
    key 1 -- text "C1$c0"
        accept lifetime (always valid) - (always valid) [valid now]
        send lifetime (always valid) - (always valid) [valid now]