色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

pwru的使用方法、經典場景及實現原理

馬哥Linux運維 ? 來源:Houmin ? 作者:Houmin ? 2022-06-28 17:27 ? 次閱讀

pwru 是 Cilium 推出的基于 eBPF 開發的網絡數據包排查工具,它提供了更細粒度的網絡數據包排查方案。本文將介紹 pwru 的使用方法和經典場景,并介紹其實現原理。

安裝部署

部署要求

pwru 要求內核代碼在 5.5 版本之上,--output-skb 要求內核版本在 5.9 之上,并且要求內核開啟以下配置:

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 展現出快速定位出數據包被 iptables 規則 drop 掉的原因:

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

在不設置 iptables 規則之前:

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

添加了 iptables 規則之后

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

可以看到在 nf_hook_slow 函數后發生了變化:

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

我們可以看到數據包在 nf_hook_slow 判決為 NF_DROP,調用了 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;
}

原理實現

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

比如在 FilterCfg 里面制定了過濾的 IP 地址和協議等條件

typeFilterCfgstruct{
FilterMarkuint32

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

//Filterl4
FilterProtouint8
FilterSrcPortuint16
FilterDstPortuint16

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

Padbyte
}

會根據 pwru 傳入的參數更新這個 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 中,可以看到會讀取配置 bpf_map_lookup_elem,然后進而執行真正的 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;
}

可以看到,這里通過 bpf_perf_event_output 將過濾結果以 Perf event 傳遞上來。

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
}
}

原文標題:pwru: 一款基于 eBPF 的細粒度網絡數據包排查工具

文章出處:【微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1372

    瀏覽量

    40280
  • 網絡
    +關注

    關注

    14

    文章

    7554

    瀏覽量

    88732
  • 數據包
    +關注

    關注

    0

    文章

    260

    瀏覽量

    24385

