iptables SNAT 适用于本地子网吗?

iptables SNAT 适用于本地子网吗?

这是我的网络拓扑:

                                                 +------------------+
                                                 |                  |
                                             eth0|                  |                 +-----------------+
                                         +--------+  local host 1   |                 |                 |
                                         |       |                  |             eth0|                 |
                                         |       |                  |       +----------+     vm 1       |
                                         |       +------------------+       |         |                 |
                                         |                                  |         |                 |
                      SNAT               |                                  |         +-----------------+
                                         |                                  |
                +-----------------+      |       +------------------+       |
                |                 |      |       |                  |       |
            eth0|                 |eth1  |   eth0|                  |eth1   |
public ip   +----+    gateway    +----------------+  local host 2  +--------+
                |                 |      |       |                  |       |
                |                 |      |       |                  |       |
                +-----------------+      |       +------------------+       |
                                         |                                  |
                                         |                                  |         +-----------------+
                                         |                                  |         |                 |
                                         |       +------------------+       |     eth0|                 |
                                         |       |                  |       +----------+      vm 2      |
                                         |   eth0|                  |    10.0.1.0/24  |                 |
                                         +--------+  local host 3   |                 |                 |
                                 10.0.0.0/24     |                  |                 +-----------------+
                                                 |                  |
                                                 +------------------+

网关是具有两个网卡的Linux主机:

  • eth0 用于访问互联网,它有一个公共 IP xxxx
  • eth1 用于内部访问,其内部 ip 在 10.0.0.1/24

本地主机连接到 10.0.0.0/24,在网关上正确设置 SNAT,它们可以访问互联网。

本地主机 2 有两个虚拟机,它们连接到地址为 10.0.1.0/24 的虚拟网络,尽管已经添加了正确的路由,但它们无法通过网关上的 SNAT 访问互联网。

使用 tcpdumping 网关上的 eth0,我发现网关没有转换来自任何虚拟机的数据包的源 IP。我不知道为什么。

我知道也可以通过在本地主机 2 上设置 SNAT 来解决问题。但这太奇怪了!为什么本地主机可以通过网关上的 SNAT 访问互联网,但任何虚拟机都不能?我是不是错过了什么?

有人有想法吗?

更多信息:

[网关]

  • iptables 规则:
*nat
:PREROUTING ACCEPT [3:228]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [2:144]
-A POSTROUTING -s 10.0.0.0/23 -o eth0 -j SNAT --to-source x.x.x.x
  • 路线规则:
default via x.x.x.y dev eth0
x.x.x.0/24 dev eth0 proto kernel scope link src x.x.x.x
10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.1
10.0.1.0/24 via 10.0.0.2 dev eth1

[本地主机2]

  • eth0:10.0.0.2/24

  • eth1:10.0.1.1/24

  • 没有 iptables 规则

  • 路线规则:

default via 10.0.0.1 dev eth0
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.2
10.0.1.0/24 dev eth1 proto kernel scope link src 10.0.1.1

[虚拟机 1]

  • eth0:10.0.1.2/24

  • 没有 iptables 规则

  • 路线规则:

default via 10.0.1.1 dev eth0
10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.2

vm 1 可以 ping 通 localhost 1/2/3 网关,甚至可以通过公网 IP xxxx ping 通网关,但是无法访问互联网。

本地主机1/2/3可以通过网关访问互联网。

相关内容