我想将来自多个广域网接口(ppp0,ppp1,ppp2)的所有stream量(特别是TCP和UDP)redirect到来自eth0的单个IP。
当涉及到IP接口时,我可以使用PREROUTING和POSTROUTING,并相应地更改目标和源IP。
但在这种情况下(有多个接口),我怎样才能知道在POSTROUTING中使用哪个IP作为源IP?
所以ppp0-ppp3的IP地址正在改变,而eth0仍然是“192.168.1.5”。
我想转发stream量到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”。
问题底部的链接针对具有多个退出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规则,因为destination(192.168.1.10)会自动知道在哪里返回数据包。
但是,如果这个解决scheme由于任何原因(或者你个人不喜欢它)而不可行,那么接下来我想build议在eth0上使用MASQUERADE:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
DNAT解决scheme也可能工作。 只要确保您的FORWARD链被设置为ACCEPT,而不是在通过主机的路上过滤包。