我有一个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
问题出在您的tc
命令中。您将过滤器连接到出口端。
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