c - 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
解决方案
问题在于您的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
推荐阅读
- java - 无法将 JSON 解析为 recyclerview
- node.js - 角度项目中的命令行打字稿脚本
- python-3.x - Series 的真值是模棱两可的。对分类列使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
- css - 如何在 mo.js 中为 CSS 文本阴影属性设置动画
- cassandra-3.0 - 添加重复记录时,IfNotExists 不返回错误
- autodesk-viewer - 如何复制新的浏览器结构面板?
- java - java 中 2019-05-14T17:21:04+0000 的日期和时间等价物是什么。我怎样才能得到它?
- c++ - Linux 如何处理多个进程同时尝试替换同一个文件的情况?
- angular8 - 使用(--prod 和 prod)命令的区别
- java - Dropwizard + Gradle fatJar 用于带有子项目的项目拉入 gradle-api-5.4.1.jar deps