TOR: Proxificando la salida a Internet en Linux

Publicado por Diego Córdoba en

Hoy hablaremos sobre cómo podemos proxificar o, en la jerga, «torificar», toda la salida a Internet de nuestro ordenador utilizando la red TOR.

Seguramente alguna vez nos ha pasado que hemos necesitado conectarnos a servicios remotos en alguna red que restringe todo trafico excepto web y dns, cierto?

tor

Sin ir más lejos, y como a varios de ustedes debe pasarles, a veces he necesitado conectarme con pidgin a mis cuentas xmpp, o con claws-mail o seamonkey a mis cuentas de correo electrónico, por ejemplo, porque no me gusta acceder a los servicios de webmail.

Pues bien, ¿qué podemos hacer si la red en la que estamos conectados nos restringe estos puertos? (y el administrador demora media vida en resolvernos el inconveniente 😛 )

Una solución es conectarse utilizando la red TOR, que cifrará nuestro tráfico y podremos conectarnos a cualquier servicio sin que la red actual nos restrinja!

Sabido es que esta red nos permite conectarnos a sitios web manteniendo en privado nuestra ubicación e ip de conexión. Esto lo hacemos gracias a que instalamos un cliente en nuestro sistema, y lo utilizamos para conectarnos a la red cifrada, o bien utilizamos un navegador con un cliente incorporado, como es el TOR Browser Bundle.

Navegando en torproject.org me encuentro con un link más que interesante de cómo proxificar todas las salidas a Internet, y así, no solo navegar anónimamente, sino también conectarse a cualquier servicio por medio de la misma red tor! De esta manera, además de salir de manera anónima a Internet, podremos conectarnos a los servicios que nos interese, por más que nuestra red de origen esté cerrada 🙂

Requerimientos

Vamos a utilizar un script que hace uso de un cliente tor, y de iptables (netfilter en Linux), por lo que tendremos que tener instalados los paquetes.

Netfilter/iptables ya viene instalado en la mayoría de las distribuciones, y en el caso de Debian, podremos instalar el cliente de la siguiente manera:

aptitude install tor

Ahora procederemos a configurar nuestro cliente para habilitarlo en modo transporte.
Para ello editaremos el archivo /etc/tor/torrc y añadiremos las siguientes líneas:

Configurando el cliente TOR

VirtualAddrNetworkIPv4 10.192.0.0/10
AutomapHostsOnResolve 1
TransPort 9040
DNSPort 53

Configurando el resolver dns

También deberemos configurar nuestro servicio de resolución de nombres al equipo local, de modo que las consultas dns también salgan a Internet utilizando el proxy:

echo "nameserver 127.0.0.1 > /etc/resolv.conf"

Configurando iptables

Luego tendremos que configurar nuestro iptables para permitir las conexiones de todos los servicios hacia Internet por medio de nuestro proxy local TOR.

Afortunadamente, para quienes no quieran aprender iptables desde cero ahora, podrán configurar y lanzar un simple script provisto por los amigos de torproject.org.

El script, un poco modificado por mi, es el siguiente:

#!/bin/sh
### hacemos flush de iptables (CUIDADO! si ya tenemos reglas configuradas!)
iptables -X
iptables -Z
iptables -F
iptables -t nat -F

### Seteamos algunas variables #Destinos que no queremos enrutar usando TOR (conexiones de red local privada)

_non_tor="192.168.0.0/16"
#UID con el que corre el servicio TOR (en Debian podemos obtenerlo usando "id debian-tor")
#_tor_uid="116"

#Un aporte de @jobregon para obtener el UID del usuario de tor automaticamente:
_tor_uid=$(id debian-tor | awk -F"=" '{print $2}' | awk -F "(" '{print $1}')

#Puerto de transporte TOR, configurado como dijimos arriba 
_trans_port="9040"

### set iptables *nat
iptables -t nat -A OUTPUT -m owner --uid-owner $_tor_uid -j RETURN
iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53

#Permitimos salida normal a todos los hosts de $_non_tor
for _clearnet in $_non_tor 127.0.0.0/9 127.128.0.0/10; do
    iptables -t nat -A OUTPUT -d $_clearnet -j RETURN
done

#Redirigimos todo el resto del tráfico al puerto de transporte tor: 
iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $_trans_port

### Configuramos nuestro firewall en modo statefull para paquetes de conexiones establecidas: 
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

