bpftrace对icmp进行监控,查看icmp包是哪个进程发出的

这篇博客介绍了如何利用BPFtrace工具来监控特定目标IP(8.8.8.8)的网络流量。通过kprobe和kr探针跟踪__dev_queue_xmit函数,提取并解析IP头和UDP头中的信息,包括源IP、目的IP、数据包ID、总长度、碎片偏移和端口号等关键数据。这有助于理解网络通信的细节和流量模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

apt install bpftrace

#!/usr/bin/bpftrace
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/socket.h>

kprobe:__dev_queue_xmit
{
	//获取调用次数
	@dev_queue_xmit[tid]=count();
	@skb[tid]=(struct sk_buff *)arg0;
}

kr:__dev_queue_xmit
/@skb[tid]/
{
	$skb = @skb[tid];
	// get IPv4 header; see skb_network_header():
	$iph = (struct iphdr *)($skb->head + $skb->network_header);
	$sip = ntop(AF_INET, $iph->saddr);
	$dip = ntop(AF_INET, $iph->daddr);
         //id 为ip数据包标识
        $id = (($iph->id & 0x00ff) << 8) | (($iph->id & 0xff00) >> 8);
        $tot_len = (($iph->tot_len & 0x00ff) << 8) | (( $iph->tot_len  & 0xff00) >> 8);
        $frag_off = (($iph->frag_off & 0x001f) << 8) | (($iph->frag_off  & 0xff00) >> 8) ;

	$udphdr = (struct udphdr *)($skb->head + $skb->transport_header);
	// 以下两行不可使用,因为经过一个变量后就取不到想要的端口号,原因未知
	$sport = (($udphdr->source & 0x00ff) << 8) | (($udphdr->source & 0xff00) >> 8);
	$dport = (($udphdr->dest & 0x00ff) << 8) | (($udphdr->dest & 0xff00) >> 8);
 	if ($iph->daddr == $1){
		printf("comm=%s,tid=%d,tot_len = %d, $skb->truesize=%d \t", comm,tid,$tot_len, $skb->truesize);
		printf("sip %s(%d) \t ---> dip %s(%d), id= %d,  frag_off = %d\n", $sip, $sport, $dip, $dport, $id, $frag_off * 8);
	}
}

监控 目标地址为8.8.8.8的ip
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值