Quiero que todo mi tráfico pase por TUN
la interfaz.
Entonces, como puede ver, el tráfico se dirige a la dirección TUN
de interfaz 10.0.0.1
desde cada programa. Luego, el programa adjunto TUN
hace 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:
- Primero, inicialicé
tunX
el 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);
- 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 tunfd
y 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 iptables
programas ip route
, pero soy un poco novato en todos estos. Hasta donde tengo entendido, iptables
en 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/24
red:
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/24
lo envíes, debería llegar a tu programa.