iptables 中的 PREROUTING 和 FORWARD 有什么区别?

Ghe*_*Ghe 23 iptables networking nat

我试图了解这个系统是如何工作的,但我在理解使用 NAT PREROUTING 或过滤器 FORWARD 之间的区别时遇到了问题。据我了解,PREROUTE 可以将数据包发送到另一台服务器,从而避开过滤器。如果 NAT 可以通过 PREROUTE 处理这个问题,那么在过滤器中设置 FORWARD 规则的目的是什么?

Eri*_*lho 31

NAT表

此表仅应用于不同数据包的 NAT(网络地址转换)。换句话说,它应该只用于转换数据包的源字段或目标字段。

过滤表

过滤表主要用于过滤数据包。我们可以匹配数据包并以我们想要的任何方式过滤它们。这是我们实际对数据包采取行动并查看它们包含的内容并根据它们的内容 DROP 或 /ACCEPT 的地方。当然我们也可以做先验过滤;然而,这个特殊的表是设计过滤的地方。

遍历表和链中,我们可以看到过滤器的 FORWARD 链仅被转发的数据包(来自网络并传到网络的数据包)遍历,即您的计算机就像一个路由器,而 nat 的 PREROUTING 链被转发的两个遍历数据包和目的地是本地主机的数据包。

您应该仅使用 nat 的 PREROUTING 来更改数据包的目标地址,而使用 filter 的 FORWARD 仅用于过滤(丢弃/接受数据包)。

如果我们让一个数据包进入第一个路由决策,但它的目的地不是本地机器本身,它将通过 FORWARD 链进行路由。另一方面,如果数据包的目的地是本地机器正在侦听的 IP 地址,我们将通过 INPUT 链将数据包发送到本地机器。 在此处输入图片说明 数据包的目的地可能是本地机器,但目的地地址可能会通过执行 NAT 在 PREROUTING 链中更改。由于这发生在第一次路由决定之前,因此将在此更改后查看数据包。因此,在完成路由决定之前,可能会更改路由。请注意,所有数据包都将通过此图像中的一条或另一条路径。如果您将数据包 DNAT 返回到它来自的同一网络,它仍将通过其余的链,直到它返回网络。


hee*_*ayl 8

PREROUTING:此链用于在 ( PRE ) 发送任何数据包之前做出任何与路由相关的决定。永远记住,在PREROUTING/POSTROUTINGieNATACCEPT/DROP/REJECT中,默认FILTER表的etc 目标将不起作用。该NAT表仅用于进行路由决策。您应该PREROUTING在进行任何路由决策时使用,即在数据包开始穿越网络之前需要做出的决策。下面是一个例子,我们将任何刚刚到达服务器的 80 端口的流量重定向到 8080 端口:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
Run Code Online (Sandbox Code Playgroud)

FORWARD:顾名思义,FORWARD表链FILTER用于将数据包从源转发到目的地,这里的源和目的地是两个不同的主机。因此,正如您可以想象的那样,FORWARD规则基本上用于一台主机通过服务器从另一台主机发送/接收流量的服务器上。当数据包从服务器生成时,链是OUTPUT指流量从自身出去,而INPUT链意味着数据包仅用于服务器本身。这是一个FORWARD链的示例,其中TCP在接口上eth0用于主机的端口 80 上接收的任何流量192.168.0.4都将被接受并转发到192.168.0.4

iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 192.168.0.4 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)