如何为 linux ipv6 路由器配置 radvd 到上游 dsl 网关

Dav*_*idG 4 linux router ipv6 radvd

我正在尝试让我的家庭 Linux 路由器也支持家庭网络上的 ipv6。

我有一个 NVG599 DSL 路由器充当公共互联网的 GW,然后我的 Linux 路由器有两个接口:eth0 指向家庭网络,eth1 指向 DSL 路由器。

家庭网络<----eth0-----> LinuxRouter <------eth1------>DSLrouter -->>>>>

DSL 路由器配置了来自我的 ISP 的 /64 网络前缀(假设它是 2001:0:0:1234::/64)并且 DSL 路由器的 ipv6 全局地址为 2001:0:0:1234::1 . 我已经使用 radvd 设置了 Linux 路由器,以将这个相同的 /64 网络前缀通告给家庭 LAN 的 eth0,并且确实我看到 LAN 上的主机能够自动配置它们的 IP 地址。该广告还将 Linux 路由器列为 ::/0 的默认路由器,并设置了转发,以便将数据包发送到 DSL 路由器。

我遇到的问题是,当 DSL 路由器从 Internet 获取入站数据包时,它会在 eth1 上发送邻居请求数据包,而这些邻居请求没有从 Linux 路由器上的 eth1 -> eth0 传递。我认为这是因为 DSL 路由器认为它直接连接到家庭网络(这是在 99% 的家庭网络中通常情况下没有中间有 Linux 路由器的情况)。

在花了 2 天的时间试图弄清楚之后,到目前为止,我还没有得到答案。我希望有某种方法可以使用 radvd 将路由器广告发送到 DSL 路由器,以告诉它通过 Linux 路由器路由 /64 前缀的所有数据包。目前,Linux 路由器发送的路由器广告配置了 /64 前缀,该前缀将发送至 DSL 路由器,其中:

interface eth1
{
    AdvSendAdvert on;
    MinRtrAdvInterval 3;
    MaxRtrAdvInterval 10;
    route 2001:0:0:1234::/64 {
    };

};
Run Code Online (Sandbox Code Playgroud)

我认为这应该足以让 DSL 路由器将所有数据包转发到网络,但我仍然看到邻居请求。

我看到 DSL 路由器具有 IP 直通设置,能够设置“默认服务器”,但这些似乎仅适用于 IPv4。假设 DSL 路由器不支持我的 RA,我想我可以在 Linux 路由器上使用“xorb”设置 ipv6 多播转发,但想知道是否还有其他选项。

use*_*686 6

我遇到的问题是,当 DSL 路由器从 Internet 获取入站数据包时,它会在 eth1 上发送邻居请求数据包,而这些邻居请求没有从 Linux 路由器上的 eth1 -> eth0 传递。

这是正常的。邻居请求就像 ARP 查询一样工作——它们将 IP 地址转换为 MAC 地址,因此它们只在同一个广播域内有意义。路由器转发它们是没有意义的。

(尽管在某些情况下,路由器可以代理它们,如最后所述,但是...将其留给计划 C。)

我认为这是因为 DSL 路由器认为它直接连接到家庭网络(这是在 99% 的家庭网络中通常情况下没有中间有 Linux 路由器的情况)。

是的,你从来没有告诉过它。

因此,您目前的情况是两个不同的网络正在使用相同的IP 子网,并且您希望 Linux 路由器充当网桥……这几乎与路由器完全相反。

(如果令人困惑的部分是 IPv6,请考虑 IPv4 术语中的整个设置,因为两者的路由或多或少相同,而 ND 大部分相当于 ARP。因此,如果您不使用相同的 192.168.1.0 子网v4...)


您最好的做法是获取第二个/64,并将用于 Linux 路由器的 eth1 网络。(如果 DSL 路由器通过 DHCPv6-PD 获得其前缀,则可能会诱使它请求第二个。)但不同之处在于第二个 /64 不会直接在接口上使用,而是路由到Linux 路由器的地址。

例如:

  • DSL 路由器在 WAN 接口上有 2001:db8:0:0:a:b:c:d。
  • DSL路由器从ISP处获取2001:db8:10:0::/64,在LAN接口上自分配2001:db8:10:0::1/64,并为其发送Router Advertisements。
  • Linux 路由器基于 RA 在 eth1 上自动配置 2001:db8:10:0:x:y:z:t。
  • Linux 路由器从 ISP(以某种方式)获取 2001:db8:10:1::/64,在 eth0 接口上自分配 2001:db8:10:1::1/64,然后 radvd 为此发送路由器广告——不是对于第一个子网。
  • DSL 路由器需要像“2001:db8:10:1::/64 via 2001:db8:10:0:x:y:z:t”这样的路由,以便第二个子网的所有流量都转发到 Linux 路由器.

(为不太清楚的例子道歉。)

有时 ISP 将整个 /60 甚至 /56 委派给您,并将其全部路由到 DSL 路由器。在这种情况下,您可以在没有任何 DHCPV6-PD 魔法的情况下设置第二个子网。真的,虽然我无法在这里提供一个好的“通用”答案,因为它既依赖于 ISP 又依赖于 CPE。


如果无法获得第二个 /64 前缀,其他可能的选择是:

  • 将 Linux 系统变成一个纯粹的桥梁,没有任何路由功能。

  • 使用其他来源获取额外的 /64,例如隧道提供者(或 6to4)。现有的隧道服务将比下面描述的黑客更可靠地工作(除了一些额外的延迟)。

  • 使 DSL 路由器只获取 /64 而不是为 LAN 配置它。(取决于路由器的灵活程度。)相反,再次通过 Linux 系统的 eth0 链路本地地址为该 /64 设置路由,同样通过 DSL 路由器的 ::/0 在 Linux 系统上设置路由LAN 链路本地地址。因此,/64 将仅用于第二个子网,而第一个子网根本没有任何公共前缀。

  • 继续您当前的设置,但安装“ndppd”以执行邻居发现代理。(不,多播转发不起作用,因为 ND 数据包通常具有链路本地源地址。)小心这一点,它会使事情变得非常混乱。

  • 对第二个 LAN 使用私有 (ULA) 地址,并在 Linux 路由器上启用一对多 NAT(伪装)...在此过程中失去了 IPv6 的大部分用处。(是的,正式的 NAT 在 IPv6 中不存在,但这并没有阻止 Linux netfilter/iptables 放弃并实施它。)