我在尝试理解以下情况下的 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.73
10.0.0.32
10.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
看到它。