我正在尝试创build一个小型服务来监视和终止带有FIN标志的套接字。 我可以得到他们与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]
看看源代码,应该将正确的filter传递给pcap(在[]括号之间)。 使用Net :: Pcap的perl脚本我可以确定filter工作正常。 我不知道我在做什么错,或者如果它是旧版本的tcpkill / pcap这是一个问题。 任何帮助tcpkill或帮助使用perl的Net :: 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;
查看tcpkill的源代码 ,它使用libnet生成一个RST包来杀死给定的TCP连接。 我不知道为什么它不起作用(虽然validation它build立的PCAP版本是一个很好的开始)。 你也可以使用tcpdump来查找应该发送的RST包。
关于在Perl中实现等价物,我曾经做过类似的事情。 下面是(未经testing!)的代码,可能会指出你在正确的方向。
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标志的用途。 你有没有尝试过使用不同的标志值?