![具有多个公共 IP 的 proxmox KVM 路由网络](https://linux22.com/image/631722/%E5%85%B7%E6%9C%89%E5%A4%9A%E4%B8%AA%E5%85%AC%E5%85%B1%20IP%20%E7%9A%84%20proxmox%20KVM%20%E8%B7%AF%E7%94%B1%E7%BD%91%E7%BB%9C.png)
我在 hetzner 有一个专用托管。另外,我还购买了一个 6IP 子网。
我的主 IP 是:148.111.111.200 我的主要子网是:255.255.255.224
我的附加 IP 是 148.222.222.1 至 148.222.222.6。
我的使用场景如下: 几个实例将具有面向公众的 IP(Web 服务器等) 所有实例都将为内部 LAN 设置第二个 nic,因此我可以从外部锁定私有网络上的 mysql 服务器、memcached 等。
Web 服务器将在 148.222.222.1 上线,并具有第二个 NIC,IP 为 10.10.10.10
目前,我已经设置了内部局域网。所有实例都可以通过内部 IP(10.10.10.X)相互连接和 ping 通,但我的 Web 服务器无法访问互联网。
我无法使用桥接模式,因为 hetzner 不允许在同一个外部 IP 上使用多个 MAC,所以我必须使用路由模式。这是我的主机的 /etc/network/interfaces 文件:
# network interface settings
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 148.111.111.200
netmask 255.255.255.255
pointopoint 148.111.111.193
gateway 148.111.111.193
broadcast 148.111.111.223
post-up echo 1 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
#commentedout
#up route add -net 148.111.111.192 netmask 255.255.255.224 gw 148.111.111.193 eth0
# default route to access subnet
auto vmbr0
iface vmbr0 inet static
address 148.111.111.200
netmask 255.255.255.255
bridge_ports none
bridge_stp off
bridge_fd 0
up ip route add 148.222.222.1/32 dev vmbr0
up ip route add 148.222.222.2/32 dev vmbr0
auto vmbr1
iface vmbr1 inet static
address 10.10.10.1
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 '10.10.10.0/24' -o eth0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eth0 -j MASQUERADE
auto vmbr2
iface vmbr2 inet static
address 148.222.222.1
netmask 255.255.255.248
bridge_ports none
bridge_stp off
bridge_fd 0
这是我的 kvm 接口文件:
auto eth0
iface eth0 inet static
address 148.222.222.1
netmask 255.255.255.255
pointopoint 148.111.111.200
gateway 148.111.111.200
dns-nameservers 8.8.8.8 8.8.4.4
auto eth1
address 10.10.10.12
netmask 255.255.255.0
network 10.10.10.0
broadcast 10.10.10.255
目前,KVM 实例可以相互 ping 通,但其他操作均无法进行。主机可以 ping 通实例,但其他操作均无法进行。而且,我无法在我的实例上访问互联网。
为了使其正常工作,我需要在配置中做哪些更改。
PS proxmox 中网卡类型设置为 virtio
答案1
我使用以下配置解决了该问题:
auto eth0
iface eth0 inet static
address 148.111.111.200
netmask 255.255.255.255
pointopoint 148.111.111.193
gateway 148.111.111.193
broadcast 148.111.111.193
# default route to access subnet
auto vmbr0
iface vmbr0 inet static
address 148.111.111.200
netmask 255.255.255.255
bridge_ports none
bridge_stp off
bridge_fd 0
bridge_maxwait 0
#subnet
up ip route add 148.222.222.0/32 dev vmbr0
up ip route add 148.222.222.1/32 dev vmbr0
up ip route add 148.222.222.2/32 dev vmbr0
up ip route add 148.222.222.3/32 dev vmbr0
up ip route add 148.222.222.4/32 dev vmbr0
up ip route add 148.222.222.5/32 dev vmbr0
up ip route add 148.222.222.6/32 dev vmbr0
up ip route add 148.222.222.7/32 dev vmbr0
auto vmbr1
iface vmbr1 inet static
address 10.10.10.1
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 '10.10.10.0/24' -o eth0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eth0 -j MASQUERADE
在你的客户端机器上,你需要定义一个或两个网络接口
- 一个用于 VMBR0(面向公众的 IP)
- 一个用于 VMBR1(私有 IP - 10.10.10.X)
Ubuntu 的示例配置 /etc/网络/接口
#vmbr0
auto eth0
iface eth0 inet static
address 148.222.222.1
netmask 255.255.255.255
pointopoint 148.111.111.200
gateway 148.111.111.200 #public IP for the proxmox node
dns-nameservers 8.8.8.8 8.8.4.4
#vmbr1
auto eth1
iface eth1 inet static
address 10.10.10.20
netmask 255.255.255.0
network 10.10.10.0
broadcast 10.10.10.255
答案2
查看 vmbr0 的配置,似乎您正在将路由指向接口无法到达的设备(即,网络掩码超出接口网络范围的设备)。
在不深入研究您的配置的情况下,我会提出以下建议,以简化您现在和将来的设置:
Create a VM that will act as your UTM
(可能运行 pfsense、vyatta、astaro、zentyal、clearos、untangle 等)。这将确保您只担心扮演网关(和冗余网关)角色的一个或两个节点上的连接。然后,您的所有路由和访问逻辑都将在此 UTM VM 内发生。我个人已成功使用 pfsense 和 zentyal 做到了这一点Proxmox VE 3.2 now works with openvswitch
,尝试部署在上面。这将使您能够轻松管理网络堆栈,而无需过多地深入研究 ebtables 和 iptables 规则的内部结构。
此外,您还要在 eth{0,1} 接口及其上的桥接器上配置网络。我通常建议从 eth{0,1} 接口中删除配置,并仅在桥接器接口上配置网络。
以下操作如何?它将接口配置详细信息从主机中带走,并将网络之间的路由控制权留给您的 UTM VM......:
auto eth0
iface eth0 inet manual
auto eth1
iface eth1 inet manual
auto vmbr0
iface vmbr0 inet manual
bridge_ports eth0
bridge_stp off
bridge_fd 0
auto vmbr1
iface vmbr1 inet manual
bridge_ports eth0
bridge_stp off
bridge_fd 0
auto vmbr2
iface vmbr2 inet static
address 10.10.10.12
netmask 255.255.255.0
gateway 10.10.10.1
bridge_ports eth1
bridge_stp off
bridge_fd 0
显然,如果与主机的连接存在问题,则必须修改 vmbr0 或 vmbr1 并为主机添加 IP。基本思想是不给主机带来虚拟机间网络路由的负担,并让一个专用虚拟机来处理这些细节
通过此设置,您的 UTM VM 将变得非常强大,您甚至可以让主机将路由转发到它以获取外部可访问的 IP 地址。在这种情况下,我建议在集群(即使只有 2 节点集群)中运行 proxmox,并为 UTM VM 启用 HA。
答案3
你还需要这个在顶部
自动档
iface lo inet 环回
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 148.111.111.200
netmask 255.255.255.255
pointopoint 148.111.111.193
gateway 148.111.111.193
broadcast 148.111.111.193
# default route to access subnet
auto vmbr0
iface vmbr0 inet static
address 148.111.111.200
netmask 255.255.255.255
bridge_ports none
bridge_stp off
bridge_fd 0
bridge_maxwait 0
#subnet
up ip route add 148.222.222.0/32 dev vmbr0
up ip route add 148.222.222.1/32 dev vmbr0
up ip route add 148.222.222.2/32 dev vmbr0
up ip route add 148.222.222.3/32 dev vmbr0
up ip route add 148.222.222.4/32 dev vmbr0
up ip route add 148.222.222.5/32 dev vmbr0
up ip route add 148.222.222.6/32 dev vmbr0
up ip route add 148.222.222.7/32 dev vmbr0
auto vmbr1
iface vmbr1 inet static
address 10.10.10.1
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 '10.10.10.0/24' -o eth0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o eth0 -j MASQUERADE