我想将一个 ipv6 ip 路由到一个 lxc 容器,但数据包没有被转发。我不想将 lxc 容器桥接到 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
我不会在生产环境中使用您的设置。正如其他人所提到的,拆分 /64 将产生意想不到的影响。如果您无法从提供商处获得更多地址,我建议您使用 NDP 代理来允许 /112 中的容器访问 IPv6 互联网。您可以使用 NDP 代理守护程序或在命令行创建静态条目。
我在此处详细描述了如何使用 docker 执行此操作。同样的逻辑也适用于 lxc。
我让它工作了......但它仍然很奇怪。
为“全部”设置转发,然后为每个单独的接口禁用它:
相反(将所有/转发设置为 0 并将每个接口的转发设置为 1)不起作用。
另一个有趣的问题:有时您需要在将接口添加到网桥后添加路由以使其工作,与此处相同的问题: https ://www.rivy.org/2013/02/ipv6-ping-sendmsg-network-关闭/
感谢 jeff-loughridge 提供的 docker 链接,本方法的第一部分让我得到了这个解决方案。
在我结束问题之前,我仍在调查这里到底发生了什么(以及它是否继续工作)。