Iptables SNAT 路由到 openVZ 容器

Iptables SNAT 路由到 openVZ 容器

为了使这一点有意义,我需要稍微描述一下场景。

我有一个带有 5 个公共 IP 的专用服务器:ABC1 至 ABC5

ABC1 管理专用服务器本身,ABC2 - 5 用于 OpenVZ 容器。我希望每个公共 IP 都链接到多个容器 - 例如,ABC2 应将端口 80 上的流量转发到 192.168.2.1 处的容器,将端口 21 上的流量转发到 192.168.2.2 处的容器。

如果只使用一个外部 IP,则使用 IPTables 对流量进行 NAT 是可行的,但是如果我尝试添加多个公共 IP 进行路由,我将失去与所有容器的所有网络连接,它们无法 ping 通,也无法接收传入流量。但是仍然可以访问主机节点。

主机节点上iptables -t nat -L的输出如下:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       udp  --  anywhere             A.B.C.2             udp dpt:9987 to:192.168.2.1:9987
DNAT       tcp  --  anywhere             A.B.C.2             tcp dpt:10011 to:192.168.2.2:10011
DNAT       tcp  --  anywhere             A.B.C.2             tcp dpt:30033 to:192.168.2.2:30033
DNAT       tcp  --  anywhere             A.B.C.3             tcp dpt:80 to:192.168.3.1:80
DNAT       tcp  --  anywhere             A.B.C.4             tcp dpt:25565 to:192.168.4.1:25565

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  192.168.2.0/24        anywhere            to:A.B.C.2
SNAT       all  --  192.168.3.0/24        anywhere            to:A.B.C.3
SNAT       all  --  192.168.4.0/24        anywhere            to:A.B.C.4

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

主机节点有一个物理网卡 - eth0,其 IP 为 ABC1

主机运行的是 Centos 6.3,每个虚拟机都运行的是 Debian 7。

我的OpenVZ内核版本是2.6.32-042stab108.2

答案1

  1. 检查物理主机的外部接口上是否设置了所有公共 IP,并设置了正确的网络掩码

  2. 检查所有虚拟机是否都将其所连接的网桥的 IP 地址作为默认网关(检查网桥是否具有正确的 IP)

  3. 检查 ip_forwarding 是否已启用

  4. 使用 SNAT 将虚拟机屏蔽在正确的公共 IP 后面

  5. 使用 DNAT 将传入流量转发到正确的虚拟机

相关内容