Solución de VPN basada en Raspberry Pi – El proveedor espía

Hola a todos chicos! Hoy vamos a ampliar la entrada en la que os explicaba cómo contruir una solución doméstica de OpenVPN utilizando una Raspberry Pi 3. Como os comenté al final de la misma como conclusión, ¿qué pasaría si nuestro proveedor de OpenVPN se vuelve «malote»? ¿Podemos confiar en cualquier VPN, solamente confiando en el cifrado del tráfico? Como podéis suponeros, y como voy a mostrar, la respuesta es no.

Desde un primer momento, podemos empezar a escuchar todo lo que se transmite a través de la interfaz de túnel tun0, que es la que crea OpenVPN para tunelizar el tráfico, a través del siguiente comando:

tcpdump -i tun0

Tcpdump es una utilidad de los sistemas Linux que nos permite visualizar y guardar todo aquel tráfico que pasa através de una interfaz de red. Aquí, le estamos simplemente indicando que comience a capturar a través de la interfaz tun0.

Sin embargo, Tcpdump de forma predeterminada establece un límite de bytes capturados por paquete. Evitaremos este límite colocando el parámetro -s 0 al invocar a la herramienta.

tcpdump -i tun0 -s 0

Asimismo, queremos guardar todo lo capturado a un fichero para un posterior análisis más exhaustivo. Esto podemos hacerlo agregando el parámetro -w out.pcap . De esta manera, guardaremos la salida en formato pcap , el cual puede ser posteriormente abierto y analizado por la herramienta de análisis de protocolos de red Wireshark.

tcpdump -i tun0 -s 0 -w out.pcap

Por último, que todo el tráfico quede guardado a largo plazo dentro de un mismo fichero puede ser poco conveniente. En su lugar, estableceremos una rotación , de manera que cada 100 Megabytes de captura Tcpdump cree un nuevo fichero de captura. Posteriormente podremos juntar dichos ficheros sin ningún problema, y combinarlos de la forma que queramos con herramientas como Mergecap . Podemos hacer esto estableciendo el parámetro -C 100.

tcpdump -i tun0 -s 0 -w out.pcap. -C 100

Cada vez que se cree un nuevo fichero de captura, Tcpdump agrega un número al final: 001, 002… así hasta el infinito. De esta forma tendremos ficheros con la estructura out.pcapXXX , fácilmente diferenciable.

Recogeremos este comando dentro de un script , que se ejecutará cada vez que la interfaz tun0 se levante y parará cada vez que se baje , es decir, al iniciar y parar el servicio OpenVPN. Guardaremos este script como /root/sniffer.sh.

Antes de nada, nos aseguramos de que la interfaz esté realmente iniciada, dado que a veces se intenta iniciar la escucha antes de que lo esté. Esto se hace esperando unos segundos antes de empezar a escuchar todo el tráfico ( sleep 5 ).

Como puede verse, los resultados se guardarán en el directorio home de un usuario segfis , que hemos creado para dar un acceso no administrativo al exterior para la recogida de las capturas. Se creará una carpeta en su home con el momento en el que se inicia el script.

Esto podemos hacerlo agregando las siguientes líneas al fichero /etc/network/interfaces, que justamente establece las acciones al subir y bajar la interfaz tun0:

auto tun0
iface tun0 inet manual
post-up bash /root/sniffer.sh &
post-down kill -9 `pgrep -f sniffer.sh`

Llegados a este punto, podemos reiniciar el sistema para simular un inicio completo, y comprobar que ya tenemos el script inmediatamente almacenando la captura.

Para posteriormente descargar dichas capturas, podemos simplemente acceder a la VPN de forma normal y posteriormente mediante un cliente SFTP utilizando el usuario segfis (o cualquier otro con acceso al directorio), como el mismo Bitvise que usamos para conexiones SSH, descargar a local dichos ficheros.

Una vez descargados dichos ficheros, podemos abrirlos con cualquier programa de análisis de protocolos de red, como puede ser Wireshark.

¡Y esto es todo por hoy! Espero que os haya gustado, y que podáis sacar vuestras propias conclusiones respecto a la evaluación de nuestras opciones a la hora de elegir una solución que nos permita el anonimato y/o cifrado, y sabiendo que el problema siempre suele estar en el otro extremo.

¡¡Un saludo!!