VPN Site-to-Site Cisco ASA

Dentro de los trabajos más importantes al implementar un firewall en una red, es la de interconectar sucursales a través de un medio no seguro, usando un método que asegure los datos viajando entre las sucursales.

Este método es la implementación de una VPN Site-to-Site, y en este post mostraré como configurarla entre un router y un ASA Cisco.

Para esta configuración se realizará lo siguiente:

  • Pruebas de conectividad
  • Habilitación de la GUI del firewall ASA (ASDM)
  • Configuración de NAT (PAT)
  • Inspeccionar ICMP en Cisco ASA
  • Configurar la VPN entre firewall y router
  • Ejemplo de como configurar la VPN por parte del ASA a través del ASDM
  • Realizar un no-NAT para el tráfico que pasa por el túnel VPN

La topología a usar es la siguiente:

A continuación, se muestra la configuración inicial de todos los equipos:

ASA1:

NOTA: los símbolos “!” permiten hacer comentarios en la configuración.

ASA1(config)# ! Configuracion de passwords
ASA1(config)# enable password Cisco123
ASA1(config)# username admin password Cisco123 privilege 15
ASA1(config)# ! Configuracion de interfaces
ASA1(config)# interface management 0/0
ASA1(config-if)# nameif management
INFO: Security level for "management" set to 0 by default.
ASA1(config-if)# security-level 100
ASA1(config-if)# management-only
ASA1(config-if)# ip add 192.168.20.6 255.255.255.0
ASA1(config-if)# no sh
ASA1(config-if)# interface g0/0
ASA1(config-if)# nameif inside
INFO: Security level for "inside" set to 100 by default.
ASA1(config-if)# ip add 172.16.10.1 255.255.255.0
ASA1(config-if)# no sh
ASA1(config-if)# interface g0/1
ASA1(config-if)# nameif outside
INFO: Security level for "outside" set to 0 by default.
ASA1(config-if)# ip add 200.10.10.1 255.255.255.0
ASA1(config-if)# no sh
ASA1(config-if)# exit
ASA1(config)# ! Habilitamos el servicio HTTP y que solo puedan acceder a el
ASA1(config)# ! desde la red 192.168.20.0/24
ASA1(config)# http server enable
ASA1(config)# http 192.168.20.0 255.255.255.0 management
ASA1(config)# ! Establecimos la ruta por defecto hacia Internet
ASA1(config)# route outside 0.0.0.0 0.0.0.0 200.10.10.2
ASA1(config)# ! Definimos lo parametros para trabajar con ASDM
ASA1(config)# ! y habilitamos el logging para visualizarlo en el ASDM
ASA1(config)# asdm image disk0:/asdm-792-152.bin
ASA1(config)# logging asdm 7
ASA1(config)# logging enable
ASA1(config)# ! Permitimos la inspeccion de ICMP para pasar este trafico
ASA1(config)# ! a traves del ASA
ASA1(config)# policy-map global_policy
ASA1(config-pmap)# class inspection_default
ASA1(config-pmap-c)# inspect icmp

Internet:

Internet(config)#int g0/1
Internet(config-if)#description TO-ASA1
Internet(config-if)#ip add 200.10.10.2 255.255.255.0
Internet(config-if)#no sh
Internet(config-if)#
*May 12 00:39:40.437: %LINK-3-UPDOWN: Interface GigabitEthernet0/1, changed state to up
*May 12 00:39:41.437: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/1, changed state to up
Internet(config-if)#int g0/0
Internet(config-if)#description TO-R1
Internet(config-if)#ip add 200.20.20.2 255.255.255.0
Internet(config-if)#no sh
Internet(config-if)#
*May 12 00:40:20.160: %LINK-3-UPDOWN: Interface GigabitEthernet0/0, changed state to up
*May 12 00:40:21.160: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0, changed state to up
Internet(config-if)#

R1:

