Un programme de transfert IPIP simple qui prend en charge les paquets UDP, TCP et ICMP. Ce programme utilise des sockets AF_PACKET bruts. Lorsqu'un client envoie un paquet à la machine de transfert avec l'adresse IP de destination comme adresse IP d'écoute du programme et que le port est supérieur à 1024, il créera un paquet IPIP en ajoutant un en-tête IP externe et l'enverra à l'adresse IP de destination tout en effectuant NAT pour le tunnel du point de terminaison IPIP. Lorsque le programme reçoit des paquets IPIP, il les renvoie au client.
Remarque - Pour le moment, il n'envoie des paquets que si le port UDP/TCP est supérieur à 1024. Je sais que ce n'est pas pratique, mais je prévois d'implémenter une fonctionnalité qui exclut uniquement certains ports via un fichier de configuration dans un futur programme que je prévois. faire. Je publie le code de ce programme pour montrer simplement comment le transfert IPIP est effectué.
Remarque - Cela utilise les sockets AF_PACKET et le noyau copie le paquet dans l'espace utilisateur. Je prévois d'envisager d'utiliser DPDK à un moment donné dans le futur, ce qui devrait entraîner de meilleures performances.
Voici l'utilisation du programme :
./IPIPForward <Listen IP> <Listen Port> <Destination IP> <Nat IP> <Nat Port> <Interface> [<Thread Count>]
Voici un exemple :
./IPIPForward 10.50.0.3 27015 10.50.0.4 10.2.0.5 27015 ens18 4
J'ai compilé ce programme en utilisant GCC 7.
Voici ce que j'ai utilisé pour construire le programme :
gcc-7 -g IPIPForward.c -g common.c -o IPIPForward -lpthread
J'ai également inclus des avertissements pour m'assurer de ne rien manquer. Cependant, il s'agit de la commande de construction de base.