我有一台带有一张网卡的服务器 ( eth1
)。我的服务器分配了 5 个公网 IP 地址,当前配置如下 ( /etc/network/interfaces
):
# The primary network interface
allow-hotplug eth1
iface eth1 inet static
address xxx.yyy.zzz.130
netmask 255.255.255.248
network xxx.yyy.zzz.128
broadcast xxx.yyy.zzz.135
gateway xxx.yyy.zzz.129
iface eth1:0 inet static
address xxx.yyy.zzz.131
netmask 255.255.255.248
iface eth1:1 inet static
address xxx.yyy.zzz.132
netmask 255.255.255.248
iface eth1:2 inet static
address xxx.yyy.zzz.133
netmask 255.255.255.248
iface eth1:3 inet static
address xxx.yyy.zzz.134
netmask 255.255.255.248
这运行得很好,但是我想添加一个与公共 IP 桥接的 KVM 虚拟机xxx.yyy.zzz.131
。
如果我这样做:
auto br0
iface br0 inet static
bridge-ports eth1
bridge_stp off
bridge_fd 0
bridge_maxwait 0
address xxx.yyy.zzz.131
netmask 255.255.255.248
然后仅有的 xxx.yyy.zzz.131
可以访问。其他 IP 均不可访问。
如果我将其更改为,bridge-ports eth1:0
我会收到错误:
SIOCSIFFLAGS: Cannot assign requested address
RTNETLINK answers: File exists
Failed to bring up br0.
如果我注释掉有关的其他部分eth1:0
,除了上述错误之外,我还会得到Ignoring unknown interface eth1:0=eth10.
开头的错误。
如果我只有一个 NIC 和多个 IP,如何添加桥接设备?
答案1
您应该只拥有主持人在主机桥上。客户机的 IP 地址应仅在客户机中分配。
答案2
您可以使用多种方式在虚拟机内使用公共 IP。
第一种方式就是你选择的。在这种情况下,你将创建一个具有eth1
桥接端口的桥接接口。
您的interfaces
文件看起来应该类似于。
iface br0 inet static
bridge-ports eth1
bridge_stp off
bridge_fd 0
bridge_maxwait 0
address xxx.yyy.zzz.130
netmask 255.255.255.248
gateway xxx.yyy.zzz.129
iface br0:1 inet static
address xxx.yyy.zzz.132
netmask 255.255.255.248
iface br0:2 inet static
address xxx.yyy.zzz.133
netmask 255.255.255.248
iface br0:3 inet static
address xxx.yyy.zzz.134
netmask 255.255.255.248
注意,xxx.yyy.zzz.131
主机上没有分配。另外broadcast
和network
选项是无用的,所以我省略了它们。
此后,您可以在 VM 内部使用公共 IP,无需任何额外技巧,因为 VM 将作为桥接端口连接。
另一种方法是使用代理 arp 功能。为此,您不需要更改接口文件。您只需在虚拟机内分配公共 ip(作为主或次),在主机上添加到此公共 ip 的路由,并在接口上启用代理 arp 功能eth1
。请注意,此公共 ip 不应在主机本身上分配,而应在虚拟机内分配。另外,不要忘记使这些更改永久生效(您可以使用文件post-up
中的选项interfaces
)。
ip route add <public-ip> dev <virt-bridge-iface>
sysctl -w net.ipv4.conf.eth1.proxy_arp=1
答案3
无法为一个 IP 地址创建桥接网络。必须对整个网络接口进行此操作,否则根本不需要。如果您只有一个 NIC,则唯一的选择是在主机上分配所有 IP 地址,然后使用防火墙(例如iptables
)对客户操作系统进行 NAT。
本文有一个脚本,当客户操作系统启动/停止时,它将自动为您执行此操作。