Programa AC que fiz para enviar pacotes UDP para um IP e porta de destino especificados por meio de soquetes brutos. Este programa suporta o seguinte:
pthreads
(multithreading).Nota - Este programa não suporta fragmentação de pacotes e realmente não faz sentido adicionar esse suporte, já que não é para isso que o programa foi feito.
Atualmente, estou aprendendo mais sobre inspeção aprofundada de pacotes e também como funcionam os ataques (D)DoS. Eu fiz esse programa e só uso na minha rede local. Estou planejando criar um aplicativo de servidor UDP que seja capaz de filtrar ataques (D)DoS e bloqueá-los usando XDP, uma vez detectados. Esta ferramenta será usada para testar esta aplicação de servidor que irei fazer. Eventualmente, estarei criando um software que será executado em minha rede Anycast e será capaz de eliminar ataques DoS (D) detectados via XDP em todos os servidores POP.
Usei o GCC para compilar este programa. Você deve adicionar -lpthread
no final do comando ao compilar via GCC.
Aqui está um exemplo:
gcc -g UDP_Sender.c -o UDP_Sender -lpthread
O uso é o seguinte:
Usage: ./UDP_Sender <Source IP> <Destination IP> <Destination IP> [<Max> <Min> <Interval> <Thread Count>]
Observe que o intervalo está em microssegundos . As cargas mínimas e máximas estão em bytes . Se você definir o intervalo como 0, ele não aguardará entre o envio de pacotes em cada thread.
Aqui está um exemplo:
./UDP_Sender 192.168.80.10 10.50.0.4 27015 1000 1200 1000 3
O acima envia pacotes continuamente para 10.50.0.4
(porta 27015
) e aparece em 192.168.80.10
(no meu caso, falsificado). Ele envia de 1000
a 1200
bytes de dados de carga útil a cada 1000
microssegundos. Ele enviará esses pacotes de 3
threads.
Consegui enviar cerca de 300 mbps (~ 23K PPS) usando este programa em minha rede local até sobrecarregar meu roteador e VM (eu tenho um Edge Router de baixo custo). Isso ocorreu sem intervalo definido e usando um thread. A VM que enviava as informações tinha 6 vCPUs e o processador era um Intel Xeon mais antigo com clock de 2,4 GHz. Esta VM também estava usando cerca de 90 a 95% da CPU ao executar este programa.
Ainda sou bastante novo em C e programação de rede. Portanto, tenho certeza de que há melhorias que podem ser feitas. Se você encontrar algo que possa ser melhorado, por favor me avise :)