因此,我们正在课堂上使用iptable,我一直在测试NAT表中的一些规则。据我所知,SNAT更改了规则规定的数据包的IP源,但我测试的内容似乎并不是每次都有效。
我添加了以下规则:iptables -t nat -A POSTROUTING -j SNAT --to 1.2.3.4
当我在网络中平其他机器时,他们从1.2.3.4接收一个包,这是正确的,因为我添加了上面的规则。但是,当这些机器ping (知道防火墙机器IP不是1.2.3.4)它的真正IP时,它不会转换为新IP,它们响应于它的实际IP,而不是1.2.3.4。
我检查了iptables图流,以防规则没有被执行,但我看到的似乎没有问题。我在想,也许这可能是因为它是一个传入的数据包或类似的东西,但是不应该对每个数据包执行POSTROUTING,而不仅仅是对那些机器输出执行吗?
我怎么能认为是1.2.3.4回答的机器呢?通过翻译资料可以吗?
发布于 2021-01-27 13:22:15
nat表中的任何规则都对连接中的每个第一个数据包执行。
当新数据包到达时,系统搜索连接跟踪表是否属于已知连接。如果是这种情况,则分配给该连接,并应用表中为该连接记录的转换。该表存储足够的信息,以识别、转发和答复连接的数据包并对其进行翻译。一个连接是一个双向的东西,两个流。nat表不会遍历由连接跟踪器( conntrack)标识的数据包。
但是,如果找不到它,则在连接跟踪表中创建一个新记录,然后根据nat表处理数据包。如果请求转换,则将分组翻译并将信息记录到连接跟踪表中,以便后续转发和应答分组以相同的方式进行翻译。
如果发生超时,或者如果TCP连接为FINalized或RESet,则删除连接。对于无连接协议,什么被认为是“连接”是特定于每一种情况的。例如,对于UDP地址,考虑端口和超时。
您可以通过伪文件/proc/net/nf_conntrack查看该表的当前内容。注意,您可以看到什么被准确地翻译成了什么。此外,您还可以使用助手实用程序(如conntrack-tools或iptstate )。
请考虑一下这张图。
你所有的数据包都被翻译了。它们被翻译了,因为规则指示这样做。输出数据包如您所料被翻译,它们的源地址被更改为1.2.3.4,然后被发送到原来的目的地。
传入的数据包将其源地址转换为1.2.3.4,然后将它们路由到原始目的地。您已经在路由之前设置了源转换(SNAT链中的PREROUTING规则),还记得吗?该规则适用于所有数据包。
我相信,这种情况下的目的地是本地主机。翻译后,系统会看到从1.2.3.4传入到自己地址的数据包。
如果在那里安装HTTP服务器并读取其访问日志,您会发现所有请求都是从1.2.3.4发出的。这是因为在源地址被翻译后,它只会看到数据包。真正的来源被源nat所隐藏。
然后,如果它麻烦回答,它会形成一个包从自己的地址到1.2.3.4。连接跟踪器(请参阅图表中的“输出路径”)将其标识为对已知连接的答复,并根据它找到的表条目将其转换回表(但是,注意,它现在将目标地址从1.2.3.4更改为它在表中找到的地址,因为它是一个回复)。然后将回复数据包重新路由并发送给原始发件人。
不能翻译回复数据包的源地址--没有指示这样做。
为了避免这种混乱的效果,您总是向SNAT规则添加一个传出接口匹配。例如,iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 1.2.3.4。
如果您翻译传入的数据包,例如,您可以使来自远程主机的数据包显示它们是从LAN发送的,但是这种规则将具有相当紧密的匹配性,至少是要显示本地的源IP和局域网中用作别名的地址。该地址可能与您在一般SNAT规则中使用的地址不同。
https://serverfault.com/questions/1051396
复制相似问题