启用具有多个 IP 地址的单网卡桥接连接

启用具有多个 IP 地址的单网卡桥接连接

我有一台带有一张网卡的服务器 ( 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主机上没有分配。另外broadcastnetwork选项是无用的,所以我省略了它们。

此后,您可以在 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。

本文有一个脚本,当客户操作系统启动/停止时,它将自动为您执行此操作。

相关内容