Una de Cisco ASA, Google Cloud Platform y BGP
Hace poco, nos entró una solicitud interesante. Lo que nos estaban pidiendo, no era seguir un simple manual, aunque tampoco era inventar un cohete :-(. La considero interesante porque nos proponía un pequeño reto, y sobre todo aportaba valor a un cliente.
Nuestro punto de partida era el siguiente, teníamos un equipamiento Cisco ASA 5508 y conexión con GCP (Google Cloud Platform) mediante un túnel IPSEC. Todo funcionaba bastante bien, pero se había introducido un nuevo requisito. Nos estaban pidiendo, permitir acceder desde varias redes locales, mediante el túnel, a su infraestructura en GCP.
Análisis
Nuestra primera acción, fue consultar la documentación de google (https://cloud.google.com/vpn/docs/how-to/interop-guides), con el fin de verificar inter operatividad. Ahí, teníamos un ejemplo de un Cisco ASA 5505, el cual, sólo permitía túneles basado en políticas (policy based). El problema que nos encontramos, era que por una incompatibilidad con Cisco, no podíamos pasar más de una red a la hora de hacer la asociación. Esto nos bloqueaba, no dándonos ninguna opción. Podríamos hacer algún tipo de “cambalache” cambiando las máscaras de las redes, no siendo nada elegante, ni profesional.
Según la documentación oficial, tendríamos que haber cambiado de dispositivo en el lado del cliente. Eso hubiese ocasionado un gasto extra, además de retrasar tiempos, planificación, etc ….
Existía documentación de otros modelos de cisco, que permitía otros tipos de túneles. Tenía dos opciones con GCP:
- Tunnel based (rutas estáticas)
- BGP (rutas dinámicas)
Tenerlo de manera dinámica, sólo nos costaba un pequeño esfuerzo extra para montar un cloud router. Pero con ese pequeño esfuerzo, conseguíamos una serie de ventajas:
- Poder cambiar las redes que atraviesan el túnel sin tener que borrar el túnel y volver a crearlo.
- Disponer de una arquitectura, que esté preparada para tener backup de conexiones, en la cual, sus rutas, se configuren de forma automática.
Implementación
Primero comprobamos que el Cisco era capaz de trabajar con BGP. Al ver que era compatible, ya nos pusimos “manos a la obra”.
Voy a poner aquí la parte de la configuración referida al túnel con GCP. Suponemos que ya tenemos nuestro Cisco configurado, tiene comunicación con las dos redes internas y está configurado a internet con una ip pública (GCP no permite net-trasversal).
Nuestro punto de partida es:
Las dos redes internas son:
- 192.168.1.0/24
- 192.168.2.0/24
La red de GCP es:
- 10.132.0.0/20
La ip de salida del Cisco es:
- 193.143.23.12 (es totalmente inventada)
La ip del router de VPN de GCP es:
- 204.23.43.56 (es totalmente inventada)
La clave compartida de ISPEC es:
- EstaEsUnaClaveMala (que nunca deberías usar)
Para el BGP:
- El identificador del router de GCP es 65001
- Nuestro peer se compone de:
- IP GCP: 169.254.0.5
- IP Peer: 169.254.0.6
- Identificador BGP peer: 65003
Creamos unos objetos de red, simplificando la configuración:
object-group network gcp-networks
network 10.132.0.0 255.255.240.0
exit
object-group network on-premise-networks
network 192.168.1.0 255.255.255.0
network 192.168.2.0 255.255.255.0
exit
Hacemos un access-list para permitir el tráfico desde GCP hacia esas redes (no he creado un access-list inverso, al no ser necesario en mi caso).
access-list gcp-filter extended permit ip object-group gcp-networks object-group on-premise-networks
De esta manera, nos hemos ahorrado tener que escribir 1 access-list, porque queremos acceder de 2 redes a 1, pero si el acceso fuese de 5 redes a 4 redes, tendríamos que escribir 20 access-list. ¿ Ves ahora la ventaja ? Además nuestra configuración se queda mucho más limpia para leerla, entenderla y mantenerla. Recuerda, una configuración se escribe una vez y se lee n veces.
Continuamos con la primera fase de IPSEC (outside es la interfaz de salida).
crypto ikev2 policy 100
encryption aes-256
integrity sha512
group 14
prf sha
lifetime seconds 86400
exit
crypto ipsec ikev2 ipsec-proposal gcp
protocol esp encryption aes-256
protocol esp integrity sha-1
exit
group-policy gcp internal
group-policy gcp attributes
vpn-filter value gcp-filter
vpn-tunnel-protocol ikev2
exit
tunnel-group 204.23.43.56 type ipsec-l2l
tunnel-group 204.23.43.56 general-attributes
default-group-policy gcp
exit
tunnel-group 204.23.43.56 ipsec-attributes
isakmp keepalive threshold 10 retry 3
ikev2 remote-authentication pre-shared-key EstaEsUnaClaveMala
ikev2 local-authentication pre-shared-key EstaEsUnaClaveMala
exit
no crypto isakmp nat-traversal
crypto ikev2 enable outside
De esta forma, ya podríamos hacer “show crypto ikev2 sa”, viendo la asociación (siempre y cuando tengas configurado la parte de GCP).
Ahora vamos con la segunda fase.
crypto ipsec profile profile-gcp
set ikev2 ipsec-proposal gcp
set pfs group14
set security-association lifetime seconds 10800
exit
interface Tunnel1
nameif TunGCP
ip address 169.254.0.6 255.255.255.252
tunnel source interface outside
tunnel destination 204.23.43.56
tunnel mode ipsec ipv4
tunnel protection ipsec profile profile-gcp
exit
En este punto, tenemos el túnel levantado, sin ninguna red enrutada, para eso, debemos hacer lo siguiente:
router bgp 65003
bgp log-neighbor-changes
timers bgp 10 30 0
address-family ipv4 unicast
neighbor 169.254.0.5 remote-as 65001
neighbor 169.254.0.5 description BGP session over Tunnel
neighbor 169.254.0.5 activate
network 192.168.1.0 mask 255.255.255.0
network 192.168.2.0 mask 255.255.255.0
no auto-summary
no synchronization
exit-address-family
En este momento, el túnel está 100% operativo y a nuestro cliente contento, que no olvidemos, es lo más importante.
A continuación, expongo un ejemplo completo de configuración. En este laboratorio, usé una fibra de telefónica, por eso uso PPoE, enrutando sólo una red.
Por favor, me gustaría oír tus comentarios, siempre estamos en un proceso de mejora continua.
Referencias:
- https://cloud.google.com/
- https://www.cisco.com
- https://cloud.google.com/vpn/docs/how-to/creating-vpn-dynamic-routes
- https://learningnetwork.cisco.com/thread/41737
- https://en.wikipedia.org/wiki/Border_Gateway_Protocol
- https://docs.microsoft.com/fi-fi/azure/vpn-gateway/vpn-gateway-3rdparty-device-config-cisco-asa