Dirija todo el tráfico a través de la interfaz TUN

Dirija todo el tráfico a través de la interfaz TUN

Quiero que todo mi tráfico pase por TUNla interfaz.

Aquí está el diagrama de flujo.

Entonces, como puede ver, el tráfico se dirige a la dirección TUNde interfaz 10.0.0.1desde cada programa. Luego, el programa adjunto TUNhace algo con los paquetes y luego se envían a mi enrutador en 192.168.1.1. Luego se enrutan a través de Internet (por ejemplo, a mi servidor proxy, pero en realidad no importa mucho para mi problema).

Entonces mi objetivo es simplemente enrutar el tráfico de esa manera: $any_program<--> tunX<--> 192.168.1.1 (the router)( <-->lo que significa que el tráfico entra y sale).

Lo que he hecho hasta ahora:

  1. Primero, inicialicé tunXel dispositivo con esta función:
int tun_open(char *device)
{
    struct ifreq ifr;
    int fd, err;
    
    fd = open("/dev/net/tun", O_RDWR);
    if (fd == -1)
    {
        perror("opening /dev/net/tun");
        exit(1);
    }

    memset(&ifr, 0, sizeof (ifr));
    ifr.ifr_flags = IFF_TUN;
    strncpy(ifr.ifr_ifrn.ifrn_name, device, IFNAMSIZ);
    
    err = ioctl(fd, TUNSETIFF, (void *) &ifr);
    if (err == -1)
    {
        perror("ioctl TUNSETIFF");
        close(fd);
        exit(1);
    }

    return fd;
}

Y luego:

tunfd = tun_open("tun6");

Además, habilité TUNSETPERSIST:

ioctl(tunfd, TUNSETPERSIST, 1) < 0);
  1. Luego, configuro el dispositivo con los siguientes comandos:
$ sudo ip addr add 10.0.0.1/24 dev tun6
$ sudo ip link set tun6 up                                                 

El programa lee tunfdy genera el contenido. Hasta el momento lo único que se lee es lo siguiente:

:B\{k
HOST: 239.255.255.250:1900
MAN: "ssdp:discover" 
MX: 1
ST: urn:dial-multiscreen-org:service:dial:1
USER-AGENT: Google Chrome/86.0.4240.198 Linux

%   N%*.%K%M%P%M%M%M%HP%,%M%*K%(aP%>O%M%LqP%@K%`P%P%Ҵ u@=U繤湤}=UoK%0=U

ssdp: ¿descubrir? ¿Por qué esto pasa por mi interfaz tun?

Salida de route -n:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    600    0        0 wlp2s0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun6
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 wlp2s0
192.168.1.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp2s0

He estado jugando con iptablesprogramas ip route, pero soy un poco novato en todos estos. Hasta donde tengo entendido, iptablesen realidad no enruta los paquetes, sino que los filtra (puedo estar muy equivocado). Entonces, ¿hay alguna forma de enrutar los paquetes ip route?

Respuesta1

El enrutamiento normal se basa en destinos, no en interfaces (a menos que configure el enrutamiento basado en políticas), por lo tanto, debe enrutar todo el tráfico saliente a la 10.0.0.0/24red:

ip route del default
ip route add default via 10.0.0.254

En realidad, no importa a través de qué dirección 10.0.0.0/24lo envíes, debería llegar a tu programa.

información relacionada