TGTGInsighttelegram intelligenceLIVE / telegram public index
← Welcome to the Black Parade
Welcome to the Black Parade avatar

TGINSIGHT POST

Post #437

@TheB1ackParade

Welcome to the Black Parade

Views298Post view count
PostedNov 511/05/2023, 06:22 PM
Post content

Post content

最近散步时的随机漫游: 1. 我想要什么样的 tcpdump。一开始的动机是 tcpdump 抓不到 bpf 网络里的包,比如在 ingress 方向有 tc-bpf/xdp 把流量重定向给了其他设备的时候 tcpdump 什么都看不到。当时我还很菜,思路是 tc-dump / xdp-dump,但是现在来看可以直接在 __netif_rx / netif_rx_internal 观测。而思路一旦从 tcpdump 的 “从设备上观测流量” 解放出来,我想要的 tcpdump 就呼之欲出了:在内核任何地址观测。 2. “所以在此表扬一下勇敢尝试第一问 exp 的同学,你们运气很好地发现了这个非预期解。” 没错,勇气+运气,还有想象力和好奇心,我不止一次地赞美这几个在我心中最重要的工程师品质。可惜加班会摧毁这一切,所以我如此仇恨加班,心想若非绝路,绝不向那些血汗巨兽低头。 3. 用 DRY 的思路切分函数真的好糟糕,很容易导致语义过度扩张、参数数量庞大、无数 if 嵌套。但是如果已经是屎山,打补丁而不是搬山的好处之一是,如果同时维护多版本,补丁可简单 backport。而 bpf c 的抽象能力也众所周知得烂,这时我目光看向了 bpf rust,这大概是我第一次觉得 rust 可能大显身手( 4. 在缺少实现细节的时候,调查一件怪事为什么发生比调查一件期望中的事为什么没发生要简单太多了。举个例子,如果陌生人用 nft add table 去做 DNAT,那么 iptables-nft-save 是看不到的,这时候流量莫名其妙发生了地址转换,我根本不知道有人动过 nft,怎么查?我可以列出所有以 skb 为参数的内核函数符号,在入口和出口 attach kprobe bpf 检查 dest ip,如果有变化则说明“就是这个函数干的”。但是如果是我自己加了一条 nft DNAT 规则却没有生效,场面会恶心许多。