如何在 Debian/Ubuntu 上将一系列公共 IP 桥接到 KVM 虚拟机

如何在 Debian/Ubuntu 上将一系列公共 IP 桥接到 KVM 虚拟机

几个星期以来,我一直在尝试找出正确的网络配置,以便与服务器上运行的 KVM 虚拟机共享一系列公共 IP,但到目前为止运气不佳在友好的 ServerFault 社区的帮助下,我成功实现了它。您可以在下面找到我的工作设置:

我的 ISP 将所有流量路由到192.168.8.118(因此这需要是 eth0 的主 IP),但我必须192.168.239.160/28按照自己的意愿处理。

/etc/network/interfaces主机上的情况如下:

# Loopback device:
auto lo
iface lo inet loopback

# device: eth0
auto  eth0
iface eth0 inet static
  address   192.168.8.118
  broadcast 192.168.8.127
  netmask   255.255.255.224
  gateway   192.168.8.97
  pointopoint 192.168.8.97
  # This device acts as gateway for the bridge, so provide a route.
  up ip route add 192.168.8.118/32 dev eth0 scope host

# device: br0
auto  br0
iface br0 inet static
  bridge_stp      off
  bridge_maxwait  0
  bridge_fd       0
  address   192.168.239.174
  broadcast 192.168.239.175
  netmask   255.255.255.240
  gateway   192.168.8.118
  # Create and destroy the bridge automatically.
  pre-up brctl addbr br0
  post-down brctl delbr br0
  # Our additional IPs are allocated on the bridge.
  up ip route add to 192.168.239.160/28 dev br0 scope host

我已经配置了一个这样的虚拟机:

sudo ubuntu-vm-builder kvm precise \
                  --domain pippin \
                  --dest pippin \
                  --hostname pippin.hobbiton.arnor \
                  --flavour virtual \
                  --mem 8196 \
                  --user mikl \
                  --pass hest \
                  --bridge=br0 \
                  --ip 192.168.239.162 \
                  --mask 255.255.255.240 \
                  --net 192.168.239.160 \
                  --bcast 192.168.239.175 \
                  --gw 192.168.239.174 \
                  --dns 8.8.8.8 \
                  --components main,universe \
                  --addpkg git \
                  --addpkg openssh-server \
                  --addpkg vim-nox \
                  --addpkg zsh \
                  --libvirt qemu:///system ;

如果我检查虚拟机的 XML 定义,它的网络接口定义如下:

<interface type='bridge'>
  <mac address='52:54:00:b1:e9:52'/>
  <source bridge='br0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

当我(重新)启动虚拟机时,/var/log/syslog收到以下几行:

Jul 20 03:13:02 olin kernel: [ 4084.652906] device vnet0 entered promiscuous mode
Jul 20 03:13:02 olin kernel: [ 4084.686388] br0: port 2(vnet0) entering forwarding state
Jul 20 03:13:02 olin kernel: [ 4084.686394] br0: port 2(vnet0) entering forwarding state

我的服务器运行的是 Ubuntu 12.04 64 位,内核为 3.2.0-26-generic(来自 Ubuntu)。我正在运行libvirt-bin 0.9.8-2ubuntu1qemu-kvm 1.0+noroms-0ubuntu13

主机上的 iptables 当前设置为允许所有流量(以消除问题源),并且我已启用 ipv4 和 ipv6 流量的转发。

当我从主机通过 SSH 登录到客户机时,客户机操作系统内没有互联网连接。客户机/etc/network/interfaces如下所示:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.239.162
    netmask 255.255.255.240
    network 192.168.239.160
    broadcast 192.168.239.175
    gateway 192.168.239.174
    # dns-* options are implemented by the resolvconf package, if installed
    dns-nameservers 8.8.8.8
    dns-search pippin

现在它起作用了

上面的配置大纲实际上按我想要的方式工作。如果您想查看我之前的尝试,请参阅编辑历史记录。

答案1

如果您使用桥接,则无需在主机上配置与虚拟机 IP 地址相关的任何内容。只需将它们配置为连接到桥接器,然后以通常的方式配置每个虚拟机内的 IP。桥接在以太网层将网络连接在一起,其中 IP 地址无关紧要;从您的 ISP 的角度来看,这看起来就像您有几台计算机插入直接连接到 ISP 的交换机。

但如果你的 ISP路由流量到主机的 .118 地址,您需要将 VM 主机配置为充当路由器并转发 VM 的流量。为此,请bridge_ports eth0从接口文件中删除行、ip route add to 192.168.239.160/28 dev br0echo 1 > /proc/sys/net/ipv4/ip_forward。在 VM 中,您需要将 192.168.8.118 配置为默认网关,并添加一条路由,表明 192.168.8.118 可通过 直接访问eth0。(这是 VM 的eth0,它连接到主机的br0。)

在任何一种情况下,您都不应将虚拟机的地址直接添加到br0接口。在桥接情况下,您希望虚拟机而不是主机回答这些地址的 ARP 请求;在路由情况下,您希望主机明白,当它收到其中一个地址的数据包时,需要将其路由到其他地方,而不是在本地传送。

答案2

您不想将虚拟机的 IP 地址分配给主机的 br0 接口 - 这只会使该地址属于主机,而不是虚拟机。

但是,您的虚拟机需要一个网关地址来路由所有出站数据包。我建议为您的主机分配一个 /28 中的 IP,并将您的虚拟机配置为使用该 IP 作为其默认路由。子网中第一个或最后一个可用 IP 是网关地址的合理选择....

ip addr add 192.168.239.161/28 dev br0

您是否启用了 IP 转发?例如,在 /etc/sysctl.conf 中取消注释以下内容(对于 ipv4 和/或 ipv6 之一或两者):

#net.ipv4.ip_forward=1
#net.ipv6.conf.all.forwarding=1

最后,您是否尝试过登录虚拟机的控制台(例如使用 virt-manager 或 VNC 查看器,如 vinagre 或 xvnc4viewer)?如果是,它的 IP 地址是什么(如果有)?虚拟机是否配置为静态 IP 或 dhcp?如果是后者,您是否已将 dhcp 服务器配置为向虚拟机 MAC 地址提供适当的 IP 地址?

相关内容