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

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!


Diego Córdoba

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