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é cómo 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 cómo 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:
