一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

pwru的使用方法、經(jīng)典場(chǎng)景及實(shí)現(xiàn)原理

馬哥Linux運(yùn)維 ? 來(lái)源:Houmin ? 作者:Houmin ? 2022-06-28 17:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


pwru 是 Cilium 推出的基于 eBPF 開(kāi)發(fā)的網(wǎng)絡(luò)數(shù)據(jù)包排查工具,它提供了更細(xì)粒度的網(wǎng)絡(luò)數(shù)據(jù)包排查方案。本文將介紹 pwru 的使用方法和經(jīng)典場(chǎng)景,并介紹其實(shí)現(xiàn)原理。

安裝部署

部署要求

pwru 要求內(nèi)核代碼在 5.5 版本之上,--output-skb 要求內(nèi)核版本在 5.9 之上,并且要求內(nèi)核開(kāi)啟以下配置:

Option Note
CONFIG_DEBUG_INFO_BTF=y Available since >= 5.3
CONFIG_KPROBES=y
CONFIG_PERF_EVENTS=y
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y

使用方法

Usageof./pwru:
--filter-dst-ipstringfilterdestinationIPaddr
--filter-dst-portuint16filterdestinationport
--filter-funcstringfilterkernelfunctionstobeprobedbyname(exactmatch,supportsRE2regularexpression)
--filter-markuint32filterskbmark
--filter-netnsuint32filternetnsinode
--filter-protostringfilterL4protocol(tcp,udp,icmp)
--filter-src-ipstringfiltersourceIPaddr
--filter-src-portuint16filtersourceport
--output-limit-linesuintexittheprogramafterthenumberofeventshasbeenreceived/printed
--output-metaprintskbmetadata
--output-relative-timestampprintrelativetimestampperskb
--output-skbprintskb
--output-stackprintstack
--output-tupleprintL4tuple

案例演示

下圖案例演示了 pwru 展現(xiàn)出快速定位出數(shù)據(jù)包被 iptables 規(guī)則 drop 掉的原因:

becdfe8a-f61e-11ec-ba43-dac502259ad0.gif

在不設(shè)置 iptables 規(guī)則之前:

bedbc11e-f61e-11ec-ba43-dac502259ad0.png

添加了 iptables 規(guī)則之后

iptables-tfilter-IOUTPUT1-mtcp--prototcp--dst1.1.1.1/32-jDROP

可以看到在 nf_hook_slow 函數(shù)后發(fā)生了變化:

bef9b250-f61e-11ec-ba43-dac502259ad0.png

我們可以看到數(shù)據(jù)包在 nf_hook_slow 判決為 NF_DROP,調(diào)用了 kfree_skb

intnf_hook_slow(structsk_buff*skb,structnf_hook_state*state,
conststructnf_hook_entries*e,unsignedints)
{
unsignedintverdict;
intret;

for(;snum_hook_entries;s++){
verdict=nf_hook_entry_hookfn(&e->hooks[s],skb,state);
switch(verdict&NF_VERDICT_MASK){
caseNF_ACCEPT:
break;
caseNF_DROP:
kfree_skb(skb);
ret=NF_DROP_GETERR(verdict);
if(ret==0)
ret=-EPERM;
returnret;
caseNF_QUEUE:
ret=nf_queue(skb,state,s,verdict);
if(ret==1)
continue;
returnret;
default:
/*ImplicithandlingforNF_STOLEN,aswellasanyother
*nonconventionalverdicts.
*/
return0;
}
}

return1;
}

原理實(shí)現(xiàn)

pwru 本質(zhì)上是向 kprobe 注冊(cè)了一些 eBPF code,根據(jù) pwru 傳入的參數(shù)可以更新 eBPF Map,改變限制條件,從而更新輸出。

比如在 FilterCfg 里面制定了過(guò)濾的 IP 地址和協(xié)議等條件

typeFilterCfgstruct{
FilterMarkuint32

//Filterl3
FilterIPv6uint8
FilterSrcIP[16]byte
FilterDstIP[16]byte

//Filterl4
FilterProtouint8
FilterSrcPortuint16
FilterDstPortuint16

//TODO:iftherearemoreoptionslater,thenyoucanconsiderusingabitmap
OutputRelativeTSuint8
OutputMetauint8
OutputTupleuint8
OutputSkbuint8
OutputStackuint8

Padbyte
}

會(huì)根據(jù) pwru 傳入的參數(shù)更新這個(gè) eBPF Map

