Un sencillo programa de reenvío IPIP que admite paquetes UDP, TCP e ICMP. Este programa utiliza sockets AF_PACKET sin formato. Cuando un cliente envía un paquete a la máquina de reenvío con la IP de destino como la IP de escucha del programa y el puerto está por encima de 1024, creará un paquete IPIP agregando un encabezado IP externo y lo enviará a la IP de destino junto con realizar NAT para el túnel del punto final IPIP. Cuando el programa reciba paquetes IPIP, los enviará de regreso al cliente.
Nota : a partir de ahora, solo envía paquetes si el puerto UDP/TCP está por encima de 1024. Sé que esto no es conveniente, pero planeo implementar una función que solo excluya ciertos puertos a través de un archivo de configuración en un programa futuro que planeo. para hacer. Estoy publicando el código de este programa para mostrar simplemente cómo se realiza el reenvío IPIP.
Nota : esto utiliza sockets AF_PACKET y el kernel copia el paquete en el espacio del usuario. Planeo considerar el uso de DPDK en algún momento en el futuro, lo que debería resultar en un mejor rendimiento.
Aquí está el uso del programa:
./IPIPForward <Listen IP> <Listen Port> <Destination IP> <Nat IP> <Nat Port> <Interface> [<Thread Count>]
He aquí un ejemplo:
./IPIPForward 10.50.0.3 27015 10.50.0.4 10.2.0.5 27015 ens18 4
Compilé este programa usando GCC 7.
Esto es lo que usé para construir el programa:
gcc-7 -g IPIPForward.c -g common.c -o IPIPForward -lpthread
También incluí advertencias para asegurarme de que no me faltaba nada allí. Sin embargo, este es el comando de compilación básico.