我正在尝试创建一个小型服务来监视和终止具有鳍旗帜。我可以用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 标志的作用。您是否尝试过为该标志使用不同的值?