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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章