使用 iptables 设置简单的 NAT——两种解决方案哪一种是正确的?

使用 iptables 设置简单的 NAT——两种解决方案哪一种是正确的?

我必须设置 iptables 规则,将所有传出数据包的源地址更改为路由器的公共 IP 地址,并将所有传入数据包(目标端口为 80)重定向到 Web 服务器所在的其中一台机器。这是大学布置的作业,我已经有了答案,但它们有些不一致。一组答案来自该任务的出处(所以它应该是正确的),另一组答案来自老师。所以,书上说应该这样做(eth0 是具有公共 IP 的公共接口,eth1 是连接到本地网络的接口 -一张图片以便更好地参考):

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source IPX
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-
destination IP1:80

我的老师认为这些是正确答案:

iptables -t nat -A POSTROUTING -i eth1 -j SNAT --to-source IPX
iptables -t nat -A PREROUTING -p -o eth1 tcp --dport 80 -j DNAT --to-\ 
destination IP1:80

如您所见,不同之处在于所选的接口。据我所知,选项-i-o用于区分单个接口上的传出和传入“子接口”。

因此,我书中答案中的第一条规则规定,所有通过接口 eth0 发送的数据包都应将其源 IP 更改为路由器的公共 IP。我的老师说,所有到达路由器本地接口的数据包都应将其源地址更改为路由器的公共 IP。

在第二条规则中,书上说所有从 eth0 输入“子接口”进入并发往端口 80 的数据包都应更改其目标地址,而我的老师说所有从 eth1 发出的数据包都应更改其地址。

哪一组答案是正确的?在我看来,它们都正确,只是从不同的角度解决问题,但经过一番研究,我发现互联网上的大多数指南都遵循书本的方法,我的老师可能会犯错,所以我真的不知道哪一个才是真正正确的。如果能尽快回复我将不胜感激,因为我两天后要参加这门科目的考试。

答案1

因此,我书中答案中的第一条规则规定,所有通过接口 eth0 发送的数据包都应将其源 IP 更改为路由器的公共 IP。我的老师说,所有到达路由器本地接口的数据包都应将其源地址更改为路由器的公共 IP。

对于简单的双接口路由器来说,这两种说法都没有错。

但如果路由器有一些“内部”接口(比如 eth1、eth2、eth3),书上的解决办法更正确。老师的解决办法会不必要地对所有内部的流量,即从一个内部子网到另一个内部子网的数据包。

在第二条规则中,书上说所有从 eth0 输入“子接口”进入并发往端口 80 的数据包都应更改其目标地址,而我的老师说所有从 eth1 发出的数据包都应更改其地址。

如果我没记错的话,传出接口是尚未决定在预路由阶段(因此称为“预路由”),所以你-o根本无法匹配。所以老师的规则甚至不会被 iptables 接受。但我必须测试一下……

其次,如果路由器有多个 LAN,您不会希望 DNAT(端口转发)应用于内部流量。(想象一下,eth2 上的主机试图访问 eth1 上的 HTTP 服务器——您不会希望路由器意外将其转移到其他地方……)因此,如果没有-i检查,应该有至少进行-d目标地址检查以避免这种情况。

相关内容