R1(config)#int g0/0
R1(config-if)#description TO-Internet
R1(config-if)#ip add 200.20.20.1 255.255.255.0
R1(config-if)#no sh
R1(config-if)#
*May 12 00:43:12.879: %LINK-3-UPDOWN: Interface GigabitEthernet0/0, changed state to up
*May 12 00:43:13.879: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0, changed state to up
R1(config-if)#int g0/1
R1(config-if)#description TO-LAN
R1(config-if)#ip add 10.0.10.1 255.255.255.0
R1(config-if)#no sh
R1(config-if)#
*May 12 00:44:26.684: %LINK-3-UPDOWN: Interface GigabitEthernet0/1, changed state to up
*May 12 00:44:27.684: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/1, changed state to up
R1(config-if)#exit
R1(config)#ip route 0.0.0.0 0.0.0.0 200.20.20.2

Si realizamos pruebas de conectividad entre todos los dispositivos, podemos asegurarnos que no tendremos problemas al levantar la VPN:

PC1-ASA1:

PC1> ping 172.16.10.1

84 bytes from 172.16.10.1 icmp_seq=1 ttl=255 time=1.791 ms
84 bytes from 172.16.10.1 icmp_seq=2 ttl=255 time=0.778 ms
84 bytes from 172.16.10.1 icmp_seq=3 ttl=255 time=0.776 ms
^C
PC1>

Internet-ASA1/R1:

Internet#ping 200.10.10.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 200.10.10.1, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 2/2/3 ms
Internet#ping 200.20.20.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 200.20.20.1, timeout is 2 seconds:
.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 3/3/4 ms
Internet#

ASA1-R1:

R1#ping 200.10.10.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 200.10.10.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 3/4/5 ms
R1#

PC2-R1:

PC2> ping 10.0.10.1

84 bytes from 10.0.10.1 icmp_seq=1 ttl=255 time=2.617 ms
84 bytes from 10.0.10.1 icmp_seq=2 ttl=255 time=1.491 ms
84 bytes from 10.0.10.1 icmp_seq=3 ttl=255 time=1.307 ms
^C
PC2>

Lo normal en una red, es la implementación del servicio NAT (Network Address Translation), con el fin de poder tener acceso a Internet:

R1:

R1(config)#! Indicamos el trafico que sera nateado
R1(config)#ip access-list extended NAT
R1(config-ext-nacl)#10 permit ip 10.0.10.0 0.0.0.255 any
R1(config-ext-nacl)#exit
R1(config)#! Definimos el NAT por overload (PAT)
R1(config)#ip nat inside source list NAT interface g0/0 overload
R1(config)#interface 
*May 13 00:38:15.194: %LINEPROTO-5-UPDOWN: Line protocol on Interface NVI0, changed state to up
R1(config)#! Especificamos cual es la interfaz de input y output del NAT
R1(config)#interface g0/0
R1(config-if)#ip nat outside
R1(config-if)#int g0/1
R1(config-if)#ip nat inside

Para este caso, cuando definimos el tráfico que será nateado en la ACL, utilizamos una Access Control List extendida, con la finalidad de realizar la excepción de NAT para la VPN (también conocido como no-NAT).

ASA1(config)# object network INSIDE_NETWORK
ASA1(config-network-object)# ! Indicamos cual será la red a natear
ASA1(config-network-object)# subnet 172.16.10.0 255.255.255.0
ASA1(config-network-object)# ! Hacemos un mapeo de las interfaces
ASA1(config-network-object)# ! y se hara un NAT con la IP de la
ASA1(config-network-object)# ! interfaz outside
ASA1(config-network-object)# nat (inside,outside) dynamic interface

En un Cisco ASA, se realiza un object NAT, donde se especifica la red que se quiere natear con el comando subnet, y luego con el comando nat (dentro del object network) se realiza un mapeo indicando que se nateará desde la interfaz inside pasando el tráfico a la interfaz outside, y luego se hará un PAT usando la IP de la interfaz mapeada (la interfaz outside).

NOTA: es una buena práctica crear object, debido que después pueden ser utilizados en múltiples ocasiones, y mantiene ordenada la configuración.

Si revisamos si se está realizando el NAT, usamos el comando show ip nat translations en R1 y show xlate en ASA1:

