公共 IPv6 在 KVM 網橋上失敗並顯示“沒有可用的緩衝區空間”
我已經在 Freenode 的 #networking 和 #freebsd IRC 頻道上問過這個問題,但是沒有人能夠回答我的問題並將我轉發到這裡,因為這個問題似乎很容易解決。
我有一個 Proxmox 虛擬機管理程序,其中託管來自 Debian 9、Arch Linux 和 Windows 的 LXC 容器和 KVM 機器。它們都橋接到管理程序,IPv6 堆棧與我的 ISP 提供的公共 IP 地址完美地工作,並直接路由到虛擬機。
我擁有的 VM 之一是 OPNsense 防火牆設備(基於 FreeBSD 11.0-RELEASE-p8)。
與其他 LXC/KVM 不同的是,後者無法 ping 通可直接從網橋訪問的 IPv6 機器之外的任何 IPv6 機器。當我嘗試 ping 我的管理程序的網關(仍在 IPv6 中)或任何其他遙遠的 IPv6 主機(例如 google.com)時,我收到以下錯誤消息:
[...] ping6: sendmsg: No buffer space available [...]
- 起初,我認為問題是由於 VirtIO 驅動程序(與 FreeBSD 捆綁)的問題。所以我切換到模擬 Intel E1000 NIC,但問題仍然存在。(我現在又回到了 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 堆棧中的某個地方是否存在錯誤,因為 Linux 根本沒有抱怨?這聽起來很奇怪,因為我認為在這種情況下我不是唯一一個,也不是唯一一個在其 IP 範圍之外擁有 GW 的人。
提前感謝您的時間/幫助。
問候。
在與 OPNsense 背後的公司的一些人討論之後,我已經能夠解決我的問題。
我的遠端網關在 /56。即使我的 IPv6 不是 /56,使用 /56 前綴而不是 /64 設置我的 IPv6 也解決了我的問題。
這是因為 FreeBSD 的 IPv6 NDP 實現無法找到不被視為直接鄰居的網關 IPv6 地址。