首页 > 解决方案 > BPF:结构__skbuff中的标记不可写?

问题描述

我有一个 BPF 代码(“ classifier”部分)。我使用它来使用 tc(流量控制器)实用程序加载到接口。我的代码更改了__skbuff. 后来当我尝试使用 iptables 捕捉这个标记时,我发现我编辑的标记已经消失了。

代码:

__section("classifier")
int function(struct __sk_buff *skb)
{
    skb->mark = 0x123;

我使用 iptable mangle 表的以下规则来查看标记是否正确写入。

# iptables -t mangle -A PREROUTING -i <my_interface> \
    -m mark --mark 0x123 \
    -j LOG --log-prefix "MY_PRINTS" --log-level 7

以下是我用来加载 bpf 程序的 TC 命令;

# tc qdisc add dev <myInterface> root handle 1: prio
# tc filter add dev <myInterface> parent 1: bpf obj bpf.o flowid 1:1 direct-action

标签: clinux-kernelnetwork-programmingiptablesebpf

解决方案


问题在于您的tc命令。您将过滤器连接到出口侧。

parent是root指出口侧,用于流量整形。相反,如果您想在入口端附加过滤器,则应该使用类似这样的东西(不需要句柄):

# tc qdisc add dev <myInterface> ingress
# tc filter add dev <myInterface> ingress bpf obj bpf.o direct-action

或者,更好的做法是使用 BPF 特定的 qdisc clsact,它可用于为入口和出口附加过滤器(关于它的文档不多,除了它的提交日志Cilium 的 BPF 文档(搜索clsact)):

# tc qdisc add dev <myInterface> clsact
# tc filter add dev <myInterface> ingress bpf obj bpf.o direct-action

推荐阅读