----# R1 #----

R1#sh ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
icmp 200.20.20.1:5014  10.0.10.2:5014     200.10.10.1:5014   200.10.10.1:5014
icmp 200.20.20.1:5270  10.0.10.2:5270     200.10.10.1:5270   200.10.10.1:5270
icmp 200.20.20.1:5526  10.0.10.2:5526     200.10.10.1:5526   200.10.10.1:5526
icmp 200.20.20.1:5782  10.0.10.2:5782     200.10.10.1:5782   200.10.10.1:5782
icmp 200.20.20.1:6038  10.0.10.2:6038     200.10.10.1:6038   200.10.10.1:6038

----# ASA1 #----

ASA1# sh xlate 
5 in use, 5 most used
Flags: D - DNS, e - extended, I - identity, i - dynamic, r - portmap,
       s - static, T - twice, N - net-to-net

ICMP PAT from inside:172.16.10.2/9110 to outside:200.10.10.1/9110 flags ri idle 0:00:02 timeout 0:00:30
ICMP PAT from inside:172.16.10.2/8854 to outside:200.10.10.1/8854 flags ri idle 0:00:03 timeout 0:00:30
ICMP PAT from inside:172.16.10.2/8598 to outside:200.10.10.1/8598 flags ri idle 0:00:04 timeout 0:00:30
ICMP PAT from inside:172.16.10.2/8342 to outside:200.10.10.1/8342 flags ri idle 0:00:05 timeout 0:00:30
ICMP PAT from inside:172.16.10.2/8086 to outside:200.10.10.1/8086 flags ri idle 0:00:06 timeout 0:00:30

Ahora configuramos la VPN, partiendo por R1 (para sabe como funciona una VPN Site-to-Site, chequear el post Teoría y configuración de IPSec en Router Cisco).

R1:

R1(config)#! Configuramos el isakmp policy para la negociacion con el peer
R1(config)#crypto isakmp policy 10
R1(config-isakmp)#authentication pre-share
R1(config-isakmp)#encryption aes 256
R1(config-isakmp)#group 5
R1(config-isakmp)#hash sha
R1(config-isakmp)#exit
R1(config)#! Indicamos cual es el peer y la PSK para autenticarlo
R1(config)#crypto isakmp key CiscoVPN address 200.10.10.1
R1(config)#! Configuramos lo parametros que se utilizaran para
R1(config)#! asegurar el trafico que pasa por el tunel
R1(config)#crypto ipsec transform-set TSET esp-aes 128 esp-sha-hmac
R1(cfg-crypto-trans)#exit
R1(config)#! Definimos cual es el trafico interesante
R1(config)#ip access-list extended ACL_VPN
R1(config-ext-nacl)#permit ip 10.0.10.0 0.0.0.255 any
R1(config-ext-nacl)#exit
R1(config)#! Agrupamos todo lo anterior en un crypto map y lo
R1(config)#! habilitamos en la interfaz de salida
R1(config)#crypto map CMAP 10 ipsec-isakmp
% NOTE: This new crypto map will remain disabled until a peer
        and a valid access list have been configured.
R1(config-crypto-map)#set transform-set TSET
R1(config-crypto-map)#set peer 200.10.10.1
R1(config-crypto-map)#match address ACL_VPN
R1(config-crypto-map)#exit
R1(config)#interface g0/0
R1(config-if)#crypto map CMAP
R1(config-if)#
*May 13 01:49:29.918: %CRYPTO-6-ISAKMP_ON_OFF: ISAKMP is ON
R1(config-if)#

ASA1:

Primero configuramos el IKEv1 Policy y habilitamos el protocolo en la interfaz outside (en versiones antiguas, se usa el comando ISAKMP), para así poder empezar la negociación con el peer VPN y construir un IPsec Security Association (SA):

ASA1(config)# crypto ikev1 policy 10
ASA1(config-ikev1-policy)# authentication pre-share
ASA1(config-ikev1-policy)# encryption aes-256
ASA1(config-ikev1-policy)# group 5
ASA1(config-ikev1-policy)# hash sha
ASA1(config-ikev1-policy)# exit
ASA1(config)# crypto ikev1 enable outside

