使 LXC 容器可通过 ipv6 直接访问

使 LXC 容器可通过 ipv6 直接访问

首先,我为我的专用服务器分配了一个特殊的 IPv6 地址,只有 1 个。::1/128。我可以为 eth0 分配地址(例如::2/128、::3/128 等)。

现在我想在该服务器上运行 LXC 容器,但我希望它们是一等公民,我希望它们拥有自己的 IPv6 地址。

LXC 与 IPv4 配合使用效果很好。我可以启动一个容器并从中 ping 世界。我有一个名为 的桥接设备lxcbr0

说实话,我不知道该怎么做。在特定的 LXC 配置中(“前缀”代表我分配的前缀):

lxc.network.ipv6 = prefix::3/128
lxc.network.ipv6.gateway = prefix::2 # iffy, not sure this is correct

在主机上我已配置 sysctl 以使用转发:

net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.eth0.forwarding = 1

现在我记不清了。我思考我需要为网桥分配一个 IP。我已为其分配了前缀::2/128,这是我在上面的 LXC 配置中使用的。在“接口”中:

iface lxcbr0 inet6 static
        address prefix::2
        netmask 128
        # use arp proxy? Read that somewhere. 
        post-up /sbin/ip -6 neigh add proxy prefix::3 dev eth0 #container 1
        post-up /sbin/ip -6 neigh add proxy prefix::4 dev eth0 #container 2

不用说,这不管用。我可以启动容器并登录,但无法 ping 通任何东西。我也无法从主机 ping 通容器。我知道有一些与路由有关的事情……?

当前状态的一些输出:主机“ip -6 a”:

4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2607:5300:60:714::1/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ea40:f2ff:feed:106f/64 scope link 
       valid_lft forever preferred_lft forever
8: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 
    inet6 2607:5300:60:714::2/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::b07b:e3ff:fe33:22e7/64 scope link 
       valid_lft forever preferred_lft forever
18: vethPVJQ6M: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 fe80::fcb7:57ff:fe3c:bcd1/64 scope link 
       valid_lft forever preferred_lft forever

容器‘ip -6 a’:

20: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2607:5300:60:714::3/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe59:679f/64 scope link 
       valid_lft forever preferred_lft forever

主机‘ip -6 r’:

2607:5300:60:714::1 dev eth0  proto kernel  metric 256 
2607:5300:60:714::2 dev lxcbr0  proto kernel  metric 256 
2607:5300:60:7ff:ff:ff:ff:ff dev eth0  metric 1024 
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev lxcbr0  proto kernel  metric 256 
fe80::/64 dev vethPVJQ6M  proto kernel  metric 256 
fe80::/64 dev vethWT7OPQ  proto kernel  metric 256 
default via 2607:5300:60:7ff:ff:ff:ff:ff dev eth0  metric 1024 

容器‘ip -6 r’:

2607:5300:60:714::2 dev eth0  metric 1024 
2607:5300:60:714::3 dev eth0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
default via 2607:5300:60:714::2 dev eth0  metric 1024 

主机运行Ubuntu 15.04,LXC版本1.1.2。

我将非常感激您的指点!

答案1

我觉得你在这里混淆了很多不同的东西。首先,我怀疑你服务器以太网端口上的网络掩码实际上是 /128。我怀疑它是其他东西(可能是 /64),而且你和一群其他客户处于一个共享网段上。

根据“ip -6 a”命令的输出判断:

4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2607:5300:60:714::1/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ea40:f2ff:feed:106f/64 scope link 
       valid_lft forever preferred_lft forever
8: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 
    inet6 2607:5300:60:714::2/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::b07b:e3ff:fe33:22e7/64 scope link 
       valid_lft forever preferred_lft forever
18: vethPVJQ6M: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 fe80::fcb7:57ff:fe3c:bcd1/64 scope link 
       valid_lft forever preferred_lft forever

我想说的是接口上的 /128 是错误的。您的前缀似乎是 2607:5300:60:714::/64(最有可能)。

假设这是正确的,那么您需要按如下方式设置您的接口文件(根据需要添加您的 IPv4):

auto lxcbr0
iface lxcbr0 inet6 static
  bridge_ports eth0
  bridge_fd 0
  address 2607:5300:60:714::1
  net mask 64
  gateway 2607:5300:60:7ff:ff:ff:ff:ff

注意:目前还不清楚如何到达 2607:5300:60:7ff::/64 以到达您的默认网关。了解您的提供商希望您如何配置网络或亲自查看他们提供的任何文档将非常有用。从这里可以猜测,2607:5300:60:714::/64 网络与 2607:5300:60:7ff::/64 位于同一链路上。2607:5300:60:7ff::/64 用于提供商的基础设施。目前还不清楚您是否获得了整个 2607:5300:60:714:/64,或者是否与同一链路上的其他客户共享。

假设您可以自由地在该范围内分配地址,那么您真正需要做的就是将您的容器连接到同一个 lxcbr0 接口,并将每个容器的地址分配给该桥接接口。

再次强调,这只是根据您提供的数据做出的最佳猜测。如果不知道提供商的实际配置,就无法确定。

相关内容