Python y VPNs (2) – Rotando IPs en paralelo

Hola de nuevo, en la entrega anterior vimos que, con cierta flexibilidad, podíamos ir rotando diferentes IPs de manera bastante cómoda y sencilla usando el cliente de nordVPN.

Por comodidad, subiré a Github tanto el código anterior como el de hoy, y todo lo que sea de interés.

Vuelvo a repetir que no tengo nada que ver con la empresa, de hecho tras un tiempo usándola no creo que renueve, pero ya que tengo la licencia pues vamos a sacarle un poco de provecho…

La primera entrega fue algo específico para dicho cliente, ya que interactuábamos mediante sus propios comandos, pero en esta entrega vamos a meternos un poco más adentro y empezar a interactuar directamente con OpenVPN.

Bien, tenemos ahora un simple script que nos va iterando por todas las IPs disponibles de forma aleatoria, pero… ¿y si queremos hacerlo de forma paralela? Es decir, ya que podemos tener hasta 5 clientes conectados simultaneamente a la VPN, ¿por qué no aprovecharlo y tener 5 IPs distintas rotando en un mismo dispositivo? Lo cual reduciría considerablemente el tiempo que tardemos en lo que sea que queramos hacer.

Contenedores LXC

Para conseguir dicha virtualización de clientes, vamos a usar LXC, “LXC is an operating-system-level virtualization method for running multiple isolated Linux systems on a control host using a single Linux kernel.

Es decir, vamos a poder tener diferentes máquinas Linux corriendo en el mismo host, cada una con sus interfaces de red, las cuales saldrán por bridge a través de nuestro host.

Solo hay una pega, el cliente de nordVPN no funciona en los contenedores (culpa de nordVPN), por lo que tenemos que conectar de forma nativa mediante openVPN con las credenciales de nordVPN.

Vamos a empezar creando nuestro contenedor con LXC y luego veremos como solucionar lo otro.

Creando nuestro contenedor LXC

Primero nos aseguramos que tenemos ‘lxc’ instalado y ‘lxd’, lo más probable sea que sí, en caso contrarío:

$ sudo apt-get install lxc

Nos aseguramos que también tengamos ‘lxd’, lo cual es una extensión del propio ‘lxc’, donde aporta nuevas funcionalidades y facilita su administración.

$ sudo snap install lxd

Una vez esté correctamente instalado vamos a iniciar la configuración de nuestros contenedores, con:

$ lxd init

Lo cual nos irá preguntando diversos parámetros, los cuales vamos a dejar todos por defecto:

sh3llcon vpn python rotar DNs

Ahora con $ lxc list

Podemos ver la lista de contenedores, la cual lógicamente estará vacía.

sh3llcon vpn python rotar DNs

Creamos ahora un contenedor:

$ lxc launch ubuntu:20.04 nombre_contenedor

Y comprobamos que efectivamente, se ha creado un contenedor con el nombre vpn1, corriendo y con la interfaz red también funcionando.

sh3llcon vpn python rotar DNs

Ahora accedemos a dicho contenedor:

$ lxc exec vpn1 /bin/bash/

Perfecto, ya estamos dentro de nuestro contenedor, ahora vamos a ver como conectarnos a la VPN.

Conexión a la VPN

Podemos conectarnos a los servers de nordVPN manualmente, con archivos de configuración, los cuales tienen colgados en .zip en su web.

El problema, que no están actualizados, la mayor parte de ellos no van, se caían… por lo que pensé en la API que usamos en el primer post, que escupe los servidores que sí están activos, para mi sorpresa, comparando, me di cuenta que muchos servidores de la API no están en dicho .zip, por lo que no podemos usarlos para conectarnos a los servidores.

Resumen, podemos coger un archivo de configuración y usarlo como “plantilla” ya que ahí viene la tls key que usa el cliente para verificarse ante el servidor (previo paso antes de poner nuestro usuario y pass) y extrayendo la IP de servidores que funcionen desde su api, acceder a dicha VPN, con lo que solucionamos el problema.

$ openvpn –config archivo_configuracion –remote ip_server –auth-user-pass/etc/openvpn/secret

También necesitaremos tener un archivo en //etc/openvpn//secret, que consista de nuestro usuario y contraseña en una nueva linea, no es lo más seguro, hay soluciones que tratan de mitigar esto, pero por simplicidad vamos a dejarlo así en el post.

Bien, pues juntando la extracción de la api, la gestión de openvpn, etc… he subido un script al repositorio de github donde está el script.

Y ahora que está explicado, continuamos con el contenedor.

Uso del script

$ git clone https://github.com/b0n3sh/sh3llcon_2021.git

Ahora simplemente tenemos que importar vpn.py a nuestro proyecto y ejecutar vpn.get_vpn() lo que nos proporcionará la IP, tenemos que ejecutarlo con privilegios.

Una vez instalemos los módulos necesarios en requirements.txt, ya estaría para funcionar.

sh3llcon vpn python rotar DNs

Vale, ahora tenemos un contenedor, como replicamos la jugada?

Salimos del contenedor y con el comando copy, copiamos el contenedor

sh3llcon vpn python rotar DNs

Ahora iniciamos los contenedores y accedemos a ellos, ejecutamos el script en cada uno y vemos que efectivamente, cada contenedor sale con una IP distinta.

sh3llcon vpn python rotar DNs
sh3llcon vpn python rotar DNs

Outro ¡Y listo!

Hasta aquí el post de hoy, como vemos esta rotación puede ser muy útil para circunvalar medidas antiscrapping, ya que a cada request podemos cambiar de vpn fácilmente.

Espero que os sea de utilidad.

La imagen de cabecera se ha compuesto con una foto cortesía de Pixabay

Firmado: @b0n3sh

Sh3llCON no se hace responsable de las opiniones vertidas por sus colaboradores ni por las actuaciones que, fruto del conocimiento transmitido, puedan realizar terceras personas.