skb_dst_set - struct dst_entry dst 路由子系统使用。

现在有一个需求,使用netfilter框架,在NF_IP_FORWARD点做钩子。
把钩到的包从指定的物理接口发出去,这个怎么实现?哪个大侠能举个例子,谢谢

1、偿试修改skb_buff->dev,死机
2、偿试修改skb_buff->mac_header,死机

在NF_IP_FORWARD点,已经决定了路由,也就说决定了从哪个物理网口出了。要想实现从指定的物理接口出来,需要重新修改路由。
类似的代码:

skb_dst_drop(skb);
skb_dst_set(skb, &newroute->dst);
NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL, skb_dst(skb)->dev, dst_output);

return NF_STOLEN

不论输入报文处理还是输出报文处理,如果命中,则累积该路由缓存条目的引用计数及全局命中统计,并且把路由缓存条目的核心内容赋给报文skb的_skb_dst字段(skb_dst_set函数),这个核心内容是rtable下的dst_entry,rtable包含了应该匹配的项如源目IP、tos、入接口、策略mark等等匹配信息,dst_entry则包含了对应的出接口、邻居节点(确定邻居是为了确定MAC地址)、下一步的处理函数(如对于输入报文,发给本机为ip_local_deliver,转发为ip_forward)、跃点等结果信息,另外一些重要结果如下一跳IP、路由类型等在rtable中存储

发布了707 篇原创文章 · 获赞 48 · 访问量 97万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章