国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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運維】歡迎添加關注!文章轉載請注明出處。

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

    關注

    4

    文章

    1468

    瀏覽量

    42880
  • 網絡
    +關注

    關注

    14

    文章

    8265

    瀏覽量

    94771
  • 數據包
    +關注

    關注

    0

    文章

    270

    瀏覽量

    25597

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RTL9301管理型交換機DHCP Server使用方法

    RTL9301管理型交換機DHCP Server使用方法
    的頭像 發表于 02-01 10:52 ?1303次閱讀
    RTL9301管理型交換機DHCP Server<b class='flag-5'>使用方法</b>

    ups電源的作用和使用方法詳解

    UPS(不間斷電源)是一種重要的電力保護設備,主要用于在電網供電異常時提供臨時的后備電源,并改善電源質量。以下是其核心作用和使用方法的詳細介紹:一、UPS的主要作用核心:提供不間斷電力斷電保護:在
    的頭像 發表于 01-08 09:21 ?1219次閱讀
    ups電源的作用和<b class='flag-5'>使用方法</b>詳解

    芯源IR調制器都有哪些具體使用?使用方法是怎樣的?

    芯源IR調制器都有哪些具體使用?以及使用方法是怎樣的?
    發表于 12-02 06:33

    圖撲軟件 3D 場景預加載應用實現

    應用中,資源預加載尤為重要,可有效解決首次加載時的卡頓、白屏及交互延遲等問題。 預加載實現方案 01 基礎實現原理 HT for Web 中所有資源的請求都會經過 ht.Default.convertURL 方法,該
    的頭像 發表于 12-01 16:04 ?527次閱讀
    圖撲軟件 3D <b class='flag-5'>場景</b>預加載應用<b class='flag-5'>實現</b>

    堆棧的定義,堆棧的使用方法

    和使用; 對于8086CPU,進出堆棧的只能是2字節的數據。 2 堆棧的使用方法 常用的堆棧相關指令包括PUSH POP PUSHF和POPF,語法如下: PUSH 源操作數;將指定操作數入棧保護 POP
    發表于 11-21 06:49

    教程來啦!LuatOS中的消息通信機制詳解及其應用場景

    在資源受限的嵌入式環境中,LuatOS采用消息機制實現模塊間解耦與高效通信。通過預定義消息名稱(如“new_msg”),開發者可輕松構建響應式程序結構。接下來我們將深入剖析其實現原理與典型使用方法
    的頭像 發表于 09-26 18:59 ?426次閱讀
    教程來啦!LuatOS中的消息通信機制詳解及其應用<b class='flag-5'>場景</b>

    條碼掃碼設備的使用方法

    使用方法,能讓其充分發揮價值,為各行業的規范化管理提供有力支撐。一、條碼掃碼設備的主要類型不同場景對條碼掃碼設備的需求存在差異,目前主流類型可分為四類,適配不同工作
    的頭像 發表于 09-17 16:15 ?951次閱讀
    條碼掃碼設備的<b class='flag-5'>使用方法</b>

    HT 流暢過渡動畫 × 場景切換實現方案

    在圖撲 HT 項目中,尤其是復雜應用里,單一場景或圖紙通常難以承載所有需求,因此在多個圖紙或場景之間進行切換是一種常見的實現方式。本文將深入解析圖撲 HT 項目中場景/圖紙切換的核心
    的頭像 發表于 09-03 14:49 ?869次閱讀
    HT 流暢過渡動畫 × <b class='flag-5'>場景</b>切換<b class='flag-5'>實現</b>方案

    錫膏的儲存及使用方法詳解

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

    單模八芯光纖使用方法指南

    單模八芯光纖(通常指單模8芯束管式或帶狀光纖)的使用方法涵蓋安裝、熔接、測試、維護等關鍵環節,需結合其結構特性和應用場景進行規范操作。以下是具體使用指南: 一、單模八芯光纖結構解析 核心組成: 光纖
    的頭像 發表于 06-26 09:51 ?2177次閱讀

    漫畫科普 | 功率放大器到底有哪些應用?帶你解鎖功放經典應用場景!(一)

    漫畫科普 | 功率放大器到底有哪些應用?帶你解鎖功放經典應用場景!(一)
    的頭像 發表于 06-20 20:00 ?985次閱讀
    漫畫科普 | 功率放大器到底有哪些應用?帶你解鎖功放<b class='flag-5'>經典</b>應用<b class='flag-5'>場景</b>!(一)

    參考cycx3_uvc_ov5640例程,想進行按鍵觸發拍照,使用方法一,請問怎么實現的?

    參考cycx3_uvc_ov5640例程,想進行按鍵觸發拍照,使用方法一,請問怎么實現的?現在硬件按鍵觸發沒有問題,上位機軟件拍照也沒有問題。 glStatusBuffer[0] = 0x02
    發表于 05-21 07:24

    LCR測試儀的使用方法與注意事項

    LCR測試儀的使用方法、操作注意事項及常見故障處理,幫助讀者高效、安全地掌握這一儀器的使用技巧。 ? 二、LCR測試儀的基本使用方法 1. 準備階段 (1)設備檢查:確保測試儀電源線、連接線完好,電源開關關閉。檢查測試夾具或探針
    的頭像 發表于 04-29 10:36 ?1.3w次閱讀
    LCR測試儀的<b class='flag-5'>使用方法</b>與注意事項

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

    西門子PLC-模擬量采集計算使用方法,很實用
    發表于 04-09 15:29 ?1次下載

    PXI-8433/4的規范使用方法分享

    應用中,因兩線制接線配置不當導致通訊障。本文將以此問題為入點,系統講解PXI-8433/4的規范使用方法
    的頭像 發表于 03-14 10:38 ?1951次閱讀
    PXI-8433/4的規范<b class='flag-5'>使用方法</b>分享