问题:有关 Linux 内核中网络层数据包转发流程的疑问

2015-02-04 17:03:50 +08:00
 qq446015875

刚才看了些关于内核数据包转发的文章,结果不同的人写的都不一样啊,我都不知道该信谁了。我想问下关于 netfilter 框架里的5个 hook

PREROUTING
FORWARD
INPUT
OUTPUT
POSTROUTING

我现在知道在 PREROUTING 之后,
如果dstIP是本机,就走 INPUT ;
如果不是本机则走 FORWARD 。

而我现在想知道路由是发生在那里呢?
对于dstIP不是本机的数据包,路由发生在 FORWARD 之前还是之后?
对于dstIP是本机的数据包,路由发生在 OUTPUT 之前还是之后?

有谁知道哪里能查到比较权威的资料么?
先谢谢了!!!

3268 次点击
所在节点    Linux
9 条回复
scys
2015-02-04 17:41:10 +08:00
权威资料,好像我自己都没有留意,不过随便能够找到图:

https://wiki.archlinux.org/index.php/iptables
Draplater
2015-02-04 19:33:34 +08:00
qq446015875
2015-02-04 20:30:19 +08:00
@scys
按那个图就是两次路由选路了OUTPUT前后各一次?
@Draplater
没看太明白
qq446015875
2015-02-04 20:41:35 +08:00
ryd994
2015-02-04 22:11:11 +08:00
对于dstIP不是本机的数据包,路由当然发生在 FORWARD 之前啦,不然怎么知道是FORWARD
对于dstIP是本机的数据包,怎么会是 OUTPUT 呢?INPUT的话,当然也是在路由后,不然怎么知道?
efi
2015-02-04 22:13:40 +08:00
onemoo
2015-02-04 22:49:28 +08:00
接5L的回答
对于destIP是本机的数据包,也是在route后才知道是本机的啊,但是再出本机的时候还要路由一次,这样才能确定把包给谁,所以发生在OUTPUT之前。
ryd994
2015-02-05 06:39:30 +08:00
@onemoo
output是本机产生的数据包,output链在路由之前。参见2楼的图。所有的用户程序都是local process
onemoo
2015-02-05 09:42:02 +08:00
@ryd994
我回复中的“但是再出本机的时候还要路由一次”的“路由”,应该是对应2L图中OUTPUT部分的那个“Check for Nat Reroute”,看起来是在filter OUTPUT之前啊?!

还有一点,关于这个从本机出时的route的位置,有的资料中将route时机放到了raw、mangle、nat的OUTPUT链前面,当然也都在filter OUTPUT之前。比如6L的那个图。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/168252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX