
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:
- Crear una
tun0
interfaz en el sistema cliente. - Enrute todo el tráfico saliente a través de esa interfaz.
- 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 ens33
interfaz y todavía veo con tcpdump
y wireshark
que 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.