# TUN/TAP interfaces
En el mundo de las redes siempre se habla de interfaces tun/tap de forma indistinta, hasta ahora, yo tambien lo hacia, pero llega un momento de la vida donde uno tiene que madurar y ver de que narices va esto :joy_cat:.
Vamos al meollo. En networking, las interfaces TUN y TAP son interfaces virtuales que se crean y se gestionan en espacio de kernel. Mencionar que como estas interfaces son virtuales se gestionan directamente vía softaware, no como las interfaces reales que se gestionan con unos drivers diferentes, ad-hoc de la interfaz. Los drivers TUN/TAP se crearon en los 2000 como una unión de los avances de los drivers desarrollados en las comunidades de Solaris, Linux, BSD. Actualmente los drivers solo tienen mantenimiento por los kernels de linux y FreeBSD.
Ambos tipos de interfaces se utilizan para tunelado, pero no pueden ser utilizadas a la vez dado que trabajan en niveles distintos. Las TUN, de network TUNnel, emula la capa de red y puede llegar hacer FW de paquetes. En cambio las interfaces TAP, trabajan en capa 2, y emulan un equipo en capa 2.
* `TUN` se puede llegar a utilizar para routing.
* `TAP` se puede llegara utilizar para crear un bridge.
Los paquetes son enviados por el sistema operativo a través de una interfaz TUN/TAP, y serán recibidos por algun programa de espacio de usuario, el cual, está enganchado directamente en la interfaz. Cualquier programa de espacio de usuario podrá pasar paquetes por las interfaces, y las interfaces virtuales se lo pasarán al stack de red pro defecto, emulando la recepción de los paquetes inyectados desde espacio de usuario.

Para la creación de estas interfaces lo podemos hacer por ioctl :smile_cat: o podemos hacerlo mas fasil :joy_cat: a través del binario `tunctl`. Puede que en nuestra distribución no lo tengamos instalado, por lo que habrá que instalarlo. Para instalarlo, podemos hacer un:
```bash
sudo apt install -y uml-utilities
```
Este paquete se trata del User-mode Linux (utility programs).
Para crear una un interfaz podemos hacer lo siguiente:
```bash
tunctl -t tun
```
Para eliminarla:
```bash
tunctl -d tun
```
Cosa graciosa, podefecto estas interfaces tienen un owner... no tengo muy claro por que. He buscado información al respecto pero no he encontrado nada. Además he hecho pruebas de funcionamiento con las interfaces cambiando de ususario y no se hace nada. Si se quiere especificar un user para la interfaz se puede hacer de la siguiente manera, si no, tomará el id del user que ejecute el comando.
```bash
tunctl -t tun -u user
```
Para crear interfaces TAP tenemos dos opciones, que el principio del nombre empiece por `tapX` o especificar explicitamente el siguiente parametro. Para eliminarlas es igual.
```bash
tunctl -p -t intf
```
El parametro `-p` ya no va. Jajajajaja vaya risa. Por que? por que crea las interfaces del mismo tipo... modo `tap` todo. Absurdo.

---
Sorpresa al terminar de escribir estas notas, hay un comando para trabajar con tun-tap desde iproute2:
https://baturin.org/docs/iproute2/#ip-tuntap
Tocate los pies... realmente los mundos tun-tap están muy entre mezclados dado que hemos probado a poner a una TAP una IP y si se puede... Es dificil diferenciarlas cual es el uso de cada cual. Para ver si es de un tipo u otro, tenemos que ejecutar un:
```bash
ethtool -i intf
```
Y fijarnos en el cambio de `bus-info`, ahí nos dirá de que tipo es. Dejo pruebas:

## Referencias chingonas
* Man TUN: https://man.freebsd.org/cgi/man.cgi?query=tun&sektion=4&apropos=0&manpath=FreeBSD+13.2-RELEASE+and+Ports
* Man TAP: https://man.freebsd.org/cgi/man.cgi?query=tap&sektion=4
* Man tunctl: https://linux.die.net/man/8/tunctl
* Command not found `tunctl`, https://command-not-found.com/tunctl
* Kernel tun/tap info, https://www.kernel.org/doc/html/v5.8/networking/tuntap.html