我想根据 IP 地址和接口更改源 IP 地址。让我们考虑以下示例:
-----------------------------
| |
| host 1 |
| |
| application |
| |
| eth0 |
-----------------------------
|
| IP0-IP47
|
-----------------------------
| eth0 |
| host 2 |
| |
| NAT |
| |
| eth1.1 eth1.2 eth1.3 |
-----------------------------
| | |
| | |
IP0-IP15 IP0-IP15 IP0-IP15
主机 2 在接口 eth1.1、eth1.2、eth1.3 上接收消息。每个接口上有 16 个主机,每个主机有 16 个唯一 IP 地址,但这 16 个 IP 地址在所有接口上都是相同的。我需要进行 NAT,以便根据源 IP 和它进入的接口更改源 IP,以便为发送到应用程序的消息提供 48 个唯一源 IP 地址。
应用程序在最不活跃的主机上运行,并且它们的 IP 无法更改。这就是我决定将它们放入 VLAN 的原因。
我搜索了各种教程和 HOWTO,但还是找不到我想要的东西。问题是:SNAT 只能在 POSTROUTING 链中使用,但在 POSTROUTING 中我没有关于它进入的接口的信息。
我的假设正确吗?我对网络这方面还不熟悉,所以任何帮助和建议都会有帮助。
感谢您的帮助。
答案1
也许你可以这样做:
在PREROUTING时用不同的编号标记来自不同接口的数据包。
sudo iptables -t nat -A PREROUTING -i eth1.<x> -j MARK --set-mark <choose_a_unique_number_per_interface>
在后路由时使用SNAT和标记:
sudo iptables -t nat -A POSTROUTING -s <iprange_of_eth1.<x>> -m mark --mark <number_given_to_eth1.<x>_at_the_time_of_prerouting> -j SNAT --to-source <an_ip_from_48_ipset>
答案2
解决了。
由于数据包的目的地是运行 NAT 的机器,因此我无法使用 POSTROUTING 链。
对于有同样问题的人:检查 xtables-addons:RAWNAT 目标http://manpages.ubuntu.com/manpages/karmic/man8/xtables-addons.8.html
它允许您在 PREROUTING 中使用无状态 SNAT。这正是我所寻找的。您只需构建模块并加载它(例如使用 modprobe)。
如果您要实现这一点,请不要忘记它是无状态 NAT,因此它不会像 SNAT 和 DNAT 那样自动执行反向 NAT。因此,您需要实现自己的反向 NAT 规则。