几个星期以来,我一直在尝试找出正确的网络配置,以便与服务器上运行的 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-2ubuntu1
和qemu-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 br0
和echo 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 地址?