Configuramos el transform-set, el cual es utilizado para indicar cómo se protegerán los datos de los clientes que pasen a través del túnel:

ASA1(config)# crypto ipsec transform-set TSET esp-aes esp-sha-hmac

Definimos el tráfico interesante para indicar los datos pasarán por la VPN y no se irán hacia Internet:

ASA1(config)# object network R1_LAN
ASA1(config-network-object)# subnet 10.0.10.0 255.255.255.0
ASA1(config-network-object)# exit
ASA1(config)# access-list VPN extended permit ip object INSIDE_NETWORK object R1_LAN

Ahora es necesario indicar los parámetros del túnel, donde el nombre de este corresponde a la IP del peer de la VPN, especificamos el tipo de túnel que será, donde l2l corresponde a LAN-to-LAN (Site-to-Site), y en los atributos definimos la PSK para negociar con el vecino:

ASA1(config)# tunnel-group 200.20.20.1 type ipsec-l2l
ASA1(config)# tunnel-group 200.20.20.1 ipsec-attributes
ASA1(config-tunnel-ipsec)# pre-shared-key CiscoVPN

Y por último, definimos y aplicamos el crypto map, en el cual se aplica todo lo configurado antes:

ASA1(config)# crypto map CMAP 10 match address VPN
ASA1(config)# crypto map CMAP 10 set peer 200.20.20.1
ASA1(config)# crypto map CMAP 10 set transform-set TSET
ASA1(config)# crypto map CMAP interface outside

NOTA: es necesario tener en cuenta que en una interfaz solo se puede aplicar un solo crypto map, por lo tanto, para cada túnel VPN que se quiera levantar, se cambia el número de secuencia del crypto map.

Luego de tener la VPN configurada en ambos extremos, es necesario realizar una excepción de NAT para que pase el tráfico a través de esta, y que no se realice el NAT:

R1:

R1(config)#ip access-list extended NAT
R1(config-ext-nacl)#5 deny ip 10.0.10.0 0.0.0.255 172.16.10.0 0.0.0.255

En un router, al momento de usar la sintaxis deny, se le indica al equipo que no realice el nateo de un tráfico que va desde una red a otra.

ASA1:

ASA1(config)# nat (inside,outside) source static INSIDE_NETWORK INSIDE_NETWORK destination static R1_LAN R1_LAN

En un firewall Cisco ASA con una versión de software 8.3 o mayor, para hacer un no-NAT, es necesario realizar un NAT de una red sobre esa misma red, pero en un ASA con una versión inferior, se utiliza el número de nat “0”:

ASA1(config)# access-list NO_NAT permit ip 172.16.10.0 255.255.255.0 10.0.10.0 255.255.255.0
ASA1(config)# nat (inside) 0 access-list NO_NAT

Realizamos pruebas, y validamos que levante la VPN y pase tráfico por él:

PC1> ping 10.0.10.1

10.0.10.1 icmp_seq=1 timeout
84 bytes from 10.0.10.1 icmp_seq=2 ttl=255 time=8.285 ms
84 bytes from 10.0.10.1 icmp_seq=3 ttl=255 time=7.121 ms
84 bytes from 10.0.10.1 icmp_seq=4 ttl=255 time=7.324 ms
84 bytes from 10.0.10.1 icmp_seq=5 ttl=255 time=7.215 ms

Como podemos ver, el primer ping se pierde debido que se está levantando el túnel entre el firewall y el router.

Ahora vemos el estado del túnel en ambos extremos:

R1:

R1#! Validamos la fase 1
R1#show crypto isakmp sa
IPv4 Crypto ISAKMP SA
dst             src             state          conn-id status
200.20.20.1     200.10.10.1     QM_IDLE           1001 ACTIVE

IPv6 Crypto ISAKMP SA
R1#! Validamos la fase 2
R1#show crypto ipsec sa 

