iptables 问题:具有 ip 别名(虚拟接口)的 nat 不起作用

iptables 问题:具有 ip 别名(虚拟接口)的 nat 不起作用

我正在设置一个 Ubuntu 11.10 服务器,作为运行多个不同 SSL 网站的网络的防火墙。这个想法相当普遍:将每个站点的所有公共 IP 别名为防火墙上的公共接口,并使用 iptables/NAT 将连接转发到 Web 服务器。不过,我花了很长时间才让这个相当简单的东西发挥作用。

假设我在防火墙上有一个面向公众的接口:

eth0 25.25.25.25

我想要为该公共接口设置一个新的 IP 别名:

ifconfig eth0:0 25.25.25.26

然后我看到接口已创建,我可以从其他主机 ping 它。到目前为止一切顺利。现在我的 Web 服务器位于网络的 DMZ 端,防火墙可以访问,但公众无法访问。假设内部 Web 服务器是 172.16.2.1。因此我创建了一条 NAT 规则,如下所示:

iptables -t nat -A PREROUTING -i eth0 -d 25.25.25.26 -j DNAT --到目标 172.16.2.1

它就是不工作。如果我在公共接口上运行 tcpdump,它将看到传入流量,但 iptables 不会将其 NAT 到目的地。

如果我使用非别名 IP(例如 25.25.25.25),它将正常工作。我读到 iptables 不喜欢使用虚拟接口并忽略它们。这很好,但它仍然应该使用“eth0”而不是“eth0:0”。在我的例子中,如果我尝试使用“eth0:0”,iptables 不会抱怨,但这没有任何区别。

我已经使用 OpenBSD 很长时间了,所以我可以轻松地使用 pf 进行同样的设置。但几年前,我曾经使用 RedHat 机器进行过同样的设置,而且效果很好。有什么变化吗?一定有办法做到这一点。我从其他人那里看到过几个例子,说你只需要确保指定主设备 (eth0),而不是使用 eth0:0。但我什么也没得到。

哦,为了排除这只是一个过滤问题,我已经完全禁用了所有过滤规则:

iptables -F
iptables -X
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

有什么想法吗?谈到 iptables 时,我当然不是新手,但是这个问题开始让我感觉自己像个新手。

答案1

使用虚拟接口时只需使用选项 -d(目标),忽略选项 -i(接口)

代替:
iptables -t nat -A PREROUTING -i eth0 -d 25.25.25.26 -j DNAT --to-destination 172.16.2.1

使用:
iptables -t nat -A PREROUTING -d 25.25.25.26 -j DNAT --to-destination

在 Debian 中使用 iptables v1.4.14

答案2

最有可能的是,您需要使用前向链,并且不为其提供输入接口:

iptables -t nat -A PREROUTING -i eth0 -d 25.25.25.26 -j DNAT --to-destination 172.16.2.1

尝试以下方法:

iptables -t nat -A FORWARD -d 25.25.25.26 -j DNAT --to-destination      172.16.2.1

这对 Debian/Ubuntu 和基于 iptables 的路由器(如 MikroTik)都有效。你也可以看看这里关于端口转发,它也可能有帮助。

相关内容