最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

ebpf 网络跟踪原理

维修 admin 34浏览 0评论

ebpf 网络跟踪原理

认为最主要是因为不清楚内核中都有哪些函数和跟踪点可以拿来跟踪。

第一个,kfree_skb ,它经常在网络异常丢包时调用;第二个,consume_skb ,它在正常网络连接完成时调用


sudo ./bpftrace -e 'kprobe:kfree_skb /comm=="curl"/ {printf("kstack: %s\n", kstack);}'


curl time.geekbang

kprobe:kfree_skb 指定跟踪的内核函数为 kfree_skb;

紧随其后的 /comm=="curl"/ ,表示只跟踪 curl 进程,这是为了过滤掉其他不相关的进程操作

kprobe:kfree_skb /comm=="curl"/
{
  // 1. 第一个参数是 struct sk_buff
  $skb = (struct sk_buff *)arg0;

  // 2. 从网络头中获取源IP和目的IP
  $iph = (struct iphdr *)($skb->head + $skb->network_header);
  $sip = ntop(AF_INET, $iph->saddr);
  $dip = ntop(AF_INET, $iph->daddr);

  // 3. 只处理TCP协议
  if ($iph->protocol == IPPROTO_TCP)
  {
    // 4. 打印源IP、目的IP和内核调用栈
    printf("SKB dropped: %s->%s, kstack: %s\n", $sip, $dip, kstack);
  }
}

ebpf 网络跟踪原理

认为最主要是因为不清楚内核中都有哪些函数和跟踪点可以拿来跟踪。

第一个,kfree_skb ,它经常在网络异常丢包时调用;第二个,consume_skb ,它在正常网络连接完成时调用


sudo ./bpftrace -e 'kprobe:kfree_skb /comm=="curl"/ {printf("kstack: %s\n", kstack);}'


curl time.geekbang

kprobe:kfree_skb 指定跟踪的内核函数为 kfree_skb;

紧随其后的 /comm=="curl"/ ,表示只跟踪 curl 进程,这是为了过滤掉其他不相关的进程操作

kprobe:kfree_skb /comm=="curl"/
{
  // 1. 第一个参数是 struct sk_buff
  $skb = (struct sk_buff *)arg0;

  // 2. 从网络头中获取源IP和目的IP
  $iph = (struct iphdr *)($skb->head + $skb->network_header);
  $sip = ntop(AF_INET, $iph->saddr);
  $dip = ntop(AF_INET, $iph->daddr);

  // 3. 只处理TCP协议
  if ($iph->protocol == IPPROTO_TCP)
  {
    // 4. 打印源IP、目的IP和内核调用栈
    printf("SKB dropped: %s->%s, kstack: %s\n", $sip, $dip, kstack);
  }
}

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论