Linux TCP 堆栈处理发生在 netfilter 之前还是之后?

Linux TCP 堆栈处理发生在 netfilter 之前还是之后?

Linux netfilter 在不同的 OSI 模型层有多个钩子,根据图像。然而,像 TCP 这样的传输层协议需要额外的处理,如重传或拥塞控制。这种情况是发生在 netfilter 框架或特定钩子之前还是之后?以及为什么要这样设计。赞赏源代码的解释。

答案1

即使不仔细阅读源代码,测试也相当容易。

在一台运行防火墙规则集的计算机上,仅允许来自某个特定 IP 的某些端口,为有问题的端口建立 tcpdump,并尝试从一台计算机连接到该 IP:端口不是允许的。

您将看到传入的请求。

答案2

好吧,我发现了这个视频Devconf 2018 与 Jiri Benc 谈论 Linux 网络管道。 TCP是传输层协议;对于使用它的数据包,网络堆栈必须首先解析数据链路和网络层标头。然后,dst_input确定该数据包是用于本地处理还是转发。在幻灯片62中,他提到如果数据包要本地处理,TCP状态机将在INPUTnetfilter的钩子之后处理它。具体实现可以参见tcp_v4_rcv中的函数linux/net/ipv4/tcp_ipv4.c

相关内容