【问题标题】:dhcpv6 returning bad subnetdhcpv6 返回错误的子网
【发布时间】:2014-10-28 18:20:06
【问题描述】:

我在一台 linux 机器和我的网络上有 IPv6,它可以工作。现在我想为它设置 DHCP。我设置了isc-dhcp-server并配置了子网。

另一台 linux 机器(都是 debian 7)充当测试客户端并获取 IP,但不在配置的范围内,更糟糕的是,获取的是 /64 子网而不是 /80。

由于路由器上可用的 IP 池已经是分配给另一台上游机器的 /64 的子集,因此我需要一个较小的子网。我不能让它是 /64。

dhcp服务器配置:

subnet6 2a01:4f8:202:6106:acda::/80 {
    range6  2a01:4f8:202:6106:acda:f000::/84;
    option dhcp6.name-servers 2a01:4f8:202:6106::2;
    prefix6 2a01:4f8:202:6106:acda:c000:: 2a01:4f8:202:6106:acda:f000:: /84;
}

客户端上的ifconfig输出:

debian@arm:~$ sudo ifconfig
[sudo] password for debian:
eth0      Link encap:Ethernet  HWaddr c8:a0:30:ae:48:24
          inet addr:192.168.0.104  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::caa0:30ff:feae:4824/64 Scope:Link
          inet6 addr: 2a01:4f8:202:6106:acda:ff2f:452c:b7b5/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:185 errors:0 dropped:0 overruns:0 frame:0
          TX packets:201 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:18222 (17.7 KiB)  TX bytes:23159 (22.6 KiB)
          Interrupt:56

同时连接的 Windows-7 机器根本无法获得 IPv6 地址。

服务器上 radvd 的配置(以防万一)

interface eth0 {
    AdvSendAdvert on;
    prefix 2a01:4f8:202:6106:acda::/80 {
        AdvOnLink on;
        AdvAutonomous on;
        AdvRouterAddr on;
    };
    route 2000::/3
    {
    };
};

怎么了?为什么这不起作用?错误的子网大小是服务器中的错误吗?还是客户?

错误子网大小的结果是,例如 64 位范围内的名称服务器 2a01:4f8:202:6106::2 无法访问。客户端认为它应该在 lan 网段上,并尝试获取链路本地 IPv6 和它的以太网 MAC,但失败了。它需要通过路由器。当我手动将子网设置为 /80 时,一切正常。

【问题讨论】:

  • 您不想将 /64 分解为更小的网络。请参阅 RFC 5375,IPv6 单播地址分配注意事项,“使用 /64 以外的子网前缀长度会破坏 IPv6 的许多功能......”
  • 嗯...谢谢你的链接。看起来强烈推荐。但是,我的提供商只在我的租赁服务器上给了我一个 /64 范围,我将其设置为将它的一个子范围转发到我的站点。我不想 NAT,因为地址空间应该足够了。提供商的范围是 2a01:4f8:202:6106::/64 我在一个很小的子网中创建了一个隧道,这是其中的一部分,将数据包转发到 /80 子范围(在 /64 内,但不是隧道的 p2p网)。因此我不能采取整个范围。它不会为远程机器本身留下地址。关于如何在没有 NAT 的情况下执行此操作的任何建议?
  • 另外,如果这个提议是原因,DHCP服务器应该报告错误。也许我应该尝试将其发布到 isc dhcp 服务器论坛。它还有其他错误。
  • 任何人都可以根据 RIR IPv6 规则获得 /48 (65536 /64s)。大多数提供商会在不询问的情况下为您提供 /56 或 /52。您可以直接前往您的 RIR 并获得 /48。 Hurricane Electric 将免费为您提供隧道。绝对没有理由拥有单个 /64。假设 2100 年有 170 亿人,当前 IPv6 全球地址(范围的 1/8)将允许每人 2100 /48s。没有理由生活在解决贫困中。
  • 3.子网前缀注意事项 IPv4 寻址计划的一个重要部分是确定每个子网前缀的长度。与 IPv4 不同,IPv6 寻址架构 [RFC4291] 规定所有使用全球唯一地址和 ULA 的子网始终具有相同的 64 位前缀长度。 (这也适用于已弃用的 6bone 和站点本地地址。)

标签: linux ipv6 router dhcp


【解决方案1】:

首先当然是一般警告:使用非/64 子网大小会破坏事情。您的 ISP 确实应该为您提供相当数量的地址空间供您使用,例如 /48/56。然后,您可以将/64s 路由到任何您想要的地方。

然后您必须查看您的 ISP 如何为您提供当前的/64。如果他们将其路由到连接到您服务器的eth0 接口的 LAN,那么除了桥接或代理-ND 之外,您无能为力,因为您必须让它看起来像所有东西都直接连接到该 LAN。这两种方法都有其自身的复杂性。

如果您要桥接到由您的 ISP 管理的 LAN,那么您不应该运行 radvddhcpd 之类的东西,因为您会干扰您的 ISP。

如果您使用代理 ND 或您的 ISP 将 /64 路由到您的服务器(因此您的服务器到 ISP 的接口上有不同的 IPv6 地址,并且 ISP 将 /64 路由到该接口)然后您确实应该运行 radvddhcpd 但只能在内部接口上运行,而不是在你的 ISP 上运行。

回到您的 RA+DHCPv6 设置,因为您的这部分问题很容易回答。您的 radvd 设置存在三处问题(所以,是的,这很重要 :)

首先,除了/64,您不能对任何东西执行 SLAAC(无状态地址自动配置),因此您必须关闭 AdvAutonomous。然后,您必须告诉客户端托管(有状态)DHCPv6 服务器可用,因此打开AdvManagedFlagroute 2000::/3 也是不必要的。您正在宣传您是默认网关,而这种更具体的做法并没有添加任何有用的东西。

interface eth1 {
    AdvSendAdvert on;
    AdvManagedFlag on;
    prefix 2a01:4f8:202:6106:acda::/80 {
        AdvOnLink on;
        AdvAutonomous off;
        AdvRouterAddr on;
    };
};

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2019-05-06
    • 1970-01-01
    相关资源
    最近更新 更多