我正在尝试了解该系统的工作原理,但无法理解使用 NAT PREROUTING 或过滤器 FORWARD 之间的区别。据我所知,PREROUTE 可以将数据包发送到另一台服务器,从而避开过滤器。如果 NAT 可以通过 PREROUTE 处理此问题,那么在过滤器中设置 FORWARD 规则的目的是什么?
答案1
此表仅应用于不同数据包上的 NAT(网络地址转换)。换句话说,它仅应用于转换数据包的源字段或目标字段。
过滤表:
过滤表主要用于过滤数据包。我们可以匹配数据包并以我们想要的任何方式过滤它们。这是我们实际对数据包采取行动的地方,查看它们包含的内容,并根据其内容丢弃或接受它们。当然,我们也可以进行预先过滤;然而,这个特定的表是设计过滤的地方。
在遍历表格和链条我们可以看到,过滤器的 FORWARD 链仅由转发的数据包(来自网络并发往网络的数据包)遍历,即,您的计算机就像一个路由器,而 nat 的 PREROUTING 链则由转发的数据包和目的地为本地主机的数据包遍历。
您应该仅使用 nat 的 PREROUTING 来更改数据包的目标地址,并仅使用过滤器的 FORWARD 进行过滤(丢弃/接受数据包)。
如果我们将数据包送入第一个路由决策,而该数据包并非发往本地计算机本身,则它将通过 FORWARD 链进行路由。另一方面,如果数据包的目的地是本地计算机正在侦听的 IP 地址,我们将通过 INPUT 链将数据包发送到本地计算机。 数据包的目的地可能是本地计算机,但目标地址可能会在 PREROUTING 链中通过执行 NAT 进行更改。由于这发生在第一个路由决策之前,因此将在此更改之后查看数据包。因此,在路由决策完成之前可能会更改路由。请注意,所有数据包都将通过此图中的一条或另一条路径。如果您将数据包通过 DNAT 发送回其来自的同一网络,它仍将通过其余链,直到它返回到网络上。
答案2
预路由:此链用于在之前做出任何与路由相关的决定(PRE) 发送任何数据包。请始终记住,在PREROUTING/POSTROUTING
ieNAT
表中ACCEPT/DROP/REJECT
,默认FILTER
表的 etc 目标将不起作用。该NAT
表仅用于做出路由决策。PREROUTING
在做出任何路由决策时,您都应该使用 ie,这些决策需要在数据包开始穿越网络之前做出。以下是一个例子,我们将刚刚到达端口 80 上的服务器的任何流量重定向到端口 8080:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
向前: 顾名思义,链表FORWARD
用于FILTER
将数据包从源转发到目的地,这里的源和目的地是两个不同的主机。因此,您可以想象FORWARD
规则基本上用在服务器上,其中一个主机通过服务器发送/接收来自另一个主机的流量。当数据包从服务器生成时,链即OUTPUT
流量从其自身发出,而INPUT
链意味着数据包仅用于服务器本身。以下是链的示例,其中在用于主机的接口的端口 80 上接收的FORWARD
任何TCP
流量都将被接受并转发到:eth0
192.168.0.4
192.168.0.4
iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 192.168.0.4 -j ACCEPT