我已经安装了 PVE,我收到了三个公共 IP 地址,其中两个在同一范围内,第三个在不同范围内。我想给 PVE 主机一个公共 IP 以便外部访问,另外两个给虚拟机。我还想创建两个具有私有 IP 地址的虚拟机并进行端口转发。以下是我的配置:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address x.x.203.141
netmask 255.255.255.128
pointopoint x.x.203.137
gateway x.x.203.137
broadcast x.x.203.255
#post-up echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
iface eth1 inet manual
auto vmbr0
iface vmbr0 inet static
address x.x.203.141
netmask 255.255.255.128
#gateway x.x.203.137
bridge_ports none
bridge_stp on
bridge_fd 0
bridge_maxwait 0
iface vmbr1 inet manual
bridge_ports none
bridge_stp on
bridge_fd 0
up ip route add x.x.203.142/32 dev vmbr0 ##IP of the first VM
up ip route add x.x.220.37/32 dev vmbr1 ## IP of the second VMS
auto vmbr2
iface vmbr2 inet static
address 192.168.0.254
netmask 255.255.255.0
bridge_ports none
bridge_stp on
bridge_fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '192.168.0.0/24' -o eth0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.0.0/24' -o eth0 -j MASQUERADE
但是我在外部与主机失去 ping 通。而且,第二台虚拟机具有不同范围的公共 IP,我的互联网速度非常慢?另一件事是,我无法从外部通过私有 IP 地址 ssh 连接到虚拟机。
提前感谢您的帮助!
答案1
实现此目的的最简单方法是通过桥接(而不是代理 arp)为虚拟机提供白色(公共)IP。您仍然可以为主机上的所有虚拟机设置防火墙流量,因为 Linux 中的 netfilter 支持使用 iptables 规则检查桥接流量。
在这种情况下,配置可能看起来像这样:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
auto vmbr0
iface vmbr0 inet static
address x.x.203.141
netmask 255.255.255.128
pointopoint x.x.203.137
gateway x.x.203.137
broadcast x.x.203.255
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
auto eth1
iface eth1 inet manual
auto vmbr1
iface vmbr1 inet manual
bridge_ports eth1
bridge_stp off
bridge_fd 0
auto vmbr2
iface vmbr2 inet static
address 192.168.0.254
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '192.168.0.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.0.0/24' -o vmbr0 -j MASQUERADE
您必须将应该出现在 eth0 上的 VM 放入 vmbr0,将应该出现在 eth1 上的 VM 放入 vmbr1,其他所有内容都进入 vmbr2,来自该网络的任何流量都将被伪装。请注意,vmbr1 没有任何 IP 地址,它不需要任何 IP 地址,因为该桥的唯一目的是连接 eth1 和 VM 虚拟接口。所有主机通信都通过 vmbr0 完成。
我不知道您为什么为 eth0 添加“pointtopoint”关键字。我将其保留在 vmbr0 中;但我仍然认为这是一个错误,没有必要。您的 eth0 上有 BMA 网络,掩码为 /25,它有 128 个地址(其中 126 个可用),因此“pointtopoint”(这意味着您只有一个对等体)在那里看起来是错误的。我还在所有网桥中禁用了 stp。它没有多大用处,因为您不会桥接连接到其他地方的任何接口。
无论如何,tcpdump 是你最好的朋友。
您可以设置代理 arp,而不是桥接第一个虚拟机(出现在 eth0 上)。我认为这会使事情变得不那么稳健,我建议您不要这样做。
根据您的描述,我推断您的主机应该只有一个 IP 地址,并且该地址应该在 eth0 上可见,因此 eth1 在主机中将没有编号(不应该有任何地址),只有 VM 地址会出现在那里。我不知道是否可以在 Linux 中在无编号接口(没有任何 IP 地址的接口)上设置代理 arp 和路由,因此为了澄清这部分,我需要自己做一些调查。