我有一个BPF代码(部分“classifier”)。我使用这个来使用tc(traffic controller)实用程序加载到一个接口。我的代码更改__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

最佳答案

问题出在tc命令中。你在出口侧安装过滤器。
父节点指的是出口侧,用于流量整形。如果要将过滤器连接到入口侧,则应使用类似的方法(不需要句柄):

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

或者,更好的做法是,使用特定于BPF的qdiscroot,该qdisc可以用于连接进出口的过滤器(除了它的commit logCilium's BPF documentation(搜索clsact):
# tc qdisc add dev <myInterface> clsact
# tc filter add dev <myInterface> ingress bpf obj bpf.o direct-action

10-08 04:10