将多个接口的所有流量重定向到单个 IP

将多个接口的所有流量重定向到单个 IP

我想将所有流量(特别是 TCP 和 UDP)从多个 WAN 接口(ppp0、ppp1、ppp2)重定向到 eth0 上的单个 IP。
当涉及到接口到 IP 时,我可以使用 PREROUTING 和 POSTROUTING 并相应地更改目标和源 IP。
但在这种情况下(有多个接口),我如何知道在 POSTROUTING 中将哪个 IP 用作源 IP?

因此 ppp0-ppp3 的 IP 正在变化,而 eth0 仍为“192.168.1.5”。
我想将流量转发到 IP:“192.168.1.10”。

例如(仅适用于 TCP),我将使用以下命令将传入连接定向到 eth0:

iptables -t nat -A PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 192.168.1.10:5000
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.10 --dport 5000 -j SNAT --to-source 192.168.1.5`

但是对于多个接口(IP),我不知道如何将 POSTROUTING 规则设置为源保持不变?
所以问题是 - 我应该使用 iptables 技术来“保存”该 IP,然后将其用作源,还是有其他方法可以做到这一点?
我找到了一个看起来像我需要的链接,但我不知道如何实现它:http://www.tldp.org/HOWTO/IP-Masquerade-HOWTO/multiple-ips.html

底线是,我需要从多个接口到单个 IP 的“DMZ”。

答案1

问题底部的链接针对的是拥有多个出口 IP 的人。由于您尝试通过 eth0 (192.168.1.5) 推送包 - 您没有 IP 别名,也没有多个出口 IP,只有一个 IP。

因此,假设 ppp0 的 IP 范围为:10.100.100.0/24,则连接到主机的初始数据包将如下所示:

 | SRC IP        | DST IP       |
 | 10.100.100.10 | 10.100.100.1 |

你的第一条规则是正确的:

-t nat -A PREROUTING -p tcp --dport 5000 -j DNAT --to-destination 192.168.1.10:5000

因此,每当 ppp0-ppp3 后面的机器尝试通过端口 5000 连接您的主机 (192.168.1.5) 时,数据包将被重新路由到 192.168.1.10。数据包将如下所示:

 | SRC IP        | DST IP       |
 | 10.100.100.10 | 192.168.1.10 |

现在,您正在通过主机路由数据包,因此您必须启用 IP 转发:

sysctl -w net.ipv4.ip_forward=1

但是,当目标 (192.168.1.10) 收到数据包时,它将看到源 10.100.100.10,并将数据包返回到其自己的默认网关。您可以在 192.168.1.10 上设置静态路由,告诉该主机来自 10.100.100.0/24 的数据包将通过 192.168.1.5 路由,例如:

ip route add 10.100.100.0/24 via 192.168.1.5

这样,您就不需要添加任何 POSTROUTING 规则,因为目的地(192.168.1.10)会自动知道将数据包返回到哪里。

但是,如果该解决方案由于某种原因不可行(或者您个人不喜欢它),那么我接下来建议在 eth0 上使用 MASQUERADE:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

DNAT 解决方案可能也有效。只需确保您的 FORWARD 链设置为 ACCEPT,并且不过滤通过主机的数据包即可。

相关内容