观察 DNAT 下的 ping 回复

观察 DNAT 下的 ping 回复

我在尝试理解以下情况下的 DNAT 机制时感到困惑。

我的理解:

DNAT = 目标网络地址转换:将传入数据包的目标地址转换为目标 x 的功能。

我在理解 DNAT 回复路径方面遇到困难。

例如:我有一台 IP 地址为 x1 的计算机 (A),并希望所有到达该计算机 (dest y1) 的连接/数据包都重新路由到 IP 地址为 z1 的另一台计算机 (B)。

所以我添加了一条新的 NAT 规则,如下所示:

iptables -t nat -A PREROUTING -s x1 -d y1 -j DNAT --to-destination z1.

在A机上测试:ping -I x1 y1

如果我tcpdump -i eth6 icmp在机器 A 上运行,那么我会得到来自 IP y1 而不是 z1 的回复吗?或者是根据子网掩码进行un-NAT?

当我监控时tcpdump -i eth6 host z1,没有任何传入的 ping 或数据包。有人可以澄清这种情况和我的理解吗?

另外,如果数据包是本地转换的,我们是否可以制作此 tcpdump?

答案1

用于转发请求时,您需要显式指定 ICMP 协议,如下所示:

iptables -t nat -I PREROUTING -d <ip y1> -p icmp -j DNAT --to-destination <ip z1>

但是,PREROUTING它无法在机器本身上运行 - 为了使其正常工作,机器 A 必须位于您和 ping 到的机器 B 之间。

YOU(ip x1) <---internet---> (ip y1) Machine A(ip z0) <---NATed LAN---> (ip z1)Machine B

这将像魅力一样发挥作用。

下面是当我从我的机器 ( ) ping y1 时,它在 IP 地址为 y1 ( 10.0.0.1) 和 z0 ( ) 的机器 A 上的样子。机器 B 的 IP 地址(z1):10.10.0.7310.0.0.3210.10.0.1

16:23:54.181828 IP 10.0.0.32 > 10.0.0.1: ICMP echo request, id 25492, seq 0, length 64
16:23:54.181860 IP 10.10.0.73 > 10.10.0.1: ICMP echo request, id 25492, seq 0, length 64
16:23:54.182788 IP 10.10.0.1 > 10.10.0.73: ICMP echo reply, id 25492, seq 0, length 64
16:23:54.182806 IP 10.0.0.1 > 10.0.0.32: ICMP echo reply, id 25492, seq 0, length 64

答案2

你的错误是你需要三个系统才能使其有意义:

A -----> B

应替换为

A -----> B -----> C

在这种情况下,您需要PREROUTING打开链,B因为数据包将从外部传递到系统。

但是,如果您在创建数据包的同一系统上使用,那么它们是本地生成的数据包,并且根本iptables不会通过。PREROUTING使用两个系统,您可以执行以下操作:

A -----> B

应替换为

A -----> C

C如果测试 DNAT 不需要回复,则不需要存在。)

在这种情况下你需要这样的规则:

 iptables -t nat -A OUTPUT -d y1 -j DNAT --to-destination z1

但是,如果您将目标地址更改为您自己的地址,则数据包eth6根本无法到达。你需要tcpdump -i lo -n看到它。

相关内容