我正在尝试设置一台运行 3 个虚拟机的 Proxmox 机器。它有 3 个公共 ip,但这些 ip 位于单个接口 (eth0) 上。
这 3 个虚拟机位于网桥 (vmbr0) 上,地址为 172.16.0.1/24。
我启用了 IP 伪装和转发。但我不知道如何使 3 个虚拟机(172.16.0.2、172.16.0.3、172.16.0.4)中的每一个都通过特定的公共 ip 路由出去。
我已经尝试了标准 iproute,其中有 3 个表设置网关和规则,但无论我设置什么规则,虚拟机仍然通过主 ip 路由出去。
问题是 3 个公共 IP 地址位于完全独立的网络上,因此它们每个都有不同的网关。我知道如何使用 iproute 来执行此操作 if 每个公共 ip 都在一个单独的物理接口上,但是这台机器在一个接口上拥有所有 3 个接口,并且 iproute 似乎不喜欢这样,因为如果我通过 23.92 执行 ip 路由添加默认值.26.1 dev eth0:2 表 node2,然后列出它通过 eth0 显示的所有内容。所以显然 iproute 不喜欢伪接口。我对 iptables 不太了解,我确信有一种方法可以用纯 iptables 做到这一点,但还没有找到任何东西。我所有的谷歌搜索都会出现 iproute 表,就像我说的,这些表似乎不适用于单个界面。
提前谢谢您
考虑到 ProxMox 正在运行 Debian,请尝试在 /etc/network/interfaces 中为每个额外链接添加类似以下内容
post-up route add -net <network identifier> netmask <netmask> gw <links gateway>
pre-down route del -net <network identifier> netmask <netmask> gw <links gateway>
然后使用 iptables,如果您希望 172.16.0.2 通过第二个 ip,请执行以下操作:(这称为源 NAT 或 SNAT)--to-source 指定您希望传出连接重新映射到的 ip。
iptables -t nat -A POSTROUTING -s 172.16.0.2/24 -j SNAT --to-source <ip address you want it to go out of>
如果您希望同一 IP 上的所有传入连接都转到 172.16.0.2,那么您还需要添加以下内容(称为目标 NAT 或 DNAT)
iptables -t nat -A PREROUTING -d <ip/mask bit> -j DNAT --to-destination 172.16.0.2
问题:
(1)3VM - 172.16.0.2、172.16.0.3、172.16.0.4
(2)网关 - 172.16.0.1/24
(3)3 公共IP:$IP_A(网关$IP_A_G),$IP_B(网关$IP_B_G),$IP_C(网关$IP_C_G)
(4)你的目标是每个虚拟机使用不同的公网IP访问外站,糟糕的是:
VM1(172.16.0.2) ----> $IP_A
VM2(172.16.0.3) ----> $IP_B
VM3(172.16.0.4) ----> $IP_C
所以,我认为你可以使用 ip Route 来做到这一点:
(1)在 Promox(172.16.0.1)
echo "200 IPA" >> /etc/iproute2/rt_tables
echo "201 IPB" >> /etc/iproute2/rt_tables
echo "202 IPC" >> /etc/iproute2/rt_tables
重新启动 Promox 一次。
(2)创建路由器
ip route del default table IPA
ip route add default via $IP_A_G table IPA
ip route del default table IPB
ip route add default via $IP_B_G table IPB
ip route del default table IPC
ip route add default via $IP_C_G table IPC
(3)为每个虚拟机添加路由
ip rule add from 172.16.0.2 lookup IPA pref 200
ip rule add from 172.16.0.3 lookup IPB pref 201
ip rule add from 172.16.0.4 lookup IPC pref 202
ip route flush cache
完成