NAT 正向链规则的内部工作原理

NAT 正向链规则的内部工作原理

我试图了解 NAT 究竟如何工作以解决另一个更大的问题,这是我的 Linux 机器设置:

接口 eth0 连接到互联网(公共 IP 地址)

eth1 连接到本地网络并作为所有内部节点的网关(IP 为 192.168.1.1)以提供互联网访问。

使用以下 iptable 规则:

1)$iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
2)$iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
3)$iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

现在我想了解规则 1、2 和 3 到底起什么作用?

现在来看这个例子:

PC1 的 IP 地址为 192.168.1.5,MAC 地址为 MAC1,需要访问网址 www.google.com,它构造的数据包如下

假设网关的 mac 地址是 MAC2

source MAC | destination MAC | source ip | destination ip| payload
   MAC1           MAC2        192.168.1.5   <google ip>     <data>

现在网关(192.168.1.1)在接口 eth1 上接收此数据包,并将源 ip 更改为接口 eth0 的 ip 地址,并在收到响应时使用条目更新某些表以进行反向查找。哪些规则负责此操作规则 1/规则 2?

当 eth0 收到响应时,它会通过查找表条目来改变目标 ip,并在 eth1 上丢弃数据包。rule3 在这里到底起什么作用?

假设网关上的应用程序需要访问互联网并创建数据包并通过 eth0 发送,当收到响应时,数据包如何路由到网关上的应用程序,而不是根据规则 1 通过接口 eth1 传输数据包?

更新

发送数据包时,规则 3 会改变源 IP,这称为源 NAT,类似地,当在 eth0 上收到回复数据包时,目标地址会发生变化,这难道不是目标 NAT 吗?为什么没有这样的规则?

假设有另一个接口 eth2 也通过公共 IP 连接到互联网,并且路由表中存在默认路由以通过此设备路由流量:

$ip route add default via <IP> dev eth2 scope link

iptables 过滤表的正向链规则规定通过 eth0 退出数据包,但路由表有通过 eth2 的默认路由,在这种情况下哪个接口用于互联网?

是否可以将从 eth1(本地 n/w)转发到 eth0 的流量以及通过接口 eth2 源自网关的应用程序数据流量路由?

谢谢!

答案1

我将重新安排并重新引用你的规则:

$iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

此规则允许防火墙转发(即充当路由器)进入的所有数据包eth1(本地)和路由通过退出eth0(互联网)

$iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

此规则执行源 NAT:它取代源地址从 192.168.1.xxx 到你的公网 IP 地址的出站数据包数量,而同时在路由器conntrack(连接跟踪)表中记录 NAT 的详细信息。

由于记录了 NAT 的详细信息,因此将对照该表检查来自 Internet 的回复数据包。如果回复与 conntrack 条目匹配,则数据包将经历“逆 NAT”(我的术语),即替换目标地址(请记住,这是一个回复!)带有原始发件人的地址(192.168.1.xxx)

$iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

此规则允许以下数据包:回复将传出的数据包(例如,上面经过 SNAT 的数据包)路由到本地网络。

现在网关(192.168.1.1)在接口 eth1 上接收此数据包,并将源 ip 更改为接口 eth0 的 ip 地址,并在收到响应时使用条目更新某些表以进行反向查找。哪些规则负责此操作规则 1/规则 2?

这是规则 2 和规则 3 的组合(在您的原始帖子中)

假设网关上的应用程序需要访问互联网并创建数据包并通过 eth0 发送,当收到响应时,数据包如何路由到网关上的应用程序,而不是根据规则 1 通过接口 eth1 传输数据包?

如果网关本身发送一个传出数据包,该数据包将不是匹配任何 conntrack 表条目,因此将不是进行‘逆 NAT’。

发送数据包时,规则 3 会改变源 IP,这称为源 NAT,类似地,当在 eth0 上收到回复数据包时,目标地址会发生变化,这难道不是目标 NAT 吗?为什么没有这样的规则?

技术上,这是一个 DNAT。但是网络过滤器(即作为 iptables 的“引擎”的数据包过滤/处理框架)足够智能。每当收到传入数据包时,都会将其与 netfilter 的 conntrack 表进行匹配。如果数据包是对现有传出连接的回复(设置了 ACK 标志、匹配 IP:port、匹配 TCP 序列号等),netfilter自动地执行 DNAT。无需额外的规则。

假设有另一个接口 eth2 也通过公共 IP 连接到互联网,并且路由表中存在默认路由以通过此设备路由流量:

$ip route add default via <IP> dev eth2 scope link

iptables 过滤表的正向链规则规定通过 eth0 退出数据包,但路由表有通过 eth2 的默认路由,在这种情况下哪个接口用于互联网?

iptables不要执行路由;它针对数据包起作用它们由 iproute2(即 Linux 的路由框架)路由。这就是规则链被称为“POSTROUTING”的原因。

如果情况正如您所解释的那样,iproute2 将使 Linux 内核通过 eth2 发送数据包。在这种情况下,原始规则-t nat -A POSTROUTING -o eth0 -j MASQUERADE将不再匹配,并且 MASQUERADE/SNAT 将不再执行。

是否可以将从 eth1(本地 n/w)转发到 eth0 的流量以及通过接口 eth2 源自网关的应用程序数据流量路由?

是的,但你需要iproute2

首先,您必须创建 2 个新的路由表。我们将它们称为 100 和 102:

ip route add default via $DG_eth0 dev eth1 table 100
ip route add default via $DG_eth2 dev eth2 table 102

接下来,创建路由策略:

# Rule #10: All packets must refer to the 'main' table
ip rule add order 10 from all  lookup main
# Rule #20: Packets entering eth1 must refer to the '100' table
ip rule add order 20 iif  eth1 lookup 100
# Rule #30: Packets from this gateway must refer to the '102' table
ip rule add order 30 iif  lo   lookup 102

最后,删除主表中的默认路由:

ip route delete default table main

main表很重要,因为它包含网关周围所有子网的列表;这就是为什么仍然必须在规则#10中引用它。

希望我说得够清楚了。如果还有关于 iptables 的问题,欢迎随时向我提问。

相关内容