SNAT 到不可路由的接口

SNAT 到不可路由的接口

我在默认命名空间和另一个名为 RoutableNS 的命名空间之间设置了虚拟以太网 (veth) 对,如下所示:

--------------              --------------
-   veth0    - --------------    veth1   -
-  10.5.1.1  -              -  10.5.1.2  -
--------------              --------------
  default NS                 RoutableNS

我可以通过接口对命名空间 RoutableNS 中的外部世界进行 ping 操作veth1,但事实证明,当我将传入流量 SNAT(或 MASQUERADE)到 10.5.1.1(或 10.5.1.2)时,不会有任何内容到达 veth 接口。

我对tun设备尝试了同样的操作,我看到当它的 IP 无法路由到外部世界(在默认命名空间中)时,不可能通过伪装来调整设备。

所以我有两个问题:

  1. SNAT(MASQUERADE)的这种行为是否记录在某处?我的意思是新的源 IP 应该可以路由到当前命名空间中的外部世界。
  2. 是否有网络选项(sysctls)可以让我这样做?

答案1

完全有可能对 IP 无法路由到外部世界的设备进行伪装或 SNAT。是否在网络命名空间中并没有什么区别。

您很方便地忘记告诉我们您到底尝试了什么,但请记住,SNAT 和 MASQUERADE 只能在 POSTROUTING 表中工作(而 DNAT 只能在 PREROUTING 表中工作),这一事实已有详细记录,并且您无法避免在命令中明确提及iptable

这意味着 SNAT 将作为数据包离开接口之前的最后一步进行,而 DNAT 将作为数据包从外部进入接口的早期步骤进行。

因此,通常的设置是路由器(主机或命名空间)将来自一侧的 IP 地址映射到另一侧的所有内容:

                +---------------+
                |               |
masq'ed IP --<--| eth0     eth1 |--<-- original IP
10.0.0.99       |               |      10.0.0.1
                +---------------+
                Host or Namespace

并且您需要一个相应的 DNAT 来用于传入连接,因此:

iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.1/32  -j SNAT --to 10.0.0.99
iptables -t nat -A PREROUTING  -i eth0 -d 10.0.0.99/32 -j DNAT --to 10.0.0.1

您没有确切地说出您想要伪装成什么IP,但是如果您的主命名空间充当这样的路由器,并且您想要屏蔽“RouteableNS”,即10.5.1.2对外界,那么这是可以通过使用主命名空间的传出 IF。

相关内容