Olhando o código-fonte para tcpkill , ele usa a libnet para gerar um pacote RST para matar uma determinada conexão TCP. Não sei por que não está funcionando (embora verificar a versão do PCAP em que ela foi construída seja um ótimo local para começar). Você também pode usar o tcpdump para procurar os pacotes RST que ele deve enviar.
Em relação à implementação do equivalente em Perl, uma vez tive que fazer algo parecido. Abaixo está o código (não testado!) Que pode apontar você na direção certa.
use NetPacket::Ethernet;
use NetPacket::IP;
use NetPacket::TCP;
use Net::RawIP;
... (the rest of your script) ...
sub process_packet {
my ($user_data,$header,$packet) = @_;
my $ethernet_frame = NetPacket::Ethernet::strip($packet);
my $ip_packet = NetPacket::IP->decode($ethernet_frame);
my $tcp = NetPacket::TCP->decode($ip_packet->{data});
my $reset_packet = new Net::RawIP;
$reset_packet->set({
ip => {
saddr => $ip_packet->{dest_ip},
daddr => $ip_packet->{src_ip}
},
tcp => {
source => $tcp->{dest_port},
dest => $tcp->{src_port}
},
rst => 1,
seq => $ip->{acknum},
data => 'access denied'
});
$reset_packet->send();
}
tcpkill é mais refinado em termos de tentar descobrir o número de seqüência correto, que é o que os sinalizadores -1..9 são para. Você tentou usar valores diferentes para esse sinalizador?