funcConfigBPFMap(flags*Flags,cfgMap*ebpf.Map){
cfg:=FilterCfg{
FilterMark:flags.FilterMark,
}

ifflags.FilterSrcPort>0{
cfg.FilterSrcPort=byteorder.HostToNetwork16(flags.FilterSrcPort)
}
ifflags.FilterDstPort>0{
cfg.FilterDstPort=byteorder.HostToNetwork16(flags.FilterDstPort)
}


switchstrings.ToLower(flags.FilterProto){
case"tcp":
cfg.FilterProto=syscall.IPPROTO_TCP
case"udp":
cfg.FilterProto=syscall.IPPROTO_UDP
case"icmp":
cfg.FilterProto=syscall.IPPROTO_ICMP
case"icmp6":
cfg.FilterProto=syscall.IPPROTO_ICMPV6
}

//...

iferr:=cfgMap.Update(uint32(0),cfg,0);err!=nil{
log.Fatalf("Failedtosetfiltermap:%v",err)
}
}

在 eBPF code 中,可以看到會(huì)讀取配置 bpf_map_lookup_elem,然后進(jìn)而執(zhí)行真正的 filter:

structconfig{
u32mark;
u8ipv6;
unionaddrsaddr;
unionaddrdaddr;
u8l4_proto;
u16sport;
u16dport;
u8output_timestamp;
u8output_meta;
u8output_tuple;
u8output_skb;
u8output_stack;
u8pad;
}__attribute__((packed));

static__always_inlineint
handle_everything(structsk_buff*skb,structpt_regs*ctx){
structevent_tevent={};

u32index=0;
structconfig*cfg=bpf_map_lookup_elem(&cfg_map,&index);

if(cfg){
if(!filter(skb,cfg))
return0;

set_output(ctx,skb,&event,cfg);
}

event.pid=bpf_get_current_pid_tgid();
event.addr=PT_REGS_IP(ctx);
event.skb_addr=(u64)skb;
event.ts=bpf_ktime_get_ns();
bpf_perf_event_output(ctx,&events,BPF_F_CURRENT_CPU,&event,sizeof(event));

return0;
}

可以看到,這里通過(guò) bpf_perf_event_output 將過(guò)濾結(jié)果以 Perf event 傳遞上來(lái)。

rd,err:=perf.NewReader(events,os.Getpagesize())
iferr!=nil{
log.Fatalf("Creatingperfeventreader:%s",err)
}
deferrd.Close()

//...
vareventpwru.Event
for{
record,err:=rd.Read()
iferr!=nil{
ifperf.IsClosed(err){
return
}
log.Printf("Readingfromperfeventreader:%s",err)
}

ifrecord.LostSamples!=0{
log.Printf("Perfeventringbufferfull,dropped%dsamples",record.LostSamples)
continue
}

iferr:=binary.Read(bytes.NewBuffer(record.RawSample),binary.LittleEndian,&event);err!=nil{
log.Printf("Parsingperfevent:%s",err)
continue
}

output.Print(&event)

select{
case<-ctx.Done():
??break
default:
continue
}
}

原文標(biāo)題:pwru: 一款基于 eBPF 的細(xì)粒度網(wǎng)絡(luò)數(shù)據(jù)包排查工具

文章出處:【微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1416

    瀏覽量

    41451
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7815

    瀏覽量

    90989
  • 數(shù)據(jù)包
    +關(guān)注

    關(guān)注

    0

    文章

    269

    瀏覽量

    24998

