基于eBPF验证iptables mark设置在skb mark字段上

结论

iptables设置的mark加在了skb的mark字段上,不是报文里面。
skb是报文载体,skb的data指针指向报文起始地址,data_end指针指向报文终止地址。

验证

# 只针对icmp发包设置mark 12345
iptables -t mangle -A OUTPUT -p icmp --icmp-type echo-request -j MARK --set-mark 12345

主机网口ping自己网关5次,iptables流向是OUTPUT->POSTROUTING。

iptables规则计数是5。

加载在主机网口egress上eBPF打印skb报文5次,skb上mark值都是12345。

SEC("tc")
int print_skb_mark(struct __sk_buff *skb)
{
    struct skb_info s = {0};
    if (parse_underlay_pkg(skb, &s))
    {
        switch (s.protocol)
        {
            case IPPROTO_ICMP:
                bpf_printk("skb mark is %u", skb->mark);
                return TC_ACT_OK;
            default:
                return TC_ACT_OK;
        }
    }
    return TC_ACT_OK;
}

 

posted on 2024-11-24 11:49  王景迁  阅读(8)  评论(0编辑  收藏  举报

导航