考虑一下一台 Unix 机器,或者实际上任何能够进行 IP 路由的机器,是如何处理 IP 数据报的。基本步骤如图 9-2 所示:
接收 IP 数据报。(1)
检查传入的 IP 数据报,以确定它是否发往本机上的进程。
如果数据报是发往本机的,则在本地处理。(2)
如果数据报不是发往本机的,则在路由表中搜索合适的路由,并将数据报转发到相应的接口;如果找不到路由,则丢弃。(3)
来自本地进程的数据报被发送到路由软件,以便转发到相应的接口。(4)
检查传出的 IP 数据报,以确定是否有有效的路由可供使用;如果没有,则丢弃。
传输 IP 数据报。(5)
在我们的图中,流程 1→3→5 表示我们的机器在以太网上的主机与通过 PPP 链路可访问的主机之间路由数据。流程 1→2 和 4→5 表示本地主机上运行的网络程序的数据输入和输出流程。流程 4→3→2 表示通过环回连接的数据流。自然地,数据既流入又流出网络设备。图中的问号表示 IP 层做出路由决策的点。
Linux 内核 IP 防火墙能够在流程的各个阶段应用过滤。也就是说,您可以过滤进入您机器的 IP 数据报,过滤正在您的机器上转发的那些数据报,以及过滤准备传输的那些数据报。
在 ipfwadm 和 ipchains 中,输入规则应用于图中的流程 1,转发规则应用于流程 3,输出规则应用于流程 5。稍后当我们讨论 netfilter 时,我们将看到拦截点已更改,因此输入规则应用于流程 2,输出规则应用于流程 4。这对您如何构建规则集具有重要意义,但一般原则适用于所有版本的 Linux 防火墙。
这乍一看可能显得不必要地复杂,但它提供了灵活性,从而可以构建一些非常复杂和强大的配置。