刚才看了些关于内核数据包转发的文章,结果不同的人写的都不一样啊,我都不知道该信谁了。我想问下关于 netfilter 框架里的5个 hook
PREROUTING
FORWARD
INPUT
OUTPUT
POSTROUTING
我现在知道在 PREROUTING 之后,
如果dstIP是本机,就走 INPUT ;
如果不是本机则走 FORWARD 。
而我现在想知道路由是发生在那里呢?
对于dstIP不是本机的数据包,路由发生在 FORWARD 之前还是之后?
对于dstIP是本机的数据包,路由发生在 OUTPUT 之前还是之后?
有谁知道哪里能查到比较权威的资料么?
先谢谢了!!!
权威资料,好像我自己都没有留意,不过随便能够找到图:
https://wiki.archlinux.org/index.php/iptables
http://4.bp.blogspot.com/_N3xuQCvc1v4/TQlz5a1YXSI/AAAAAAAAASc/f0aNn5Z1q3I/s1600/Diagrama_linux_netfilter_iptables.gif
按那个图就是两次路由选路了OUTPUT前后各一次?
没看太明白
http://images.cnitblog.com/blog/580388/201401/221111388518.png
对于dstIP不是本机的数据包,路由当然发生在 FORWARD 之前啦,不然怎么知道是FORWARD
对于dstIP是本机的数据包,怎么会是 OUTPUT 呢?INPUT的话,当然也是在路由后,不然怎么知道?
http://upload.wikimedia.org/wikipedia/commons/thumb/3/37/Netfilter-packet-flow.svg/2000px-Netfilter-packet-flow.svg.png
接5L的回答
对于destIP是本机的数据包,也是在route后才知道是本机的啊,但是再出本机的时候还要路由一次,这样才能确定把包给谁,所以发生在OUTPUT之前。
output是本机产生的数据包,output链在路由之前。参见2楼的图。所有的用户程序都是local process
我回复中的“但是再出本机的时候还要路由一次”的“路由”,应该是对应2L图中OUTPUT部分的那个“Check for Nat Reroute”,看起来是在filter OUTPUT之前啊?!
还有一点,关于这个从本机出时的route的位置,有的资料中将route时机放到了raw、mangle、nat的OUTPUT链前面,当然也都在filter OUTPUT之前。比如6L的那个图。