原文標題:pwru: 一款基于 eBPF 的細粒度網絡數據包排查工具

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    示波器高壓探頭使用方法

    示波器高壓探頭是一種用于測量高電壓信號的儀器,通常用于高壓電源、電機、變壓器等電氣設備的測試。以下是示波器高壓探頭的詳細使用方法
    的頭像 發表于 10-03 16:43 ?425次閱讀

    探針頭型使用方法有哪些

    探針頭型的使用方法多種多樣,具體取決于探針頭型的類型、被測對象的特性以及測試需求。以下是一些常見探針頭型的使用方法概述: 1. 凹頭探針 用途 :主要用于測試長導腳、端子及繞線柱等較長或較粗的被測點
    的頭像 發表于 09-07 10:57 ?566次閱讀

    DC/DC模擬的基本使用方法和特性確認方法

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

    圖片動畫控件和Video image控件的使用方法

    在UI開發過程中,序列幀基本是繞不開的,AWTK 支持多種方法實現序列幀顯示,本文介紹圖片動畫控件和Video image控件的使用方法
    的頭像 發表于 08-06 16:44 ?861次閱讀
    圖片動畫控件和Video image控件的<b class='flag-5'>使用方法</b>

    淺談錫膏的儲存及使用方法

    錫膏(焊錫膏)是電子組裝過程中常用的材料,它的儲存和使用方法對保證焊接質量和性能至關重要。以下是詳細的儲存及使用方法
    的頭像 發表于 06-27 10:02 ?869次閱讀

    PLC IO接口的功能及使用方法

    與外部設備通信的關鍵。PLC的IO接口功能強大且使用靈活,能夠滿足各種工業自動化場景的需求。本文將詳細闡述PLC的IO接口的功能及使用方法,旨在為讀者提供全面而深入的了解。
    的頭像 發表于 06-15 16:49 ?2039次閱讀

    可編程電源使用方法

    可編程電源使用方法 可編程電源使用方法 摘要:本文詳細介紹了可編程電源的使用方法,包括其基本概念、主要功能、選擇原則、操作步驟、注意事項以及實際應用案例,旨在幫助讀者全面了解可編程電源
    的頭像 發表于 06-10 15:29 ?985次閱讀

    現場總線的使用方法與注意事項

    的穩定可靠運行,正確的使用方法和注意事項至關重要。本文將詳細介紹現場總線的使用方法和注意事項,以供讀者參考。
    的頭像 發表于 06-06 11:49 ?776次閱讀

    變頻器的使用方法及參數調整

    變頻器作為現代工業自動化領域的重要設備,廣泛應用于各種電動機的調速控制。其通過改變電源頻率,實現對電機轉速的精確控制,從而達到節能、提高生產效率的目的。本文將詳細介紹變頻器的使用方法及參數調整,以期為相關人員提供參考。
    的頭像 發表于 05-29 15:16 ?4142次閱讀

    手柄控制代碼及使用方法

    手柄控制代碼及使用方法
    的頭像 發表于 05-15 10:19 ?1763次閱讀

    光纖熱縮管正確使用方法

    光纖熱縮管是一種用于保護光纖連接點的材料,其主要功能是在光纖連接點處提供保護,防止光纖受到機械傷害或環境因素的影響。在正確使用光纖熱縮管之前,首先需要了解其正確的使用方法。本文將詳細介紹光纖熱縮管
    的頭像 發表于 04-07 17:13 ?1484次閱讀

    手機信號屏蔽器:功能、原理及使用方法詳解

    深圳特信電子|手機信號屏蔽器:功能、原理及使用方法詳解
    的頭像 發表于 04-01 09:09 ?3080次閱讀

    555集成芯片的使用方法

    555集成芯片的使用方法主要依賴于其特定的引腳功能和電路設計。
    的頭像 發表于 03-25 14:39 ?1446次閱讀

    磁場探頭和電場探頭的使用方法與技巧

    磁場探頭和電場探頭的使用方法與技巧? 磁場探頭和電場探頭是用于測量磁場和電場的儀器。它們在科學實驗、工程設計和實際應用中都起著重要的作用。本文將詳細介紹磁場探頭和電場探頭的使用方法和技巧。 一、磁場
    的頭像 發表于 01-05 14:31 ?902次閱讀

    PCBA焊接電路中電烙鐵的使用方法

    PCBA焊接電路中電烙鐵的使用方法的相關知識。
    的頭像 發表于 12-26 10:27 ?801次閱讀
    主站蜘蛛池模板: 76人遣返航班上71人呈阳性| 超碰最新地址| 亚洲国产在线播放在线| 肉伦禁忌小说np| 青草在线在线d青草在线| 麻豆国产自制在线观看| 久久秋霞理伦片| 久久aa毛片免费播放嗯啊| 精品国产在线手机在线| 国精产品一区二区三区四区糖心| 国产二区自拍| 国产精品国产三级国产an| 国产高清砖码区| 国产极品美女视频福利| 国产精品av免费观看| 国产女人与黑人在线播放| 国产片MV在线观看| 好大好硬好湿再深一点网站| 国产亚洲精品久久久999蜜臀 | 美国一级黄色| 美女坐脸vk| 欧美国产影院| 日日干日日操日日射| 十二月综合缴缴情| 亚洲AV精品一区二区三区不卡| 无人区乱码区1卡2卡三卡在线| 亚洲AV色香蕉一区二区9255 | 欧美日韩第一区| 人人啪日日观看在线| 肉奴隷 赤坂丽在线播放| 五月丁香婷姐色| 一本色道久久88综合日韩精品 | 天堂Av亚洲欧美日韩国产综合| 无码AV精品一区二区三区| 亚洲第一成年网站视频| 伊人久久综合热青草| 97在线视频免费| 囯产精品麻豆巨作久久| 好吊射视频988gaocom| 麻豆国产自制在线观看| 秋霞电影伦网理最新在线看片|