TL;DR

TL;DR

TL;DR

Quiero que todo el tráfico saliente de mi sistema se enrute a un dispositivo tun0, se envuelva con paquetes DNS y luego se envíe a Internet, pero los paquetes DNS también se enrutan de regreso al dispositivo tun0.

Fondo

Como parte de un proyecto en el que estoy trabajando, tengo que implementar un túnel DNS en un sistema sin tráfico TCP (se elimina todo el tráfico TCP).

Decidí implementar esto en Python y encontré un problema al entender cómo enrutar el tráfico.

La configuración consistiría en un agente en la computadora cliente que no puede usar TCP y un servidor que no tiene limitaciones de red.

Actualmente sólo estoy abordando el tráfico saliente del cliente al servidor.

El enfoque actual que quería adoptar con el cliente era:

  1. Crear una tun0interfaz en el sistema cliente.
  2. Enrute todo el tráfico saliente a través de esa interfaz.
  3. Haga que un programa Python escuche en esa interfaz: los paquetes salientes se empaquetarán con una consulta DNS que se enviará a Internet a través de la interfaz que está conectada a Internet (en mi caso ens33).

Para crear el dispositivo tun utilicé:

from pytun import TunTapDevice

tun = TunTapDevice(name=”tun0”)
tun.addr = '10.8.0.1'
tun.dstaddr = '10.8.0.2'
tun.netmask = '255.255.255.0'
tun.mtu = 1500

tun.up()

Para enrutar el tráfico a la interfaz tun0 utilicé

sudo ip route add default via 10.8.0.1 dev tun0

El problema

Consigo que el tráfico se dirija a mi programa Python y puedo leer los paquetes desde el dispositivo, pero después de construir los nuevos paquetes DNS (con los datos originales dentro de ese paquete), intento enviar los paquetes a Internet a través de mi ens33interfaz y todavía veo con tcpdumpy wiresharkque la solicitud intenta enviarse desde la interfaz tun0.

¿Cómo puedo enrutar sólo paquetes que no sean de mi programa a tun0? El concepto me parece parecido a vpn, ¿cómo lo hacen los programas vpn?

Gracias por su ayuda, comente si necesita alguna aclaración/edición.

información relacionada