数周以来,我一直在尝试找出正确的网络配置,以便与在我的服务器上运行的 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
现在可以了
上面的配置大纲实际上如我所愿。如果您想查看我之前的尝试,请参阅编辑历史记录。
如果是桥接,则不需要在主机上配置与虚拟机 IP 地址相关的任何内容。只需将它们配置为连接到网桥,并以通常的方式在每个 VM 中配置 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
。eth0
(这是连接到主机的VM的br0
.)在这两种情况下,您都不应该将虚拟机的地址直接添加到
br0
接口中。在桥接的情况下,您希望 VM 而不是主机响应这些地址的 ARP 请求,而在路由的情况下,您希望主机了解当它收到这些地址之一的数据包时,需要对其进行路由其他地方,不是本地交付的。您不想将 VM 的 IP 地址分配给主机的 br0 接口——这只会使该地址属于主机,而不属于 VM。
但是,您的 VM 将需要一个网关地址来将所有出站数据包路由到。我建议在 /28 中为您的主机分配一个 IP,并将您的 VM 配置为使用该 IP 作为它们的默认路由。子网中第一个或最后一个可用 IP 是网关地址的合理选择....
你启用了ip转发吗?例如,取消注释 /etc/sysctl.conf 中的以下内容(一个或两个用于 ipv4 和/或 ipv6):
最后,您是否尝试过在 VM 的控制台登录(例如使用 virt-manager 或 vinagre 或 xvnc4viewer 等 VNC 查看器)?如果有,它有什么 IP 地址(如果有的话)?VM 是否配置为具有静态 IP 或 dhcp?如果是后者,您是否配置了 dhcp 服务器以将适当的 IP 地址提供给虚拟机 MAC 地址?