这是我的网络拓扑:
+------------------+
| |
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可以通过网关访问互联网。