基于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;
}