BPF:结构 __skbuff 中的标记不可写?
BPF: mark in structure __skbuff is not writeable?
我有一个 BPF 代码(“classifier
”部分)。我使用它加载到使用 tc(流量控制器)实用程序的界面。我的代码更改了 __skbuff
中的标记。稍后当我尝试使用 iptables 捕捉这个标记时,我发现我编辑的标记已经消失了。
代码:
__section("classifier")
int function(struct __sk_buff *skb)
{
skb->mark = 0x123;
我用iptable mangle table的下面的规则来看标记是否写对了
# 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
命令中。您正在将过滤器连接到出口侧。
root
parent指的是出口端,用于流量整形。相反,如果你想在入口端附加过滤器,你应该使用这样的东西(不需要句柄):
# tc qdisc add dev <myInterface> ingress
# tc filter add dev <myInterface> ingress bpf obj bpf.o direct-action
或者,更好的做法是使用 BPF-specific qdisc clsact
,它可用于为入口和出口附加过滤器(关于它的文档不多,除了它的 commit log and Cilium's BPF documentation (搜索 clsact
)):
# tc qdisc add dev <myInterface> clsact
# tc filter add dev <myInterface> ingress bpf obj bpf.o direct-action
我有一个 BPF 代码(“classifier
”部分)。我使用它加载到使用 tc(流量控制器)实用程序的界面。我的代码更改了 __skbuff
中的标记。稍后当我尝试使用 iptables 捕捉这个标记时,我发现我编辑的标记已经消失了。
代码:
__section("classifier")
int function(struct __sk_buff *skb)
{
skb->mark = 0x123;
我用iptable mangle table的下面的规则来看标记是否写对了
# 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
命令中。您正在将过滤器连接到出口侧。
root
parent指的是出口端,用于流量整形。相反,如果你想在入口端附加过滤器,你应该使用这样的东西(不需要句柄):
# tc qdisc add dev <myInterface> ingress
# tc filter add dev <myInterface> ingress bpf obj bpf.o direct-action
或者,更好的做法是使用 BPF-specific qdisc clsact
,它可用于为入口和出口附加过滤器(关于它的文档不多,除了它的 commit log and Cilium's BPF documentation (搜索 clsact
)):
# tc qdisc add dev <myInterface> clsact
# tc filter add dev <myInterface> ingress bpf obj bpf.o direct-action