我在 Lenny 上运行 Debian Linux 服务器。在其中,我使用 KVM 运行另一个 Lenny 实例。这两台服务器都对外可用,具有公共 IP,以及第二个接口,具有 LAN 的私有 IP。一切正常,只是 VM 将所有网络流量视为来自主机服务器。我怀疑这可能与我在主机上运行的基于 iptables 的防火墙有关。
我想弄清楚的是:如何正确配置主机的网络以满足所有这些要求?
- 主机和虚拟机都有 2 个网络接口(公共和私有)。
- 主机和虚拟机均可独立设置防火墙。
- 理想情况下,虚拟机流量不必穿越主机防火墙。
- 虚拟机看到的是真实的远程 IP 地址,而不是主机的 IP 地址。
当前,主机的网络接口配置为网桥。eth0 和 eth1 没有分配 IP 地址,但 br0 和 br1 有。
/etc/network/interfaces
在主机上:
# The primary network interface
auto br1
iface br1 inet static
address 24.123.138.34
netmask 255.255.255.248
network 24.123.138.32
broadcast 24.123.138.39
gateway 24.123.138.33
bridge_ports eth1
bridge_stp off
auto br1:0
iface br1:0 inet static
address 24.123.138.36
netmask 255.255.255.248
network 24.123.138.32
broadcast 24.123.138.39
# Internal network
auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
bridge_ports eth0
bridge_stp off
这是虚拟机的 libvirt/qemu 配置文件:
<domain type='kvm'>
<name>apps</name>
<uuid>636b6620-0949-bc88-3197-37153b88772e</uuid>
<memory>393216</memory>
<currentMemory>393216</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='i686' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='cdrom'>
<target dev='hdc' bus='ide'/>
<readonly/>
</disk>
<disk type='file' device='disk'>
<source file='/raid/kvm-images/apps.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<mac address='54:52:00:27:5e:02'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
<interface type='bridge'>
<mac address='54:52:00:40:cc:7f'/>
<source bridge='br1'/>
<model type='virtio'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
</devices>
</domain>
和我的其余防火墙规则一起,防火墙脚本包含这个命令来传递发往 KVM 客户机的数据包:
# Allow bridged packets to pass (for KVM guests).
iptables -A FORWARD -m physdev --physdev-is-bridged -j ACCEPT
(不适用于这个问题,但我的桥接配置的副作用似乎是我无法干净地关闭。内核最终告诉我“unregister_netdevice:等待 br1 变为空闲”,我必须硬重置系统。也许是我做了一些愚蠢的事情的迹象?)
答案1
为什么需要在 br1:0 上使用别名?
除了别名之外,这可能是一个问题,其想法是使用以下方案:
eth0->br0 <--VM 的 tap 设备,
主机应该能够使用 br0 作为其 IF,而 VM 将使用 tap 设备作为插入虚拟交换机的虚拟 NIC(br0 实际上成为此处的虚拟交换机)
当然,每个网络都是一样,所以对于 eth1,你必须设置一个 br1,并启动要插入 br1 的虚拟机
答案2
您将虚拟机桥接到了错误的接口。它们应该桥接到连接外部世界的网络接口(br1
就您的情况而言)。
请记住,每个虚拟机也应该在客户机中设置其 IP 地址,不是在主机上。
答案3
我在 Lenny 主机内使用相同的设置来设置 Lenny/Squeeze VM,使用 lib-virt 和 virtio 桥接至 br0(无 br1 和 br0:0)。它无需在主机上进行任何特殊的 iptables 配置即可正常工作。我在每个客户 VM 内进行所有防火墙配置。
我认为检查网络路由以查看虚拟机是否使用主机作为网关可能会有所帮助。我的配置是使用外部路由器作为网关。当然,我的虚拟机和主机位于同一范围内的不同 IP 地址上。