我一周前安装了 Ubuntu 14.04 服务器。我将其用作虚拟机主机(安装了 taskel)。这意味着我使用 kvm + libvirt 运行它。
我已经建立了与 13.10 中相同的桥梁。
auto p4p1
iface p4p1 inet manual
up ifconfig $IFACE up
down ifconfig $IFACE down
auto br0
iface br0 inet static
address 46.182.xxx.xxx
netmask 255.255.255.240
gateway 46.182.xxx.xxx
dns-nameservers 46.182.xxx.xxx 46.182.xxx.xxx
bridge_ports p4p1
bridge_stp off
bridge_maxwait 0
iface br0 inet6 auto
针对 br0,我将我的虚拟机与<source bridge='br0'/>
libvirt 中定义的虚拟机连接起来。
我的虚拟机可以毫无问题地接收路由器通告消息。所有虚拟机都获得了 IPv6 地址。
我的问题是 IPv6 无法通过网桥工作。但是当我针对 br0 打开 tcpdump 进行故障排除时,它确实可以工作。我尝试将接口手动设置为混杂模式,但这无法使其工作ifconfig br0 promisc
。
为什么我在网桥上有 IPv4 地址?我不知道,老习惯了,从不质疑。IPv6 在虚拟机主机上不起作用,但主机通过 RA 获取 IPv6 地址,就像虚拟机一样。
答案1
每个 IPv6 地址(即使是链路本地地址)都会根据其最后 24 位自动订阅多播组。如果启用了多播侦听,网桥默认会过滤掉(几乎)所有多播流量。当将 IPv6 地址分配给接口时,系统必须通知网络此接口对该特定多播组感兴趣,并且必须由过滤器排除。以下是一个很好的介绍视频:https://www.youtube.com/watch?v=O1JMdjnn0ao
多播侦听是为了防止大多数系统不感兴趣的多播数据包充斥网络。您可以在小型部署中禁用多播侦听,而不会注意到任何重大差异。但这可能会对大型部署产生重大性能影响。
您可以使用以下方式禁用监听:
echo -n 0 > /sys/class/net/<brif>/bridge/multicast_snooping
如果您希望保护虚拟机免受不必要的流量和不必要的数据包处理的影响,您可以保持侦听启用状态,同时在网络上启用多播查询器。查询器将定期广播查询数据包并更新交换机和网桥上的侦听过滤器。可以使用以下命令在您的系统上启用查询器:
echo -n 1 > /sys/class/net/<brif>/bridge/multicast_querier
如果您启用了侦听功能,那么您还必须在网络上有一个查询器。
无需启用 STP。除非您知道您正在桥接导致循环路径的段,否则将其关闭可能更安全。如果您启用了 SLAAC(即 ),这也无关紧要autoconf=1
。accept_ra=1
在桥上启用 PROMISC 模式会隐式禁用监听。
答案2
您是否已在接口上启用 IPv6?如果桥接设备是 br0,则执行以下操作:
sysctl net.ipv6.conf.br0.disable_ipv6=0
sysctl net.ipv6.conf.br0.autoconf=1
sysctl net.ipv6.conf.br0.accept_ra=1
sysctl net.ipv6.conf.br0.accept_ra_defrtr=1
答案3
我认为您的配置唯一明显的问题是:
bridge_stp off
由于各种原因需要启用 STP在 libvirt 桥上。
将配置更改为:
bridge_stp on
您也可以立即激活它,而无需重新启动网络:
$ sudo brctl stp br0 on