我只是在学习XDP。在旅途中,我遇到了一个我无法理解的案例。当我注意到没有任何变化时,我正在对某些 UDP 数据包尝试一些花哨的东西。所以我试图用一个最小的例子来重现这个问题。这是最小的示例:
#include <linux/bpf.h>
#include <linux/in.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/udp.h>
#define SEC(NAME) __attribute__((section(NAME), used))
SEC("obfuscator_main")
int dropper(struct xdp_md *ctx) {
return XDP_DROP;
}
char _license[] SEC("license") = "GPL";
(不要介意“混淆器”名称,它是其余代码的剩余部分)。
我编译并加载这个:
clang -Wall -O2 -target bpf -c obfuscate.c -o obfuscate.o
sudo ip link set dev enp3s0 xdp obj obfuscate.o sec obfuscator_main
我确认传入我的计算机的流量已完全丢弃。但是,数据包仍然可以出去。我 ping 了一个运行 tcpdump 的远程服务器,它看到了 ICMP 请求。但是我在本地计算机上没有得到任何响应。
为什么它不能对传出的数据包做任何事情?