#Aceptamos todos los paquetes salientes a las redes excluidas de tor: 
for _clearnet in $_non_tor 127.0.0.0/8; do
    iptables -A OUTPUT -d $_clearnet -j ACCEPT 
done 

#Permitimos solo salida a paquetes tor para el resto de las redes: 
iptables -A OUTPUT -m owner --uid-owner $_tor_uid -j ACCEPT
iptables -A OUTPUT -j REJECT

Este script también puede encontrarse en el repositorio GIT de Juncotic accediendo a este enlace.

Poniendo en marcha el script

Una vez que hayamos escrito nuestro script de iptables para lanzar nuestro cliente tor en modo transporte, y suponiendo que le hemos puesto de nombre «proxy_tor.sh», podremos lanzarlo de la siguiente manera:

sh /ruta/al/script/proxy_tor.sh

Luego de lo cual podremos verificar el acceso a los servicios navegando en sitios como «miip.net«, o tratando de conectarnos con nuestros clientes habituales de mensajería, correo, y demás.

Update 20190322

Como agregado al artículo original, cabe agradecer a Javier Obregón y a todo el equipo de EterTics por mencionar este artículo en los scripts que implementaron en su distro para proveer privacidad a los usuarios!

Javier implementó una serie de scripts bash a los que cargó una interfaz gráfica para diálogos con Zenity que permite activar y desactivar de una manera muy simple las configuraciones para torificar la salida a Internet.

Gentilmente me compartió los enlaces al paquete .deb del torificador que utiliza Etertics. Si bien la distro original está basada en Devuan, yo he probado los scripts y la GUI en Debian 9 y corre perfectamente.

Si usan distros basadas en Debian/Devuan, pueden descargar tanto el .deb como la verificación por hash MD5 desde estos enlaces:

Y no tienen más que instalarlo en el sistema con:

sudo dpkg -i etertics-torificador_0.1.4_all.deb

Si falla la instalación porque no se cumplen dependencias (en mi caso no tenía instalado zenity) pueden instalarlas con apt y luego ejecutar nuevamente el dpkg para completar la instalación del torificador:

sudo apt -f install

Espero que les sea de utilidad!! Hasta la próxima!

Cualquier sugerencia o comentario por favor hacerlo en el artículo, así todo el que lo lea puede aprender más!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador

6 comentarios

Javier · 10 junio, 2016 a las 03:35

Hace unas semanas estuve de viaje y éste artículo me vino al pelo para «torificar» mi conexión, muchas gracias Diego una vez mas!!

Le hice una pequeña modificación al script original, para asignar el UID del usuario tor del sistema a la variable _tor_uid

_tor_uid=$(id debian-tor | awk -F»=» ‘{print $2}’ | awk -F «(» ‘{print $1}’)

Abrazo

    Diego Córdoba · 11 junio, 2016 a las 23:03

    Gracias a vos Javier por compartir y por los aportes! Abrazo grande!

dany rey · 11 noviembre, 2016 a las 19:09

excelente como siempre .. ahora .. como podriamos llevar esto a un android? ..

    Diego Córdoba · 11 noviembre, 2016 a las 21:56

    Dany! Ya estoy redancando un artículo al respecto 🙂
    Podés hacerlo de forma simple con Orbot, una app que está en el repo F-Droid. Orfox es un browser basado en firefox que trabaja directamente con orbot, e incluso podés seleccionar qué apps querés que salgan por tor dentro de los settings de orbot.
    Claro, no podés forwardear todo el tráfico de Android mediante firewall, pero con esto zafa bastante bien, sin siquiera tener que rootear el celu.
    Espero te sirva! Abrazo!

Juan · 12 noviembre, 2016 a las 14:00

Diego, excelente como siempre.

Una consulta, como podemos hacer algo similar pero para los celulares? (Android principalmente).

    Diego Córdoba · 12 noviembre, 2016 a las 20:20

    Gracias Juan!!
    Estoy escribiendo un artículo al respecto, como le decía a D4ny en el comentario anterior, es difícil proxificar toda la salida de un android sin el teléfono rooteado, pero utilizar herramientas como orbot resulta muy sencillo, y en los settings podés decirle a orbot qué aplicaciones querés que trafiquen por medio de la red tor, y cuáles no.
    Por cierto, orbot es un cliente TOR para android, y podés instalarlo desde el repo F-droid.
    Ya publicaré una segunda parte con más info y screenshots 🙂
    Abz!

Los comentarios están cerrados.