
Todo lo descrito en el artículo se implementa como una herramienta Toroxy disponible en GitHub
Recientemente, el anonimato en línea ha sido un tema de acalorado debate. No es ningún secreto que los datos sobre las visitas a los recursos de Internet desde un dispositivo local se pueden recopilar a diferentes niveles para construir un "modelo" del usuario, que luego se puede usar en su contra (o
podría ). Por lo tanto, no es sorprendente que un número creciente de usuarios activos de Internet se estén convenciendo de la necesidad de mecanismos de proxy y anonimato. En este sentido, hay cada vez más clientes VPN nuevos, pero, como muestra la práctica, no todos pueden ser confiables: o no todo funciona de forma inmediata, luego solo el tráfico HTTP es anónimo, entonces la calidad de la implementación es pobre, o y los desarrolladores pecan al fusionar datos sobre sus usuarios.
En este artículo, trataremos de ensamblar nuestra propia herramienta con una interfaz de usuario de una serie de componentes de software, lo que nos permitiría anonimizar completamente el tráfico del sistema local y evitar fugas en los canales de "escucha" en cualquier etapa del trabajo.
Nuestro principal objetivo será "construir" una utilidad confiable a partir de herramientas preparadas. Obviamente, la idea de crear una herramienta de alta calidad desde cero en un tiempo razonable está plagada de errores y, por lo tanto, será más rápido y más confiable elegir componentes listos para usar, ¡y luego conectarlos correctamente!
¿Qué debe poder hacer una herramienta?
- Redireccione todo el tráfico del sistema de destino a los nodos intermedios (preferiblemente varios) para enmascarar de forma confiable la fuente
- Rastree posibles violaciones de anonimato, corríjalas e infórmelas mediante notificaciones de UI
Componentes seleccionados para crear la herramienta:
- tor
- iptables
- python3
- systemd
Al mezclar todos los componentes en un shell llamado "Linux", definitivamente podemos obtener algo valioso que ayudará a lograr el objetivo final.
Componente # 1: Tor
Es alrededor de este componente que se construirá el resto de la infraestructura de la herramienta. Tor proporciona un mecanismo que forma parte de cualquier cliente VPN: un mecanismo para envolver el tráfico a través de nodos intermedios anónimos a un observador externo (en la configuración estándar de dichos nodos 3).
Por defecto, el cliente Tor de los repositorios de lotes estándar después de la instalación comienza a escuchar el puerto 9050, que acepta cualquier cliente que pueda calcetines. El problema es que, además del tráfico de calcetines en nuestro sistema, puede haber un montón de otro tráfico de aplicaciones que no funcionan en este protocolo. En este sentido, antes que nada, dentro del sistema local, tendrá que cortar una ventana en la red Tor para cualquier nueva conexión de red. Esto se hace simplemente levantando el
proxy transparente en la configuración
torrc :
/etc/tor/torrc ... TransPort 9040 # python ControlPort 9051 ...
Se debe prestar especial atención al tráfico UDP. El hecho es que el principio de enrutamiento de cebolla se basa en el concepto de un "flujo", que, como saben, solo existe en TCP. Al enviar un paquete UDP a través de Tor, el sistema de destino no podrá recibir una respuesta, ya que el paquete de respuesta no encontrará la ruta de retorno. Pero a pesar de esta peculiaridad, todavía tenemos la oportunidad de anonimizar consultas DNS, que se sabe que se realizan a través de UDP, y al mismo tiempo incluyen la resolución .onion:
/etc/tor/torrc ... AutomapHostsOnResolve 1 DNSPort 53 ...
En esto, el acceso a Tor está abierto dentro del loopback.
Componente # 2: Iptables
Como nuestra tarea es ocultar la verdadera fuente de tráfico de un observador externo dentro de todo el sistema, y la ventana en Tor ya está abierta, solo queda envolver todo el tráfico en esta ventana. El firewall del sistema incluido con el kernel de Linux nos ayudará con esto:
# tcp iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $TRANS_PORT # udp (dns only) iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53 iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A OUTPUT -j REJECT ip6tables -A OUTPUT -j REJECT
En esta etapa, obtenemos una utilidad de trabajo que oculta de manera confiable todo el tráfico saliente, pero esto es solo la mitad del trabajo.
Componente n. ° 3: interfaz de usuario de Python + Desktop Evironment
Cada vez, la configuración manual desde la consola (incluso si será el lanzamiento de un script bash) será bastante agotador, por lo que es hora de comenzar a escribir una pequeña utilidad que nos ayude específicamente en lo siguiente:
- Configuración automática
- Cambia tu identidad dentro de Tor en cualquier momento
- Monitorear la integridad de las reglas de iptables y reescribir si se viola
- Seguimiento de su identidad actual (IP)
- Notificación de los dos párrafos anteriores con notificaciones gráficas.
En el primer inicio, la utilidad descargará todos los
componentes necesarios por sí misma, y en lanzamientos posteriores configurará Tor junto con iptables, como se describió anteriormente.
Si desea cambiar su dirección IP externa, interactuará con el puerto de servicio Tor - 9051, que estaba abierto al principio para automatizar el cambio de IP:
with Controller.from_port(port = 9051) as controller: controller.authenticate() controller.signal(Signal.NEWNYM)
El seguimiento de integridad se puede implementar de manera bastante banal (lo hacemos en la rodilla) leyendo periódicamente la estructura de reglas de iptables y verificando su suma SHA256:
def rulesOk(self): RULES_CHECKSUM_CMD = "{ iptables-save && ip6tables-save; } | sed s/\-\-uid\-owner\\\\s[0-9]\\\\+\\\\s//g | grep -viE '^#' | grep -viE '^\:' | sort | uniq | sha256sum | cut -d' ' -f 1" checkSum = getoutput(RULES_CHECKSUM_CMD).strip() alright = checkSum == Strings.RULES_CHECKSUM_CORRECT_HASH if not alright: rules = getoutput('iptables-save && ip6tables-save') self.lastSnapshotFileName = "/tmp/broken-rules-%s.log" % time.strftime("%d-%m-%Y_%I-%M-%S") open(self.lastSnapshotFileName, "w").write(rules) return False else: return True
Además, si hay inconsistencias con la suma de verificación esperada, puede guardar el volcado de reglas de iptables en
/tmp/broken-rules-%d-%m-%Y_%I-%M-%S.log
para procedimientos adicionales. Si resulta que
rulesOk() == False
Esto iniciará una reescritura de la tabla de reglas de iptables.
El monitoreo de la IP actual se realizará accediendo constantemente a algún recurso externo que proporciona el cliente IP, por ejemplo,
ident.me
.
Bueno, finalmente, usaremos DE UI para informar problemas con las reglas o el cambio de IP. Cada entorno gráfico es único de alguna manera, especialmente cuando se trata de usar la interfaz de usuario del proceso daemon, pero en la mayoría de los sistemas Linux, dicho código bash llamado desde Python mostrará notificaciones con éxito:
Al combinar todo esto en un script Python de 200 líneas, obtenemos lo que logramos. Aquí, por ejemplo, cómo se verá una notificación de que nuestra identidad ha sido actualizada:

