我想将 ipv6 ip 路由到 lxc-container,但数据包未转发。我不想将 lxc-containers 桥接到 eth0,也不想使用自动配置。此外,我只有一个/64
用于主机的网络,所以我需要为虚拟机使用一个较小的网络。我/112
目前选择了,如果需要,也许我可以使用稍大一点的网络。
我猜问题出在路由上,而不是容器上。这是我的设置:
主持人:
# the host already has working ipv6, empty ip6tables FORWARD table with policy ACCEPT
ip -6 addr add prefix::1/112 dev lxcbr
ip -6 route show|grep prefix
# prefix::/112 dev lxcbr proto kernel metric 256
sysctl net.ipv6.conf.eth0.forwarding
# net.ipv6.conf.eth0.forwarding = 1
sysctl net.ipv6.conf.lxcbr.forwarding
# net.ipv6.conf.lxcbr.forwarding = 1
虚拟机:
ip -6 addr add prefix::2/112 dev eth0
ip -6 route add default via fe80:: dev eth0 # routing via prefix::1 does not work either
ip -6 route show
# prefix::/112 dev eth0 proto kernel metric 256
# fe80::/64 dev eth0 proto kernel metric 256
# default via fe80:: dev eth0 metric 1024
工作(虚拟机):
ping6 prefix::1 # host
工作(主持人):
ping6 prefix::2 # vm
不工作(虚拟机):
ping6 google.com
# PING google.com (2a00:1450:4001:805::1007): 48 data bytes
# --- google.com ping statistics ---
# 7 packets transmitted, 0 packets received, 100% packet los
主机上的 tcpdump:
tcpdump -i lxcbr icmp6
# 13:20:44.088814 IP6 prefix::1 > fra07s32-in-x07.1e100.net: ICMP6, echo request, seq 0, length 56
# 13:20:45.089268 IP6 prefix::1 > fra07s32-in-x07.1e100.net: ICMP6, echo request, seq 1, length 56
# [...]
tcpdump -i eth0 icmp6
# [no output]
ip6tables-A FORWARD -j LOG
也不记录任何数据包。
编辑:因为每个人都抱怨网络小于/64
:问题仍然存在于接口上。问题是,当使用从一个(虚拟)接口到另一个(物理)接口的静态路由时,/64
没有数据包进入iptables 队列。FORWARD
当网络正常工作时,我希望使用较小的网络,因为我的提供商需要为更多网络支付相当高的费用(接近服务器租金的 50%)。但为了测试,我可以使用整个/64
或较大的网络,fd/8
如果它有助于测试的话。
答案1
我不会在生产环境中使用您的设置。正如其他人提到的,拆分 /64 将产生意想不到的影响。如果您无法从提供商处获得更多地址,我建议使用 NDP 代理来允许 /112 中的容器访问 IPv6 互联网。您可以使用 NDP 代理守护程序或在命令行中创建静态条目。
我写了一篇关于如何使用docker实现这一点的详细描述这里. 同样的逻辑也适用于 lxc。
答案2
我让它工作了......但它仍然很奇怪。
为“全部”设置转发,但然后为每个单独的接口禁用它:
cd /proc/sys/net/ipv6/conf/
echo 1 >all/forwarding;for i in */forwarding;do test $i = all/forwarding || echo 0 > $i;done
执行相反的操作(将所有/转发设置为 0 并将每个接口的转发设置为 1)不起作用。
另一个有趣的问题:有时您需要在将接口添加到网桥之后添加路由才能使其工作,与此处的问题相同: https://www.rivy.org/2013/02/ipv6-ping-sendmsg-network-is-down/
感谢 jeff-loughridge 提供的 docker 链接,本指南的第一部分帮助我找到了这个解决方案。
在关闭这个问题之前,我仍在调查这里到底发生了什么(以及它是否继续起作用)。