interface: GigabitEthernet0/0
    Crypto map tag: CMAP, local addr 200.20.20.1

   protected vrf: (none)
   local  ident (addr/mask/prot/port): (10.0.10.0/255.255.255.0/0/0)
   remote ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0)
   current_peer 200.10.10.1 port 500
     PERMIT, flags={origin_is_acl,}
    #pkts encaps: 0, #pkts encrypt: 0, #pkts digest: 0
    #pkts decaps: 0, #pkts decrypt: 0, #pkts verify: 0
    #pkts compressed: 0, #pkts decompressed: 0
    #pkts not compressed: 0, #pkts compr. failed: 0
    #pkts not decompressed: 0, #pkts decompress failed: 0
    #send errors 0, #recv errors 0

     local crypto endpt.: 200.20.20.1, remote crypto endpt.: 200.10.10.1
     plaintext mtu 1500, path mtu 1500, ip mtu 1500, ip mtu idb GigabitEthernet0/0
     current outbound spi: 0x0(0)
     PFS (Y/N): N, DH group: none

     inbound esp sas:
          
     inbound ah sas:

     inbound pcp sas:

     outbound esp sas:

     outbound ah sas:

     outbound pcp sas:

   protected vrf: (none)
   local  ident (addr/mask/prot/port): (10.0.10.0/255.255.255.0/0/0)
   remote ident (addr/mask/prot/port): (172.16.10.0/255.255.255.0/0/0)
   current_peer 200.10.10.1 port 500
     PERMIT, flags={}
    #pkts encaps: 4, #pkts encrypt: 4, #pkts digest: 4
    #pkts decaps: 4, #pkts decrypt: 4, #pkts verify: 4
    #pkts compressed: 0, #pkts decompressed: 0
    #pkts not compressed: 0, #pkts compr. failed: 0
    #pkts not decompressed: 0, #pkts decompress failed: 0
    #send errors 0, #recv errors 0

     local crypto endpt.: 200.20.20.1, remote crypto endpt.: 200.10.10.1
     plaintext mtu 1438, path mtu 1500, ip mtu 1500, ip mtu idb GigabitEthernet0/0
     current outbound spi: 0x9D36BF92(2637610898)
     PFS (Y/N): N, DH group: none

     inbound esp sas:
      spi: 0xB6227DB9(3055713721)
        transform: esp-aes esp-sha-hmac ,
        in use settings ={Tunnel, }
        conn id: 1, flow_id: SW:1, sibling_flags 80000040, crypto map: CMAP
        sa timing: remaining key lifetime (k/sec): (4288922/3550)
        IV size: 16 bytes
        replay detection support: Y
        Status: ACTIVE(ACTIVE)

     inbound ah sas:

     inbound pcp sas:

     outbound esp sas:
      spi: 0x9D36BF92(2637610898)
        transform: esp-aes esp-sha-hmac ,
        in use settings ={Tunnel, }
        conn id: 2, flow_id: SW:2, sibling_flags 80000040, crypto map: CMAP
        sa timing: remaining key lifetime (k/sec): (4288922/3550)
        IV size: 16 bytes
        replay detection support: Y
        Status: ACTIVE(ACTIVE)

     outbound ah sas:

     outbound pcp sas:
R1#

ASA1:

ASA1# ! Validamos la fase 1
ASA1# show crypto ikev1 sa

IKEv1 SAs:

   Active SA: 1
    Rekey SA: 0 (A tunnel will report 1 Active and 1 Rekey SA during rekey)
Total IKE SA: 1

1   IKE Peer: 200.20.20.1
    Type    : L2L             Role    : initiator 
    Rekey   : no              State   : MM_ACTIVE 
