前言:
- 显示的 IP 地址位于 RFC1918 空间中,但实际上是公共 IP,我只是改变了第一个八位字节
- 主机与互联网之间的连接正常
- 主机运行的是 Debian Jessie,下面是 uname -a
Linux titan 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64 GNU/Linux
我有一台服务器,在 /27 内分配了多个地址。这些详细信息如下:
Network: 10.9.114.64
Gateway: 10.9.114.65
Host: 10.9.114.80
Guest: 10.9.114.81
Bcast: 10.9.114.85
还有更多 IP 可供更多访客使用,但目前我只使用单个访客 IP。
我的计划是桥接 eth0 和虚拟网络适配器,以便客户机可以直接与主机和网关通信。
在主机上,我将寻址移至桥接接口 br0,如下所示:
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 10.9.114.80
netmask 255.255.255.224
gateway 10.9.114.65
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
已使用 ifconfig 进行了验证:
br0 Link encap:Ethernet HWaddr 54:04:a6:7e:e5:e2
inet addr:10.9.114.80 Bcast:10.9.114.95 Mask:255.255.255.224
inet6 addr: 2a01:4f8:151:6456::/64 Scope:Global
inet6 addr: fe80::5604:a6ff:fe7e:e5e2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4349285 errors:0 dropped:0 overruns:0 frame:0
TX packets:3342075 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:631623791 (602.3 MiB) TX bytes:4483323274 (4.1 GiB)
eth0 Link encap:Ethernet HWaddr 54:04:a6:7e:e5:e2
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5130227 errors:0 dropped:0 overruns:0 frame:0
TX packets:5612825 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:763224208 (727.8 MiB) TX bytes:4676628982 (4.3 GiB)
然后我使用 virt-install 设置了一个 debian VM。它最初设置为使用 NAT(因为我还无法使桥接网络工作),但当前的接口配置如下所示:
(取自“virsh dumpxml jessie-amd64”)
<interface type='bridge'> <mac address='52:54:00:06:f1:d6'/> <source bridge='br0'/> <target dev='vnet0'/> <model type='rtl8139'/> <alias name='net0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </interface>
(摘自“virsh edit jessie-amd64”)
<interface type='bridge'> <mac address='52:54:00:06:f1:d6'/> <source bridge='br0'/> <model type='rtl8139'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </interface>
应用桥接配置后,我按照 libvirt 网站上的说明重新启动了虚拟机。
我可以通过“brctl show”确认物理主机接口和虚拟适配器都在桥接器中
bridge name bridge id STP enabled interfaces
br0 8000.5404a67ee5e2 no eth0
vnet0
在客户机上,我在 /etc/network/interfaces 中有以下配置:
# The primary network interface
auto eth0
iface eth0 inet static
address 10.9.114.91
netmask 255.255.255.224
gateway 10.9.114.65
已使用 ifconfig 进行了验证:
eth0 Link encap:Ethernet HWaddr 52:54:00:06:f1:d6
inet addr:10.9.114.91 Bcast:10.9.114.95 Mask:255.255.255.224
inet6 addr: fe80::5054:ff:fec3:14e0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:32690 errors:0 dropped:0 overruns:0 frame:0
TX packets:81 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2978342 (2.8 MiB) TX bytes:4550 (4.4 KiB)
根据我的理解,这应该意味着主机和客户机本质上共享连接到网关的虚拟交换机。
但是,从主机到客户机的 ping 操作不起作用,如下所示:
pricetx@titan:/home/pricetx>ping 10.9.114.91
PING 10.9.114.91 (10.9.114.91) 56(84) bytes of data.
^C
--- 10.9.114.91 ping statistics ---
8 packets transmitted, 0 received, 100% packet loss, time 6999ms
我决定检查 ARP 表以查看主机是否至少可以通过网桥进行 arp:
pricetx@titan:/home/pricetx>sudo arp -an
? (10.9.114.91) at 52:54:00:06:f1:d6 [ether] on br0
? (10.9.114.65) at f4:cc:55:4b:55:7b [ether] on br0
它显然可以看到客人(和网关)。
但是,检查来宾的 arp 表时,我似乎看不到任何内容:
root@kvmtest:~# arp -an
? (10.9.114.65) at <incomplete> on eth0
我的问题似乎是客人无法在桥上看到其他主机。欢迎提出任何建议!
我将继续研究这个问题,如果我找到解决方案,我会更新这篇文章。
答案1
根据我使用 libvirt 创建客户机接口的经验,所需的只是源桥、MAC 地址和模型类型。其他所有内容都是在客户机启动时动态命名/创建的。libvirt 文档中可以看到一个示例:wiki.libvirt.org/page/Networking#Guest_configuration_2
看看是否可行。另外,看看如何使用 virtio 作为 NIC 模型,因为 rtl 仿真非常“简单”。Debian Jessie 客户机很好地支持 virtio。
答案2
我现在已经成功连接,证据如下:
来自嘉宾:
root@kvmtest:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=14.0 ms
root@kvmtest:~# arp -an
? (10.9.114.65) at f4:cc:55:4b:55:7b [ether] on eth0
? (10.9.114.80) at 54:04:a6:7e:e5:e2 [ether] on eth0
对我来说,问题出在服务器提供商 Hetzner 身上。显然他们的网关路由器不允许随机 MAC 地址发送/接收流量。相反,您需要访问他们的网站,生成一个地址,然后将其应用于 virsh 配置。
在 Hetzner 控制面板中,我进行了以下操作:
在“virsh edit jessie-amd64”中配置
<interface type='bridge'> <mac address='00:50:56:00:1e:aa'/> <source bridge='br0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </interface>