在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中存儲