终止已完成的套接字(使用 libpcap - tcpdump/tcpkill)

终止已完成的套接字(使用 libpcap - tcpdump/tcpkill)

我正在尝试创建一个小型服务来监视和终止具有旗帜。我可以用tcpdump(我也尝试了 tcp[13] & 1):

tcpdump "tcp[tcpflags] & tcp-fin != 0"

tcpkill应该使用与tcpdump,但效果不一样。我试过很多命令,但应该只是(-i eth0 可选):

tcpkill -9 "tcp[tcpflags] & tcp-fin != 0"

上面写着(但没有别的,成功tcpkill输出数据):

tcpkill:在 eth0 上监听 [tcp[tcpflags] & tcp-fin != 0]

查看源代码,它应该将正确的过滤器传递给 pcap(在 [ ] 括号之间)。使用 perl 脚本网络::Pcap我可以确定过滤器工作正常。我不知道我做错了什么,或者是不是 tcpkill/pcap 的旧版本出了问题。任何有关 tcpkill 或使用 perl 的帮助网络::Pcap杀死套接字将不胜感激。谢谢!

#!/usr/bin/perl

use strict;
use warnings;

use Net::Pcap;

my $err = '';
my $dev = 'eth0';

my ($address, $netmask);
Net::Pcap::lookupnet($dev, \$address, \$netmask, \$err);

my $pcap = Net::Pcap::open_live($dev, 1500, 1, 0, \$err);

my $filter;
Net::Pcap::compile($pcap, \$filter, "tcp[tcpflags] & tcp-fin != 0", 0, $netmask);
Net::Pcap::setfilter($pcap, $filter);

while(1)
{
 Net::Pcap::loop($pcap, 1, \&process_packet, "packet found");
}

Net::Pcap::close($pcap);

sub process_packet
{
 my($user_data, $header, $packet) = @_;
 print "$user_data\n";
}

exit 0;

答案1

看看tcpkill 的源代码,它使用 libnet 生成 RST 数据包以终止给定的 TCP 连接。我不确定它为什么不起作用(尽管验证它所针对的 PCAP 版本是一个很好的起点)。您还可以使用 tcpdump 来查找它应该发送的 RST 数据包。

关于在 Perl 中实现等效功能,我曾经做过类似的事情。以下是(未经测试的!)代码,可能会为您指明正确的方向。

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 在尝试找出正确的序列号方面更加精细,这就是 -1..9 标志的作用。您是否尝试过为该标志使用不同的值?

相关内容