Y así es como se verá la notificación de que se ha violado la integridad de las reglas de Iptables indicando el volcado de volcado que contiene la violación:

Componente # 4: systemd
Y finalmente, definitivamente nos gustaría hacer una configuración única y no pensar en nuestra seguridad en el futuro, y por lo tanto, la ejecución automática y los servicios vienen al rescate. Linux tiene varios subsistemas de administración de demonios estándar: systemd, sysV, init. En nuestro caso, la elección recayó en systemd debido a la flexibilidad de su configuración.
Supongamos que la secuencia de comandos de Python escrita en el paso anterior se llama "toroxy" y se encuentra en
/usr/bin/
, luego su ejecución automática y la supervisión posterior con cierta flexibilidad para controlar el demonio será así:
[Unit] Description=Toroxy After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 User=root # service toroxy start ExecStart=/usr/bin/toroxy service # service toroxy stop ExecStop=/usr/bin/toroxy stop # service toroxy reload ExecReload=/usr/bin/toroxy switch [Install] # init 3, UI Tor WantedBy=multi-user.target
Casi todo está listo para la operación "industrial". El toque final que me gustaría agregar a la herramienta para mayor confiabilidad es la inicialización automática de las reglas de iptables al inicio del sistema (como saben, las reglas de iptables se restablecen al reiniciar) usando iptables-persistent:
iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6 netfilter-persistent start && netfilter-persistent save
Conclusión
Por lo tanto, hemos reunido nuestra propia herramienta a partir de una combinación de diversos componentes, que con un grado bastante alto de confiabilidad es capaz de proporcionar el anonimato continuo del usuario de Linux en la red. En conclusión, debe decirse que todo lo descrito en el artículo se implementa como una herramienta
Toroxy disponible en GitHub.