公共 IPv6 在 KVM 桥上失败并显示“无可用缓冲区空间”

公共 IPv6 在 KVM 桥上失败并显示“无可用缓冲区空间”

我已经在 Freenode 上的 #networking 和 #freebsd IRC 频道上提出了这个问题,但没有人能够回答我的问题并将我转发到这里,因为看来这个问题很难解决。

我有一个 Proxmox 虚拟机管理程序,其中托管来自 Debian 9、Arch Linux 和 Windows 的 LXC 容器和 KVM 机器。所有这些都桥接到虚拟机管理程序,并且 IPv6 堆栈与我的 ISP 提供的公共 IP 地址完美配合,并直接路由到虚拟机。

我拥有的虚拟机之一是 OPNsense 防火墙设备(基于 FreeBSD 11.0-RELEASE-p8)。

与其他 LXC/KVM 相反,后者无法 ping 通可直接从网桥访问的机器之外的任何 IPv6 机器。当我尝试 ping 虚拟机管理程序的网关(仍在 IPv6 中)或任何其他远程 IPv6 主机(例如 google.com)时,我收到以下错误消息:

[...]
ping6: sendmsg: No buffer space available
[...]
  • 起初,我认为该问题是由于 VirtIO 驱动程序(与 FreeBSD 捆绑)的问题造成的。所以我改用模拟Intel E1000网卡,但问题仍然存在。 (我现在又回到了 VirtIO)。
  • netstat -m 将缓冲区报告为空,因此问题也不是来自这里。
  • 将接口关闭然后再次打开或重新启动并不能解决问题
  • 我使用全新的 FreeBSD 和 OpenBSD 安装进行了测试(以避免 OPNsense 覆盖),但问题仍然存在。

从桥接器或完全在基础设施之外的计算机 ping 虚拟机没有响应,也没有连接(即我已在 2222 上启动 sshd,但无法连接)。

FreeBSD 主机配置如下:

ifconfig vtnet0 <ipv4>/32
route add <gw ipv4> -iface vtnet0
route add default <gw ipv4>

ifconfig vtnet0 inet6 <ipv6> prefixlen 64
route add -inet6 <gw ipv6> -iface vtnet0
route add -inet6 default <gw ipv6>

请注意,我的所有 GW 均位于我的 IP 子网之外。

应用这些行后,netstat -rn 报告的路由对我来说是有意义的。没有什么不对。

我精确地说 pf 防火墙已完全禁用(pfctl -d)。我想确保在出现另一级故障之前它可以完美地工作。 :)

BSD IPv6 堆栈中是否存在 bug,而 Linux 根本没有抱怨?这听起来很奇怪,因为我认为我不是唯一一个处于这种情况的人,也不是唯一一个 GW 超出其 IP 范围的人。

预先感谢您的时间/帮助。

问候。

也在 freebsd-net 邮件列表上询问

答案1

经过与 OPNsense 背后公司的人员进行一些讨论后,我已经能够解决我的问题。

我的远端网关位于/56。即使我的 IPv6 不是 /56,将我的 IPv6 设置为 /56 前缀而不是 /64 也可以解决我的问题。

这是因为 FreeBSD 的 IPv6 NDP 实现无法找到不被视为直接邻居的网关 IPv6 地址。

-> 链接到 FreeBSD 邮件列表上的主题。

相关内容