原文標(biāo)題:pwru: 一款基于 eBPF 的細(xì)粒度網(wǎng)絡(luò)數(shù)據(jù)包排查工具

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    錫膏的儲(chǔ)存及使用方法詳解

    錫膏是一種常用的焊接輔助材料,廣泛應(yīng)用于電子、電器、通訊、儀表等行業(yè)的焊接工藝中。正確的儲(chǔ)存和使用方法對(duì)于保證錫膏的品質(zhì)和焊接效果至關(guān)重要。本文將就錫膏的儲(chǔ)存和使用方法進(jìn)行詳細(xì)介紹,希望能對(duì)廣大焊接工作者有所幫助。
    的頭像 發(fā)表于 07-18 17:36 ?333次閱讀
    錫膏的儲(chǔ)存及<b class='flag-5'>使用方法</b>詳解

    參考cycx3_uvc_ov5640例程,想進(jìn)行按鍵觸發(fā)拍照,使用方法一,請(qǐng)問(wèn)怎么實(shí)現(xiàn)的?

    參考cycx3_uvc_ov5640例程,想進(jìn)行按鍵觸發(fā)拍照,使用方法一,請(qǐng)問(wèn)怎么實(shí)現(xiàn)的?現(xiàn)在硬件按鍵觸發(fā)沒(méi)有問(wèn)題,上位機(jī)軟件拍照也沒(méi)有問(wèn)題。 glStatusBuffer[0] = 0x02
    發(fā)表于 05-21 07:24

    西門子PLC-模擬量采集計(jì)算使用方法

    西門子PLC-模擬量采集計(jì)算使用方法,很實(shí)用
    發(fā)表于 04-09 15:29 ?0次下載

    精密空調(diào)操作使用方法詳解

    精密空調(diào)操作使用方法詳解
    的頭像 發(fā)表于 02-10 14:44 ?1040次閱讀
    精密空調(diào)操作<b class='flag-5'>使用方法</b>詳解

    快速了解電源模塊的使用方法

    電源是整個(gè)電路可靠工作的核心部分。然而,由于電源電路的電流和發(fā)熱量較大,容易出現(xiàn)故障。今天我為大家介紹一下電源模塊的使用方法
    的頭像 發(fā)表于 01-21 15:24 ?775次閱讀

    瑞芯微開(kāi)發(fā)板/主板Android系統(tǒng)APK簽名文件使用方法,實(shí)用干貨

    瑞芯微主板/開(kāi)發(fā)板Android系統(tǒng),APK系統(tǒng)簽名文件使用方法
    的頭像 發(fā)表于 12-26 09:43 ?949次閱讀
    瑞芯微開(kāi)發(fā)板/主板Android系統(tǒng)APK簽名文件<b class='flag-5'>使用方法</b>,實(shí)用干貨

    AB伺服軟件使用方法

    AB伺服軟件使用方法
    發(fā)表于 12-24 14:45 ?0次下載

    示波器高壓探頭使用方法

    示波器高壓探頭是一種用于測(cè)量高電壓信號(hào)的儀器,通常用于高壓電源、電機(jī)、變壓器等電氣設(shè)備的測(cè)試。以下是示波器高壓探頭的詳細(xì)使用方法
    的頭像 發(fā)表于 10-03 16:43 ?1417次閱讀

    毫伏表的使用方法和注意事項(xiàng)

    毫伏表是一種用于測(cè)量電壓的電子儀器,特別擅長(zhǎng)于測(cè)量毫伏級(jí)以下的微小電壓,包括微伏交流電壓。這種儀器在電子學(xué)和電氣工程中有著廣泛的應(yīng)用,是電子電路初學(xué)者必備的測(cè)量設(shè)備之一。毫伏表的使用方法和注意事項(xiàng)如下:
    的頭像 發(fā)表于 10-03 16:21 ?3206次閱讀

    探針頭型使用方法有哪些

    探針頭型的使用方法多種多樣,具體取決于探針頭型的類型、被測(cè)對(duì)象的特性以及測(cè)試需求。以下是一些常見(jiàn)探針頭型的使用方法概述: 1. 凹頭探針 用途 :主要用于測(cè)試長(zhǎng)導(dǎo)腳、端子及繞線柱等較長(zhǎng)或較粗的被測(cè)點(diǎn)
    的頭像 發(fā)表于 09-07 10:57 ?1860次閱讀

    光纖收發(fā)器的使用方法和注意事項(xiàng)

    光纖收發(fā)器作為光纖通信系統(tǒng)中的關(guān)鍵設(shè)備,其正確的使用方法和注意事項(xiàng)對(duì)于確保網(wǎng)絡(luò)傳輸?shù)姆€(wěn)定性和可靠性至關(guān)重要。光纖收發(fā)器作為光纖通信系統(tǒng)中的關(guān)鍵設(shè)備,其正確的使用方法和注意事項(xiàng)對(duì)于確保網(wǎng)絡(luò)傳輸?shù)姆€(wěn)定性和可靠性至關(guān)重要。
    的頭像 發(fā)表于 08-26 15:20 ?2313次閱讀

    【GD32 MCU 入門教程】GD32 MCU FPU 使用方法

    GD32 MCU FPU 使用方法
    的頭像 發(fā)表于 08-25 09:24 ?1382次閱讀
    【GD32 MCU 入門教程】GD32 MCU FPU <b class='flag-5'>使用方法</b>

    MSP430 FRAM技術(shù)–使用方法和最佳實(shí)踐

    電子發(fā)燒友網(wǎng)站提供《MSP430 FRAM技術(shù)–使用方法和最佳實(shí)踐.pdf》資料免費(fèi)下載
    發(fā)表于 08-23 09:23 ?0次下載
    MSP430 FRAM技術(shù)–<b class='flag-5'>使用方法</b>和最佳實(shí)踐

    DC/DC模擬的基本使用方法和特性確認(rèn)方法

    本篇介紹了DC/DC模擬的基本使用方法及確認(rèn)基本特性的方法。
    的頭像 發(fā)表于 08-20 17:08 ?1389次閱讀
    DC/DC模擬的基本<b class='flag-5'>使用方法</b>和特性確認(rèn)<b class='flag-5'>方法</b>

    圖片動(dòng)畫(huà)控件和Video image控件的使用方法

    在UI開(kāi)發(fā)過(guò)程中,序列幀基本是繞不開(kāi)的,AWTK 支持多種方法實(shí)現(xiàn)序列幀顯示,本文介紹圖片動(dòng)畫(huà)控件和Video image控件的使用方法
    的頭像 發(fā)表于 08-06 16:44 ?1673次閱讀
    圖片動(dòng)畫(huà)控件和Video image控件的<b class='flag-5'>使用方法</b>