使用基于源接口和 IP 地址的 iptables SNAT

使用基于源接口和 IP 地址的 iptables SNAT

我想根据 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

也许你可以这样做:

  1. 在PREROUTING时用不同的编号标记来自不同接口的数据包。

    sudo iptables -t nat -A PREROUTING -i eth1.<x> -j MARK --set-mark <choose_a_unique_number_per_interface>
    
  2. 在后路由时使用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 规则。

相关内容