ASA1# ! Validamos la fase 2
ASA1# show crypto ipsec sa
interface: outside
    Crypto map tag: CMAP, seq num: 10, local addr: 200.10.10.1

      access-list VPN extended permit ip 172.16.10.0 255.255.255.0 10.0.10.0 255.255.255.0 
      local ident (addr/mask/prot/port): (172.16.10.0/255.255.255.0/0/0)
      remote ident (addr/mask/prot/port): (10.0.10.0/255.255.255.0/0/0)
      current_peer: 200.20.20.1


      #pkts encaps: 4, #pkts encrypt: 4, #pkts digest: 4
      #pkts decaps: 4, #pkts decrypt: 4, #pkts verify: 4
      #pkts compressed: 0, #pkts decompressed: 0
      #pkts not compressed: 4, #pkts comp failed: 0, #pkts decomp failed: 0
      #pre-frag successes: 0, #pre-frag failures: 0, #fragments created: 0
      #PMTUs sent: 0, #PMTUs rcvd: 0, #decapsulated frgs needing reassembly: 0
      #TFC rcvd: 0, #TFC sent: 0
      #Valid ICMP Errors rcvd: 0, #Invalid ICMP Errors rcvd: 0
      #send errors: 0, #recv errors: 0

      local crypto endpt.: 200.10.10.1/0, remote crypto endpt.: 200.20.20.1/0
      path mtu 1500, ipsec overhead 74(44), media mtu 1500
      PMTU time remaining (sec): 0, DF policy: copy-df
      ICMP error validation: disabled, TFC packets: disabled
      current outbound spi: B6227DB9
      current inbound spi : 9D36BF92

    inbound esp sas:
      spi: 0x9D36BF92 (2637610898)
         SA State: active
         transform: esp-aes esp-sha-hmac no compression 
         in use settings ={L2L, Tunnel, IKEv1, }
         slot: 0, conn_id: 1, crypto-map: CMAP
         sa timing: remaining key lifetime (kB/sec): (4373999/3568)
         IV size: 16 bytes
         replay detection support: Y
         Anti replay bitmap: 
          0x00000000 0x0000001F
    outbound esp sas:
      spi: 0xB6227DB9 (3055713721)
         SA State: active
         transform: esp-aes esp-sha-hmac no compression 
         in use settings ={L2L, Tunnel, IKEv1, }
         slot: 0, conn_id: 1, crypto-map: CMAP
         sa timing: remaining key lifetime (kB/sec): (4373999/3568)
         IV size: 16 bytes
         replay detection support: Y
         Anti replay bitmap: 
          0x00000000 0x00000001

ASA1#

Como podemos ver, la VPN levanta sin problemas y pasa tráfico a través de él.

Ahora mostraré como se configura la VPN del ASA, pero usando el ASDM.

NOTA: si se conectan al ASDM con un usuario privilegio 15 y no pueden acceder a todos los menús, chequear que su antivirus no esté dando problemas.

La primera opción, es configurar la VPN usando el VPN Wizards:

La segunda opción, es configurar la VPN en el menú de configuración:

1. Luego definimos un Connection Profile: Configuration > Site-to-Site VPN > Connection Profiles

En esta versión de ASDM (7.9.2), el no-NAT se configura en la configuración general de NAT:

Luego de dar OK, le damos en Apply en la parte inferior de la ventana.

2. Y ahora configuramos la regla del no-NAT:

Al final recordar de dar clic en Apply para enviar la configuración al ASA.

Ahora validamos el estado de la VPN, primero viendo las conexiones pasar por la VPN:

ASA1# show conn all
5 in use, 12 most used

ESP outside 200.20.20.1 NP Identity Ifc  200.10.10.1, idle 0:00:00, bytes 11532, flags  
UDP outside  200.20.20.1:500 NP Identity Ifc  200.10.10.1:500, idle 0:01:48, bytes 1756, flags - 
TCP management  192.168.20.27:56866 NP Identity Ifc  192.168.20.6:443, idle 0:00:02, bytes 21269, flags UOB 
TCP management  192.168.20.27:56860 NP Identity Ifc  192.168.20.6:443, idle 0:00:00, bytes 78716, flags UOB 
ESP outside 200.20.20.1 NP Identity Ifc  200.10.10.1, idle 0:00:00, bytes 11532, flags  
ASA1#

Y podemos ver las sesiones VPN en el ASDM: Monitoring > VPN > Sessions

Y si le damos doble clic en el Connection Profile, podemos ver más información:

Agregar un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *