Para todo el que quiera montar una VPN entre dispositivos que no dispongan de una ip pública que permita gestionar los puertos para montar soluciones VPN tradicionales como por ejemplo con Openvpn su solución más viable es Zerotier.
En mi caso las pruebas he decidido hacerlas entre un Openwrt montado sobre un Huawei HG556 conectado por la LAN a un router con acceso 4G a internet y un móvil Android con 4G, ambos con CG-NAT.
El funcionamiento de Zerotier es básicamente hacer de intermediario para conectar diferentes dispositivos a la VPN y que se vean entre sí aunque estén detrás de redes nateadas no gestionables, como por ejemplo accesos móviles 3G. El esquema sería algo así, pudiendo ser muchos más clientes respetando este esquema:
Cliente 1> Servidor Zerotier < Cliente 2
Registro en Zerotier y configuración de cuenta:
Lo primero es registrarse y crear una cuenta:
Una vez que tengáis cuenta, hay una serie de parámetros básicos que deberéis configurar para definir/personalizar vuestra propia VPN, me centraré en lo básico.
En el menú «Networks» deberéis tener un ID por defecto que podréis tunear a vuestro gusto o directamente crear a vuestro gusto. Pincháis en él y deberéis cambiar cosas como el pool de ips disponibles para la nueva VPN, obviamente no debe coincidir con ningún rango LAN privado que tengáis en cualquier «sede» a interconectar o tendríais conflictos de ips:
Con esto de momento tendremos suficiente para empezar, luego volveré sobre más configuraciones una vez puestos en marcha los clientes.
Instalación en Openwrt:
Desde una consola actualizamos listado de paquetes e instalamos zerotier:
root@Openwrt:~# opkg update
root@Openwrt:~# opkg install zerotier
Si intentamos arrancar el servicio tal cual o conectarnos a un ID de VPN dará error:
root@Openwrt:~# /etc/init.d/zerotier start
disabled in config
root@Openwrt:~#
root@Openwrt:~# zerotier-cli join 0l9hc16et03ve162
zerotier-cli: missing port and zerotier-one.port not found in /var/lib/zerotier-one
Deberéis editar el fichero de configuración:
root@Openwrt:~# vim /etc/config/zerotier
Se habilita el servicio:
option enabled ‘0’
Y se cambia la opción ‘0’ por ‘1’.
Se inicia el servicio y acto seguido empezará a generar la clave privada del equipo:
root@Openwrt:~# /etc/init.d/zerotier start
Generate secret – please wait…
root@Openwrt:~#
Ahora ya podréis arrancar sesión contra el ID de vuestra VPN (ver en vuestro perfil de Zerotier):
root@Openwrt:~# zerotier-cli join 0l9hc16et03ve162
200 join OK
root@Openwrt:~#
Instalación en Android:
Nos podremos instalar la aplicación desde Google play:
Al abrir la aplicación nos pedirá el ID de VPN que tenemos creado en el perfil de Zerotier (ver en vuestro perfil):
Os debería levantar conexión y abajo aparecerá «ONLINE». Si estáis conectados por 3G/4G deberéis habilitar una casilla en la configuración (icono de llave inglesa arriba a la derecha) para que os permita hacer uso de la VPN a través de la red móvil:
Interconectar dispositivos:
Aunque tenemos el perfil definido en la plataforma Zerotier y los clientes instalados con su IDs de VPN configurados no levantarán conexión mientras no lo autoricemos en nuestro perfil. Deberemos ir a la configuración en «Networks> nuestro ID > Members» , revisar los ids que están sin asignar, copiar su «ID» y añadirlos manualmente para autorizar su acceso a nuestra red. Adjunto captura de un usuario conectado pero no autenticado, por tanto no levanta ip del pool que hemos definido:
Si copiamos su «ID» (aparece justo encima de su MAC) y lo añadimos en:
Si no os levanta IP aunque veáis todo «Online» debéis revisar que vuestra red esté añadida a la tabla de rutas:
Cuando tengáis dispositivos conectados y levantando ip correctamente los deberíais ver así y a la derecha la ip pública por la que salen en su ISP:
En el escenario de la captura anterior si hago un ping desde un extremo al otro de la VPN ya funcionaría 🙂 :
root@Openwrt:~# ifconfig
…
hjgnmwedaz Link encap:Ethernet HWaddr LA:QU:ES:EA:AQ:UI
inet addr:192.168.168.60 Bcast:192.168.168.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:2800 Metric:1
RX packets:39 errors:0 dropped:0 overruns:0 frame:0
TX packets:89 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3654 (3.5 KiB) TX bytes:8158 (7.9 KiB)
root@Openwrt:~# ping 192.168.168.214
PING 192.168.168.214 (192.168.168.214): 56 data bytes
64 bytes from 192.168.168.214: seq=0 ttl=64 time=44.064 ms
64 bytes from 192.168.168.214: seq=1 ttl=64 time=53.122 ms
64 bytes from 192.168.168.214: seq=2 ttl=64 time=74.342 ms
64 bytes from 192.168.168.214: seq=3 ttl=64 time=102.243 ms
64 bytes from 192.168.168.214: seq=4 ttl=64 time=119.932 ms
64 bytes from 192.168.168.214: seq=5 ttl=64 time=42.065 ms
64 bytes from 192.168.168.214: seq=6 ttl=64 time=62.557 ms
^C
— 192.168.168.214 ping statistics —
7 packets transmitted, 7 packets received, 0% packet loss
round-trip min/avg/max = 42.065/71.189/119.932 ms
root@Openwrt:~#
A partir de aquí cada uno que se tunee su conexión en función de lo que tenga en cada extremo y lo que quiera permitir a través de ella 😛 .