【发布时间】:2018-05-15 10:16:45
【问题描述】:
我从samples/bpf/pare_simple.c(来自 Linux 内核树)编译了 BPF 示例,并进行了非常简单的更改:
SEC("simple")
int handle_ingress(struct __sk_buff *skb)
{
return TC_ACT_SHOT;
}
所以我希望丢弃任何数据包。我安装如下:
这发生在 Ubuntu 16.04.3 LTS 上,内核 4.4.0-98、llvm 和从软件包安装的 3.8 版本的 clang,iproute2 是来自 github 的最新版本。
$ tc qdisc add dev eth0 clsact
$ tc filter add dev eth0 ingress bpf \
object-file ./net-next.git/samples/bpf/parse_simple.o \
section simple verbose
Prog section 'simple' loaded (5)!
- Type: 3
- Instructions: 2 (0 over limit)
- License: GPL
Verifier analysis:
0: (b7) r0 = 2
1: (95) exit
processed 2 insns, stack depth 0
所以它似乎安装成功,但是这个过滤器/ebpf 不会丢弃数据包,我在eth0 接口上生成入口流量,例如ICMP,它通过了。我做错了什么?
【问题讨论】:
-
您可以尝试在命令行上使用
direct-actiontc 标志(我相信在verbose之前)(see here) -
@Qeole,确实有帮助,谢谢!这个标志表示什么?
-
好问题,我一直愿意写一篇博文来回答这个问题,但一直没有时间 :) 以下是正确答案中的一些解释
标签: linux-kernel bpf ebpf