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