Voy a explicar como hacer una VPN entre dos EdgeRouter, uno de los cuales se encuentra en detrás de un NAT. Para el caso que yo implemente para hacer esta guía, usé dos EdgeRouter X con firmware 1.10.11. Como estoy usando algunas opciones que no aparecen en la interface web y como me gusta más el procedimiento es en el CLI. Este es el diagrama para el cual estamos aplicando la configuración:
Como se ve en el diagrama el router1 tiene una IP pública y si es fija será mejor aun así funciona con un FQDN. El router2 se encuentra con una IP Privada dentro de un NAT. Así que explicado el escenario vamos con la Configuración de router1
set vpn ipsec auto-firewall-nat-exclude enable
set vpn ipsec esp-group FOO0 compression disable
set vpn ipsec esp-group FOO0 lifetime 3600
set vpn ipsec esp-group FOO0 mode tunnel
set vpn ipsec esp-group FOO0 pfs enable
set vpn ipsec esp-group FOO0 proposal 1 encryption aes256
set vpn ipsec esp-group FOO0 proposal 1 hash sha1
set vpn ipsec ike-group FOO0 ikev2-reauth no
set vpn ipsec ike-group FOO0 key-exchange ikev1
set vpn ipsec ike-group FOO0 lifetime 28800
set vpn ipsec ike-group FOO0 proposal 1 dh-group 14
set vpn ipsec ike-group FOO0 proposal 1 encryption aes256
set vpn ipsec ike-group FOO0 proposal 1 hash sha1
set vpn ipsec site-to-site peer 0.0.0.0 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer 0.0.0.0 authentication pre-shared-secret <AquiTuSuperComplicadaClaveCompartida>
set vpn ipsec site-to-site peer 0.0.0.0 connection-type respond
set vpn ipsec site-to-site peer 0.0.0.0 description ipsec_vpn
set vpn ipsec site-to-site peer 0.0.0.0 ike-group FOO0
set vpn ipsec site-to-site peer 0.0.0.0 ikev2-reauth inherit
set vpn ipsec site-to-site peer 0.0.0.0 local-address 30.30.30.30
set vpn ipsec site-to-site peer 0.0.0.0 tunnel 1 allow-nat-networks disable
set vpn ipsec site-to-site peer 0.0.0.0 tunnel 1 allow-public-networks disable
set vpn ipsec site-to-site peer 0.0.0.0 tunnel 1 esp-group FOO0
set vpn ipsec site-to-site peer 0.0.0.0 tunnel 1 local prefix 10.10.10.0/24
set vpn ipsec site-to-site peer 0.0.0.0 tunnel 1 remote prefix 10.10.20.0/24
En palabras sencillas, la prrimera regla permite que el router agregue las reglas de firewall y NAT automáticamente en el sistema aunque no las veamos en la interface web. El segundo grupo de configuraciones define la Fase1 y así el siguiente grupo define la Fase2. El tercer grupo de configuraciones contiene el peer, como el router remoto puede cambiar a cualquier IP ya que será dinámica el peer se define como 0.0.0.0 Luego nuestra llave compartida tiene que ser sumamente fuerte ya que estamos permitiendo la conexión desde cualquier IP. La local address es nuestra IP pública y finalmente las dos últimas líneas definen las redes que se están conectando.
Esta sería entonces la configuración del router2:
set vpn ipsec auto-firewall-nat-exclude enable
set vpn ipsec esp-group FOO0 compression disable
set vpn ipsec esp-group FOO0 lifetime 3600
set vpn ipsec esp-group FOO0 mode tunnel
set vpn ipsec esp-group FOO0 pfs enable
set vpn ipsec esp-group FOO0 proposal 1 encryption aes256
set vpn ipsec esp-group FOO0 proposal 1 hash sha1
set vpn ipsec ike-group FOO0 ikev2-reauth no
set vpn ipsec ike-group FOO0 key-exchange ikev1
set vpn ipsec ike-group FOO0 lifetime 28800
set vpn ipsec ike-group FOO0 proposal 1 dh-group 14
set vpn ipsec ike-group FOO0 proposal 1 encryption aes256
set vpn ipsec ike-group FOO0 proposal 1 hash sha1
set vpn ipsec site-to-site peer 30.30.30.30 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer 30.30.30.30 authentication pre-shared-secret <AquiTuSuperComplicadaClaveCompartida>
set vpn ipsec site-to-site peer 30.30.30.30 connection-type initiate
set vpn ipsec site-to-site peer 30.30.30.30 description ipsec_vpn
set vpn ipsec site-to-site peer 30.30.30.30 ike-group FOO0
set vpn ipsec site-to-site peer 30.30.30.30 ikev2-reauth inherit
set vpn ipsec site-to-site peer 30.30.30.30 local-address 0.0.0.0
set vpn ipsec site-to-site peer 30.30.30.30 tunnel 1 allow-nat-networks disable
set vpn ipsec site-to-site peer 30.30.30.30 tunnel 1 allow-public-networks disable
set vpn ipsec site-to-site peer 30.30.30.30 tunnel 1 esp-group FOO0
set vpn ipsec site-to-site peer 30.30.30.30 tunnel 1 local prefix 10.10.20.0/24
set vpn ipsec site-to-site peer 30.30.30.30 tunnel 1 remote prefix 10.10.10.0/24
Con esto la VPN debe levantar con unons cuantos pings desde el router2 ya que este va a iniciar la VPN. En la teoría pudieramos usar la configuración de 'dead-peer-detection' para mantener la VPN arriba, pero en mi caso tuve muchos problemas y no siempre mantenía la sesión así que con un pequeño hack esto se puede resolver. Un script que hace un ping a el router2 cada cierto tiempo. Así que creamos un script para hacer el ping:
admin@router2:~$ sudo su
root@router2:/home/admin# touch /config/scripts/vpn_keep_alive.sh
root@router2:/home/admin# chmod +x /config/scripts/vpn_keep_alive.sh
root@router2:/home/admin# vi /config/scripts/vpn_keep_alive.sh
En resumidas cuentas creamos el archivo del script, lo hicimos ejecutable y vamos a poner el siguiente código en él
#!/bin/bash
# Script para mantener viva la VPN
/bin/ping -c 5 -I 10.10.20.1 10.10.10.1
Si tienes más de un tunel crea un ping para cada red interconectada y usa la IP de cada interface en la bandera -I. Finalmente agregamos el script en la configuración de router2:
set system task-scheduler task vpn_keep_alive executable path /config/scripts/vpn_keep_alive.sh
set system task-scheduler task vpn_keep_alive interval 5m
Espero que te sea de utilidad, comentarios, via twitter.