Um programa simples de encaminhamento IPIP que suporta pacotes UDP, TCP e ICMP. Este programa usa soquetes AF_PACKET brutos. Quando um cliente envia um pacote para a máquina de encaminhamento com o IP de destino como IP de escuta do programa e a porta está acima de 1024, ele criará um pacote IPIP adicionando um cabeçalho IP externo e o enviará para o IP de destino junto com a execução de NAT para o túnel do ponto final IPIP. Quando o programa receber pacotes IPIP, ele os enviará de volta ao cliente.
Nota - A partir de agora, ele só envia pacotes se a porta UDP/TCP estiver acima de 1024. Sei que isso não é conveniente, mas pretendo implementar um recurso que exclua apenas determinadas portas por meio de um arquivo de configuração em um programa futuro que planejo fazer. Estou liberando o código deste programa para simplesmente mostrar como é feito o encaminhamento IPIP.
Nota - Isso usa soquetes AF_PACKET e o kernel copia o pacote para o espaço do usuário. Pretendo usar o DPDK em algum momento no futuro, o que deve resultar em melhor desempenho.
Aqui está o uso do programa:
./IPIPForward <Listen IP> <Listen Port> <Destination IP> <Nat IP> <Nat Port> <Interface> [<Thread Count>]
Aqui está um exemplo:
./IPIPForward 10.50.0.3 27015 10.50.0.4 10.2.0.5 27015 ens18 4
Compilei este programa usando GCC 7.
Aqui está o que usei para construir o programa:
gcc-7 -g IPIPForward.c -g common.c -o IPIPForward -lpthread
Também incluí avisos para garantir que não estava faltando nada ali. No entanto, este é o comando básico de construção.